アソシエイト3冠の渡辺です。
EBSボリュームにタグをつけるスクリプトを作成しました。
仕様
- コマンドライン引数にEC2のインスタンスIDを取る(複数可)
- EC2インスタンスのタグをそのままアタッチされているEBSボリュームにつける
- EBSボリュームが複数ある時は全てのEBSボリュームにつける
作成した理由
大量のEC2インスタンスに大量のタグをつける案件に遭遇してしまいました。。。
しかも、EBSにもつける必要があります。
サーバーワークスの構築はCloudFormationが主流です。
しかし、残念ながらCloudFormationはEBSのタグには対応していないようです。
自動的に作成されたタグを含むすべてのスタックレベルのタグは、AWS CloudFormation がサポートするリソースに反映されます。現在のところ、タグはブロックデバイスマッピングから作成された Amazon EBS ボリュームには反映されません。
AWS CloudFormation Resource Tags タイプ
ちょっと聞いた感じ、クリックだけで乗り切るには危険な量でした。
スクリプト
import boto3 import sys 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 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:])
使い方
EC2のインスタンスIDを引数にとってスパッと実行してください。
python create_tags_ebs.py i-xxxxxxxxxxxxxxxxx i-yyyyyyyyyyyyyyyyyyy i-zzzzzzzzzzzzzzzzzz