⚙️
オートスケーリングで起動したEC2インスタンスのAZをタグ付けする
EC2インスタンスを起動したAZの情報をタグで管理したいと思ったことはありませんか?
インスタンスを手動で起動する場合は指定したAZの情報を手動でタグに設定すれば良いですが、マルチAZのオートスケーリング構成をとっている場合はどのAZで起動するか分からない場合があります。
そこで、今回はオートスケーリング構成におけるEC2インスタンスへのAZ情報のタグ付けをユーザーデータを使用して実装したいと思います。
前提条件
- 起動テンプレートで指定しているAMIのインスタンスにAWSCLIがインストールされていること
- EC2に設定するIAMロールで
ec2:CreateTags
が許可されていること - EC2インスタンスからEC2サービスのエンドポイントへの通信が可能であること
- インターネットへ経路 or PrivateLink(VPCエンドポイント)があればOK
起動テンプレートに設定するユーザーデータ
ユーザーデータ
#!/bin/bash
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
INSTANCE_ID=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/instance-id)
REGION=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//')
AZ_ID=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/placement/availavility-zone-id | tail -c 3)
aws ec2 create-tags --region ${REGION} --resources ${INSTANCE_ID} --tags Key=AZID,Value=${AZ_ID}
起動直後
ユーザーデータの実行後
やっていること
EC2インスタンスのメタデータを使用して、インスタンスID、リージョン、AZIDを取得します。
その後、AWSCLIのコマンドを使用してEC2インスタンスに対してタグ付けを行います。
この方法を使用すれば、EC2インスタンスの起動時にインスタンスメタデータから取得できる情報は何でもタグ付けすることが可能です。
補足
AZIDに設定する値はアベイラビリティーゾーン名ではなく、その名の通りアベイラビリティーゾーンIDを取得します。
また、取得したアベイラビリティーゾーンIDの下3桁の文字列のみを使用します。
ex) apne1-az1
なら az1
なぜAZ名ではなくAZIDを利用するかですが、
AZ名はAWSアカウントによって異なりますが、AZIDはどのAWSアカウントでも同じためです。
リージョンの取得は以下の記事を参考にし、AZ名からリージョンを取得しています。
Discussion