AWS SDK for Python (Boto3)を使ってAmazon Linuxを起動するPythonスクリプト書いた
サーモン大好き、横山です。
AWS SDK for Python(boto3)を使って、検証用のEC2を立て、1日たったらEC2をTerminateするスクリプトを書きました。 …どこかで見たことのあるタイトルだって思いましたか? 以下の記事を参考にスクリプト書きました。
準備
virtualenvを使いMac上で環境を準備します。 その後、pipのアップデート、boto3のインストールを行います。 以下の環境変数は設定済みということで進めます。
- AWS_DEFAULT_REGION
- AWS_ACCESS_KEY
- AWS_SECRET_KEY
$ mkdir -p ~/virtualenv/boto3 $ cd !:2 $ virtualenv -p /usr/bin/python2.7 venv27 $ . venv27/bin/activate (venv27)$ pip install -U pip (venv27)$ pip install boto3
実装
- lunch_ec2.py
#!/usr/bin/env python # coding: utf-8 import boto3 import re from operator import itemgetter import time import sys ec2_client = boto3.client('ec2') # security group id to be attached to the instance secgroup_id = "sg-xxxxxxxx" # KeyPair name to be used keypair_name = "keypair" # force terminate after minutes(default: 1 day) stop_after = 60 * 24 instance_type = 't2.micro' subnet_id = 'subnet-xxxxxxxx' userdata = """#!/bin/sh # stop after a day echo "shutdown -h now" | at now + {0}minutes """.format(stop_after) resp = ec2_client.describe_images( Owners = [ 'amazon' ], ) re_name = re.compile('amzn-ami-hvm-.*-ebs') image_id = sorted( [ item for item in resp['Images'] if item.get('Name', None) and re_name.search(item['Name']) ] , key=itemgetter(u'CreationDate'))[-1]['ImageId'] resp = ec2_client.run_instances( ImageId=image_id, MinCount=1, MaxCount=1, InstanceType=instance_type, KeyName=keypair_name, UserData=userdata, InstanceInitiatedShutdownBehavior='terminate', NetworkInterfaces=[ { 'Groups': [ secgroup_id ], 'DeviceIndex': 0, 'AssociatePublicIpAddress': True, } ], ) instance_id = resp['Instances'][0]['InstanceId'] print("Launched instance : {0}".format(instance_id)) print("wating for acquiring Public IP Address...") ec2_resource = boto3.resource('ec2') public_ip = None sys.stdout.write('wait') for i in range(1, 60): public_ip = ec2_resource.Instance(instance_id).public_ip_address if public_ip: break sys.stdout.write('.') sys.stdout.flush() time.sleep(5) else: print("\ndon't get public_ip") sys.exit(1) print(""" Got IP Address. You can connect via ' ssh -i ~/.ssh/{0}.pem ec2-user@{1} ' in a few moments.""".format(keypair_name, public_ip))
実行結果
(venv27)$ python lunch_ec2.py Launched instance : i-1509dce7 wating for acquiring Public IP Address... wait.... Got IP Address. You can connect via ' ssh -i ~/.ssh/keypair.pem [email protected] ' in a few moments.
Python3で動くかどうか確認
MacにはPython3が入っていませんので、 brew
を使い、Python3をインストールします。
(venv27)$ deactivate $ brew install python3 $ virtualenv -p /usr/local/bin/python3 venv34 $ . venv34/bin/activate (venv34)$ python -V Python 3.4.3 (venv34)$ pip install -U pip (venv34)$ pip install boto3
実行結果
Python3でも動作しました。
(venv34)$ python lunch_ec2.py python lunch_ec2.py Launched instance : i-d50adf27 wating for acquiring Public IP Address... wait.... Got IP Address. You can connect via ' ssh -i ~/.ssh/keypair.pem [email protected] ' in a few moments.
実行方法を少し改良
このままですと、
- cd ~/virtualenv/boto3 で移動
- . venv/bin/activate で環境の中に入る
- python lunch_ec2.py を実行
- deactivateで環境を抜ける
- (必要であれば、 cd - でさっきまで居たワーキングディレクトリに戻る)
という手順が必要になり、ちっとも楽じゃないのでもうちょいプロセスを楽できるようにしたいと思います。
lunch_ec2.sh を作成
- lunch_ec2.sh
#!/bin/bash working_dir=/Users/yokoyamafumihito/virtualenv/boto3 . ${working_dir}/venv27/bin/activate python ${working_dir}/lunch_ec2.py
実行権限付与
$ pwd /Users/yokoyamafumihito/virtualenv/boto3 $ chmod +x lunch_ec2.sh $ ls -l total 16 -rw-r--r-- 1 yokoyamafumihito staff 1817 7 8 17:49 lunch_ec2.py -rwxr-xr-x 1 yokoyamafumihito staff 139 7 8 18:00 lunch_ec2.sh drwxr-xr-x 7 yokoyamafumihito staff 238 7 8 17:46 venv27 drwxr-xr-x 7 yokoyamafumihito staff 238 7 8 17:53 venv34
${PATH}が通ってる場所にシンボリックリンクを張る
$ cd /usr/local/bin $ sudo ln -s ~/virtualenv/boto3/lunch_ec2.sh lunch_ec2
${PATH}が通っていれば、 ~/bin/にディレクトリ作って、そこにシンボリックリンク通したりするのもいいかもしれません。
実行結果
lunch_ec2 を実行すればインスタンスが作れる様になりました。
$ lunch_ec2 Launched instance : i-4134e1b3 wating for acquiring Public IP Address... wait.... Got IP Address. You can connect via ' ssh -i ~/.ssh/keypair.pem [email protected] ' in a few moments.
まとめ
元記事より若干引数増えたりしていますが、ほぼ写経するように書き変える事が出来ました。 使い勝手が本当に良いので、PythonとAWSを触っている方にはboto3はオススメです。