TRY AND ERROR

気になったこと、勉強したこと、その他雑記など色々メモしていきます。。Sometimes these posts will be written in English.,

Python-boto3でAWSのEC2インスタンスを立ち上げ、そのPublicIPを取得する


boto3とawscliを入れておく

$pip install boto3
$pip install awscli

AWSのCredentialsなどをセットする

$ aws configure
AWS Access Key ID [None]: アクセスキー
AWS Secret Access Key [None]: アクセスキーシークレット
Default region name [None]: regionコード
Default output format [None]: json


homeの.awsに設定情報が格納される。boto3ではこれを読んで認証するので、毎回Credentialsをセットする必要はない。

~/.aws/config
~/.aws/credentials

ここからが本題です。
実際にboto3を使ってEC2インスタンスを立ち上げ、立ち上げたインスタンスのPublicIPを取得してみる。

import boto3

ec2 = boto3.resource('ec2')


# Terminateしたときにボリュームも一緒に消したい場合、その設定などをかく
blockDeviceMappings = [{
    "DeviceName": "/dev/sda1",
    "Ebs": {
        "DeleteOnTermination": True,
        "VolumeType": "gp2"
    },
}]

# インスタンス生成
ret = ec2.create_instances(
                            ImageId="イメージID",
                            MinCount=1,
                            MaxCount=1,
                            InstanceType="インスタンスの種類(t2.microなど)",
                            KeyName="キーペアの名前",
                            SecurityGroupIds=["セキュリティグループID"],
                            BlockDeviceMappings=blockDeviceMappings
                            )

# 生成したインスタンスIDを取得
createdInstanceId = ret[0].instance_id
createdInstance = ec2.Instance(createdInstanceId)
pprint(createdInstance.public_ip_address) # None....

インスタンス生成後すぐにはPublicIPなどは取得できないので、running状態になるまで待つ。

# インスタンス生成
ret = ec2.create_instances(
                            ImageId="イメージID",
                            MinCount=1,
                            MaxCount=1,
                            InstanceType="インスタンスの種類(t2.microなど)",
                            KeyName="キーペアの名前",
                            SecurityGroupIds=["セキュリティグループID"],
                            BlockDeviceMappings=blockDeviceMappings
                            )

# 生成したインスタンスIDを取得
createdInstanceId = ret[0].instance_id

# PublicIPを取得するため、EC2インスタンスがrunning状態になるまで待つ
ret[0].wait_until_running()

# waitingをかけた後に再度インスタンスを取得
createdInstance = ec2.Instance(createdInstanceId)

# ここでPublicIPがとれる。
pprint(createdInstance.public_ip_address)

wait_until_runningでrunningになるまで待つことで、PublicIPが取得できました。



boto3を使ったEC2用のプロトタイプみたいなものを作ったので、よかったら参考にどうぞ。
github.com