Amazon EC2メタデータサービスでインスタンスのタグを取得できるようになりました

2022.01.11

ども、ゲストブロガーのNTT東日本 大瀧です。

先週、EC2メタデータサービスでインスタンスのタグを取得できるようになりました。これまでインスタンスに紐づくタグをインスタンス自身で取得するためには、IAMロールを設定しEC2 APIを呼ぶ必要がありました。本リリースによって、IAMロールの設定が不要でシンプルなHTTPリクエストによってタグを取得できるようになります。本ブログではその様子をご紹介します。

メタデータサービスのAPI

インスタンスのタグを取得するメタデータのAPIは以下のドキュメントにある通り、 GET /latest/meta-data/tags/instance でタグのリスト、 GET /latest/meta-data/tags/instance/タグ名 でタグの値が取得できます。

IMDSv1、IMDSv2両方に対応するので、可能であればよりセキュアなIMDSv2での利用を検討しましょう。また、パスにはインスタンスIDなどが含まれないことから、メタデータサービスにアクセスする自インスタンスのタグのみ取得できる様子がわかります。タグでフィルタしてインスタンスの一覧を取得する使い方には利用できません。また、パス名には instance/ という階層があるので、インスタンスタグ以外のタグ情報が取得できるようになる余地が垣間見えますね。

手順

メタデータサービスで上記API(インスタンスタグの取得)にアクセスするためには、インスタンスの通常のメタデータサービス有効化に加えてタグのメタデータを有効にする手順が必要です。インスタンスの作成ウィザードでは、[高度な詳細] - [Allow tags in metadata]を有効にします(じきに日本語のラベルに置き換わるでしょう)。

これでOKです。試しに、以下のようにタグを設定したAmazon Linux 2 AMIのインスタンスでメタデータにアクセスしてみます。

$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
# メタデータサービスのHTTPレスポンスの末尾には改行が含まれないため、実際の実行結果は改行なしでプロンプトが表示されます
$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/tags/instance/
Name
Role
$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/tags/instance/Name
metadata-test
$

タグの値を取得することができました!

インスタンスタグ更新の制約

EC2インスタンスは、インスタンスタイプによってNitro Systemベースのものとそうでないものがあります(どのタイプなのかは、ドキュメントを参照してください)。Nitro Systemベースのインスタンスタイプでは、インスタンスタグの追加や削除が即時反映される一方、それ以外のインスタンスタイプの場合はインスタンスの再起動ないし停止→起動操作が必要です。↓のドキュメントの3段落目に本制約の記述があります。

おまけ : ec2-metadataコマンド

Amazon Linux AMIには、EC2に関する便利なユーティリティーコマンドとして ec2-utils がインストールされています。その中に ec2-metadata という、メタデータを簡単に取得するユーティリティがあり、タグをサポートするPull Requestを作成しました。

これがマージされるかどうかはわかりませんが、追って ec2-metadata コマンドでもタグが取れると便利ですね。こんな感じで動くプルリクになってます。

$ ec2-metadata-beta --tags
tags:
         Name: metadata-test
         Role: web
$

まとめ

EC2メタデータサービスでインスタンスのタグを取得する様子を紹介しました。実はAmazon ECS(Elastic Container Service)ではタスクとインスタンスともに前からメタデータサービスでタグが取れるのですが、より歴史のあるEC2のメタデータサービスでも改良が施されるのは良いことですね。

リリース直後に公開された青柳さんによる記事には、CLIとWindowsのコンピュータ名にタグを設定する応用例もありますのでこちらもどうぞ!

参考URL