AWS SDK for Python (Boto3)を使ってAmazon Linuxを起動するPythonスクリプト書いた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

サーモン大好き、横山です。

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 ec2-user@52.69.185.203

' 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 ec2-user@52.69.181.37

' 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 ec2-user@52.69.171.66

' in a few moments.

まとめ

元記事より若干引数増えたりしていますが、ほぼ写経するように書き変える事が出来ました。 使い勝手が本当に良いので、PythonとAWSを触っている方にはboto3はオススメです。