⚙️

オートスケーリングで起動したEC2インスタンスのAZをタグ付けする

2024/03/11に公開

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アカウントでも同じためです。
https://docs.aws.amazon.com/ja_jp/ram/latest/userguide/working-with-az-ids.html

リージョンの取得は以下の記事を参考にし、AZ名からリージョンを取得しています。
https://dev.classmethod.jp/articles/ec2-retrieve-region-from-metadata/

Discussion