EBSにタグをつけるスクリプトを作った

記事タイトルとURLをコピーする

渡辺です。
EBSボリュームにタグをつけるスクリプトを作成しました。

仕様

  • コマンドライン引数にEC2のインスタンスIDを取る(複数可)
  • EC2インスタンスのタグをそのままアタッチされているEBSボリュームにつける
  • EBSボリュームが複数ある時は全てのEBSボリュームにつける

作成した理由

大量のEC2インスタンスに大量のタグをつける案件に遭遇してしまいました。。。
しかも、EBSにもつける必要があります。

サーバーワークスの構築はCloudFormationが主流です。
しかし、残念ながらCloudFormationはEBSのタグには対応していないようです。

自動的に作成されたタグを含むすべてのスタックレベルのタグは、AWS CloudFormation がサポートするリソースに反映されます。現在のところ、タグはブロックデバイスマッピングから作成された Amazon EBS ボリュームには反映されません。
AWS CloudFormation Resource Tags タイプ

ちょっと聞いた感じ、クリックだけで乗り切るには危険な量でした。

スクリプト

import boto3
import sys
import re

def main(argv):
    ec2 = boto3.resource('ec2')
    for instanceid in argv:
         volumes = []
         instance = ec2.Instance(instanceid)
         tags = dict([(tag['Key'], tag['Value']) for tag in instance.tags])
         for tag in list(tags):
             if re.match('aws:',tag):
                  tags.pop(tag)

         for device in instance.block_device_mappings:
             volumeid = device['Ebs']['VolumeId']
             volumes.append(ec2.Volume(volumeid))

         for volume in volumes:
             for key, value in tags.items():
                  volume.create_tags(
                      Tags=[
                          {
                              'Key': key,
                              'Value': value
                          },
                      ]
                  )
if __name__ == "__main__":
    main(sys.argv[1:])

[追記]
少し修正しました。CloudFormationで作成したEC2インスタンスには自動でaws:というタグがつきます。
これをそのままEBSにタグ付けしようとすると、エラーになります。
予約語のaws:を除外するように修正しました。

キーにも値にも aws: プレフィックスは使用しないでください。これは AWS 用に予約されています。このプレフィックスが含まれるタグのキーや値を編集したり削除することはできません。このプレフィックスを持つタグは、リソースあたりのタグ数の制限時には計算されません。
タグの制限

使い方

EC2のインスタンスIDを引数にとってスパッと実行してください。

python create_tags_ebs.py i-xxxxxxxxxxxxxxxxx i-yyyyyyyyyyyyyyyyyyy i-zzzzzzzzzzzzzzzzzz

渡辺 信秀(記事一覧)

2017年入社。趣味は言語学習。