EC2スポットリクエストによって起動されたEC2インスタンスにどのようにタグを付けて名前を付けますか?


8

価格が適切なときにEC2インスタンスを起動するEC2スポットリクエストがいくつかあります。私は、結果のインスタンスがでタグ付けを取得したいNameRole私の構成管理ツールは、それがあるマシンのどのタイプを知っているので、タグ。

更新

Hyper Anthonyのアドバイスを取り入れて実装しました-ポーリングはエラーが発生しやすく、リソースを大量に消費するため、インスタンスの起動時にタグを更新する起動スクリプトをAMIに追加しました。

使用しているAMIにBotoがインストールされていることを確認します

pip install boto

EC2インスタンスにIAMロールを割り当てる

起動するインスタンスには、スポットリクエストに関する情報にアクセスするための何らかの方法が必要です。IAMロールを使用するか、インスタンスでアクセスキーを使用できるようにします。使用したIAMロールにアタッチしたポリシーは次のとおりです。

{
    "Statement": [
        {
            "Action": [
                "ec2:CreateTags",
                "ec2:DescribeTags",
                "ec2:DescribeInstances"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ],
            "Sid": "Stmt1432737176000"
        }
    ],
    "Version": "2012-10-17"
}

起動時にスクリプトを実行してタグを更新する

def get_tags_from_spot_request():

    instance_id = boto.utils.get_instance_identity()['document']['instanceId']
    region = boto.utils.get_instance_identity()['document']['region']
    conn = boto.ec2.connect_to_region(region)
    inst = boto.ec2.instance.Instance(connection=conn)
    inst.id = instance_id
    inst.update()
    spot_id = inst.spot_instance_request_id
    tags = conn.get_all_tags(filters={'resource-type': 'spot-instances-request', 'resource-id': spot_id})
    for tag in tags:
        inst.add_tag(tag.name, tag.value)

回答:


10

スポットインスタンスリクエストはEC2リソースの一種です。AWSドキュメントには、このタイプのリソースにタグを付けることができると記載されていますが、結果のタグは実際のインスタンスには引き継がれません。

スポットインスタンスリクエスト用に作成したタグは、リクエストにのみ適用されます。これらのタグは、スポットサービスがリクエストを満たすために起動するスポットインスタンスに自動的に追加されません。スポットインスタンスリクエストを作成するとき、またはスポットインスタンスが起動された後で、自分でスポットインスタンスにタグを追加する必要があります。

したがって、インスタンスが起動した後にタグを追加する必要があります。ここにはいくつかのオプションがあります:

  • 作成したインスタンスのユーザーデータスクリプト:コマンドラインツールとEC2メタデータサービスを使用するユーザーデータスクリプトを記述して、インスタンスがインスタンスIDを検出し、自身のタグを作成できるようにします。AWS CLIのcreate-tagsを使用して、任意のEC2リソースにタグを付けることができます。または、これを、使用する予定のすべてのOSの起動スクリプトとしてAMIに焼き付けることもできます。どちらの状況でも、インスタンスにはEC2タグを作成するための十分な権限が必要です。
  • スポットリクエストを監視する外部ユーティリティ: AWS SDKの1つを使用してスポットリクエストを監視し、インスタンスが作成されたらインスタンスにタグを付けることができます。AWS の「スポットリクエストとインスタンスにタグを付ける方法」ヘッダーの下に、このトピックに関するチュートリアルがあります。冗長になりすぎず、これは単に、作成されたインスタンスIDが利用可能になるまでDescribe Spot Instance Requestsをポーリングし、次にCreate Tagsを呼び出すだけです。


1

別の可能性は、Ansibleを構成管理ツールとして使用することです。スポットと通常の両方のライフサイクルインスタンスを起動できるec2モジュールでは、「instance_tags」属性を追加してタグを作成できます。簡単なプレイブックは次のようになります。


  - name: Provision Spot Instance
    hosts: localhost
    connection: local
    gather_facts: False
    tasks:
      - name: Launch the new Spot Instance
        local_action:
          module: ec2
          spot_price: 0.02
          group: testSG
          instance_type: m3.medium
          image: ami-12345
          wait: true
          instance_tags:
            Name: TagValueForName
            Foo: TagValueForFoo
          region: us-east-1
          keypair: mykeypair

おもしろいことに、私の不満はインスタンスにタグを付けるだけで、スポットリクエストにはタグを付けないことです。これは問題の反対です。


このansibleスポットリクエストがタイムアウトした場合。スポットリクエストはAWS内に存在しますが、インスタンスが立ち上がった後、ansibleがインスタンスにタグを付けることができなくなった場合はどうなりますか?残りのプレイブックがタグなしインスタンスをどのように処理するかに応じて、「ゾンビ」インスタンスにつながる可能性がありますか?
t1m0 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.