渡辺です。
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年入社 / 地味な内容を丁寧に書きたい