web-dev-qa-db-ja.com

Boto EC2:タグ付きのインスタンスを作成する

Boto python APIを使用して、インスタンスの作成時にタグを指定する方法はありますか?インスタンスを作成してフェッチし、タグを追加する必要がないようにしています。次のコマンドを実行するときに、インスタンスに特定のタグを設定するか、タグを指定するように設定します。

ec2server.create_instance(
        ec2_conn, AMI_name, security_group, instance_type_name, key_pair_name, user_data
    )
21
stevebot

この回答は、書かれた時点では正確でしたが、現在は古くなっています。 AWS APIとライブラリ(boto3など)は、「create_instances」呼び出しの実行時にタグを指定できる「TagSpecification」パラメーターを受け取ることができるようになりました。


インスタンスが作成されるまで、タグは作成できません。関数の名前はcreate_instanceですが、実際に実行しているのは予約とインスタンス化です。次に、そのインスタンスを起動する場合と起動しない場合があります。 (通常はそうですが、時々...)

そのため、起動するまでタグを追加できません。そして、それをポーリングせずに起動されたかどうかを判断する方法はありません。そのようです:

reservation = conn.run_instances( ... )

# NOTE: this isn't ideal, and assumes you're reserving one instance. Use a for loop, ideally.
instance = reservation.instances[0]

# Check up on its status every so often
status = instance.update()
while status == 'pending':
    time.sleep(10)
    status = instance.update()

if status == 'running':
    instance.add_tag("Name","{{INSERT NAME}}")
else:
    print('Instance status: ' + status)
    return None

# Now that the status is running, it's not yet launched. The only way to tell if it's fully up is to try to SSH in.
if status == "running":
    retry = True
    while retry:
        try:
            # SSH into the box here. I personally use fabric
            retry = False
        except:
            time.sleep(10)

# If we've reached this point, the instance is up and running, and we can SSH and do as we will with it. Or, there never was an instance to begin with.
24
Craig Ferguson

作成時にインスタンスまたはボリュームにタグを付けることができます

run_instances docs から:

起動中、起動後、またはその両方で、インスタンスとEBSボリュームにタグを付けることができます。詳細については、 CreateTags および Amazon EC2リソースのタグ付け を参照してください。

タグの使用 AWSドキュメントには、タグ付けをサポートするリソースと作成時のタグ付けをサポートするリソースを含むテーブルが含まれています(2017年5月1日の時点で、インスタンスとEBSボリュームの両方がサポートされています)。

Python(他のSDKリファレンスは このページ にリストされています)の作成時にインスタンスにタグを付けるコードスニペットは次のとおりです:

from pkg_resources import parse_version
import boto3
assert parse_version(boto3.__version__) >= parse_version('1.4.4'), \
    "Older version of boto3 installed {} which doesn't support instance tagging on creation. Update with command 'pip install -U boto3>=1.4.4'".format(boto3.__version__)
import botocore
assert parse_version(botocore.__version__) >= parse_version('1.5.63'), \
   "Older version of botocore installed {} which doesn't support instance tagging on creation. Update with command 'pip install -U botocore>=1.5.63'".format(botocore.__version__)
ec2 = boto3.resource('ec2')
tag_purpose_test = {"Key": "Purpose", "Value": "Test"}
instance = ec2.create_instances(
    ImageId=EC2_IMAGE_ID,
    MinCount=1,
    MaxCount=1,
    InstanceType=EC2_INSTANCE_TYPE,
    KeyName=EC2_KEY_NAME,
    SecurityGroupIds=[EC2_DEFAULT_SEC_GROUP],
    SubnetId=EC2_SUBNET_ID,
    TagSpecifications=[{'ResourceType': 'instance',
                        'Tags': [tag_purpose_test]}])[0]

使った

Python 2.7.13
boto3 (1.4.4)
botocore (1.5.63)
8
Dmitry Tokarev

Boto 2.9.6を使用して、run_instancesから応答を受け取った直後にインスタンスにタグを追加できます。このようなものは睡眠なしで機能します:

reservation = my_connection.run_instances(...)
for instance in reservation.instances:
    instance.add_tag('Name', <whatever>)

タグを正常に追加した後、インスタンスがまだ保留状態であることを確認しました。このロジックを、元の投稿で要求されたものと同様の関数でラップするのは簡単です。

3
bobchase

この方法は私にとってうまくいきました:

rsvn = image.run(
  ... standard options ...
)

sleep(1)

for instance in rsvn.instances:
   instance.add_tag('<tag name>', <tag value>)
0
Zack Bloom