皆様、お世話になっております。鈴木と申します。
今回は実務でインスタンスメタデータの取得方法について躓いたので解説していきます。
目次
- 構成図
- 前提
- 手順
- 通信経路
- 最後に
1.構成図
2.前提
用途として対象サーバーはawspecというテストツールサーバーとして機能します。
awspecはインスタンスメタデータから情報を取得してテストを実施します。
上記構成図の対象サーバーはNATゲートウェイにもVPCエンドポイントにも接続することはできず、かつ通信に関してはすべてProxyサーバーを経由するという要件でした。
そのためEC2(AL2023)のOSの設定では、下記のようにProxyに関して.bashrcなどに変数を登録するようにしておりました。
export http_proxy=http://proxy.example.com:3128/
export https_proxy=http://proxy.example.com:3128/
こうすることで通信はProxyサーバーへ向きますが、インスタンスメタデータの取得はできなくなってしまいます。(理由については後ほど)
下記ではこれを解消する方法とAWSサポート窓口より通信経路について解説をいただいたのでアウトプットしていきます。
3.手順
上記前提で述べたようにProxyサーバーの設定をしてしまうとインスタンスメタデータの取得が出来なくなってしまいます。
それはリンクローカルアドレス向けの通信までProxy経由になってしまうことが原因です。
なのでこれを解消するにはどのようにすればよいか、下記を設定することで解消できます。
export NO_PROXY=169.254.169.254
※補足ですが、大文字小文字どちらでも問題ないですが、重複した場合、基本的に小文字が優先されるようです。
上記を登録することで、EC2はインスタンスメタデータの取得をできるようになります。
4.通信経路
ここで1つの疑問が生じると思います。
「no_proxyの設定をしたら通信がパブリックネットワークを経由してしまうのでは?」
と、私も考えておりサポートに問い合わせをすると経路は下記のようになっているとのことです。
リンクローカルアドレス(169.254.0.0/16)へアクセスすると、XenハイパーバイザまたはNitroコントローラーのどちらかと通信し、情報を取得する。リンクローカルアドレスはルーティング不可のIPアドレスであり、EC2はリンクローカルアドレス空間のアドレスを使用して、EC2からのみアクセスできるサービスを提供する。
つまりAWS環境内のプライベートな通信経路でメタデータの取得ができるため、169.254.169.254をProxyを経由しないように設定してもVPCエンドポイントやNATゲートウェイなどの通信を経由することなくメタデータの取得ができると判明しました。
もちろんですがセキュリティグループ等の穴あけも不要となります。
※ほかのEC2のインスタンスメタデータの取得をするのであればViewOnlyAccessなどのポリシーを付与したIAMロールは必要です。
5.最後に
セキュリティ要件の厳しいところであればなくはない事例かと思います。
公式ドキュメント等に情報がない場合はサポート窓口をうまく利用するのが良いと思います。