EC2インスタンスタグがメタデータサービスで利用可能になったので試してみた

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

インスタンスタグが Amazon EC2 インスタンスメタデータサービスで利用可能になったのでどのような場面で利用できそうか確認してみました。

インスタンスタグが Amazon EC2 インスタンスメタデータサービスで利用可能に
https://aws.amazon.com/jp/about-aws/whats-new/2022/01/instance-tags-amazon-ec2-instance-metadata-service/

目次

記事の概要

これまで、EC2からインスタンスメタデータ、タグ情報の取得にはdescribe-**のAPIをCLI/API経由で呼び出す必要がありましたが
2022年1月にリリースされた新機能にて、インスタンスメタデータのタグを有効化する事でインスタンスメタデータサービス (http://169.254.169.254…)から取得可能になりました。

こちらの機能を利用してコンテナの環境変数のような形でEC2サーバ内の制御が行えるのでは?という観点で試してみました。
所感としては、IAMロール等も不要のため手軽に利用できて便利だが、編集・項目追加した場合反映がすぐに行われる訳ではないため、利用場面を選ぶ必要があると感じました。

試した事

EC2設定変更

インスタンス新規作成時の場合

高度な設定 → Allow Tags in Metadata を有効にします。
注意点に後述していますが、メタデータのバージョンがV1を許可する設定になっていると、TrustedAdvisor等で指摘事項となりますので、このあたりは要件に応じて要調整です。

既存インスタンスの場合

EC2コンソールにて、インスタンスの設定 → インスタンスメタデータのタグを許可する で許可にチェックを入れて保存
注意点に後述していますが、本設定後インスタンスの停止・起動を実施しないとタグ値の取得が行なえませんでした。

値の取得

公式ドキュメント インスタンスメタデータの取得
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html

公式ドキュメントにたくさん記載されているので、下記予約語のName (インスタンスName) の取得例となります。

IMDSv1で取得

$ curl http://169.254.169.254/latest/meta-data/tags/instance
ExecuteBatch (こちらは試しに追加したタグです)
Name

$ curl http://169.254.169.254/latest/meta-data/tags/instance/Name
MetadataAccessTestIMDSv1

IMDSv2で取得

$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/tags/instance
ExecuteBatch (こちらは試しに追加したタグです)
Name

$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/tags/instance/Name
MetadataAccessTestIMDSv2

IMDSv1が許可されていないと、下記レスポンスが返却されます。

$ curl http://169.254.169.254/
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>401 - Unauthorized</title>
 </head>
 <body>
  <h1>401 - Unauthorized</h1>
 </body>
</html>

注意点

既存インスタンスの設定変更で即座にタグ値を取得出来るわけではない

インスタンスメタデータのタグを許可する で許可にチェックを入れて保存すると tags/ というエントリがすぐに表示されるようになるが中身は空となる場合
インスタンスの再起動を実施しても中身は表示さず、インスタンスの停止・起動が必要でした。

$ curl http://169.254.169.254/latest/meta-data/
...
tags/
$ curl http://169.254.169.254/latest/meta-data/tags/
$

項目値の編集・項目追加等の反映について

上記同様となります。
メタデータに関して編集・項目追加をした場合、サーバの再起動 もしくは 停止/起動が必要とのことでした。

タグキーに設定出来る文字列/文字種制限があります

You can’t use spaces, /, or the reserved names ., .., or _index.
The instance name is a tag with the reserved key of Name. Its value must adhere to these restrictions.

メタデータバージョンがデフォルト設定値(V1およびV2を)だとTrustedAdvisorで指摘されます

まとめ

EC2にIAMロール付与をせず、手軽に値の参照を行えるという点で利便性の高さを感じました。
冒頭の機能紹介サマリリンク先に記載のある、APIトランザクション制限回避という観点でも。

ただし、下記タグ値の追加・更新等のタイミングが明確ではない事と、即時反映のためには再起動等が必要なため、稼働中サーバに対しての設定変更・挙動変更のために利用する事は難しいと感じました。
コンテナの環境変数のような形で利用したいのであれば、IAMロール・通信経路が必要ですが、素直にParametorStore+Caching等を検討かなと。

タグ値の追加・更新等については反映されるのが明確にいつという記述は見つけられず、冒頭の機能紹介サマリリンク先からはある程度の期間で反映されるようにも見受けられましたが未検証です。

起動時にインスタンスメタデータでタグを有効化すると、起動時にインスタンスメタデータに対してインスタンスタグが発行されます。起動後のタグの変更は、最終的にインスタンスメタデータに反映されます。

投稿者プロフィール

takashi
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。
個人ブログではRaspberryPiを利用したシステムやロボット作成も
実施しております。

スカイアーチネットワークスで一緒に働きましょう!

ABOUTこの記事をかいた人

開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て 2010年よりスカイアーチネットワークスに在籍しております 機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。 個人ブログではRaspberryPiを利用したシステムやロボット作成も 実施しております。 スカイアーチネットワークスで一緒に働きましょう!