AWSのIMDSv2対応でうっかりハマった話
こんにちは。
ECシステム開発チームのいまづです。
みなさんAWS使われていますか。
なんだかんだAWSのサービスのアップデートやdeprecatedなものへの対応って割と発生しますよね。
今日は、最近EC2環境でのIMDSv2対応を進めていたのですが、ドキュメントをよく読んでいなくてちょっとハマった話です。
IMDSv2がデフォルトになります!
Developers IOのこの記事のリンクが流れてきて、そういえばEC2のメタ情報使っているところは、IMDSv2対応しないとねー(で何をやればいいんだっけ?)ということでissueに積まれました。
(実はこの時点ですでに見落としていました。)
で、何を変更すればよいですか
記事では「EC2インスタンスの設定がどうなっているのか」について書かれていますが、実際にメタ情報を取得している部分をどう変更すればよいのかについては、EC2のドキュメント に書かれています。
(ドキュメントは最後まで読みましょうね…)
要は、これまで単にGETリクエストのレスポンス見るだけだった部分を、
-
PUT http://169.254.169.254/latest/api/token
でトークンを生成する - リクエストヘッダにトークンを含めて
GET http://169.254.169.254/latest/meta-data/*
でメタデータを取得する。
に変更すればよいと。なるほど。
今稼働しているインスタンスでは、メタデータのバージョン設定は「V1 及び V2 (トークンはオプション)」になっているので、V2自体は使えるはず。
実際にインスタンス上で curl
コマンドで試したところ問題なく動きます。
変更自体は簡単ですね。
(ドキュメントは最後まで…)
TOKENを取得するPUTリクエストの応答がない件
実際に実装したものを保守環境にデプロイして動作を確認しておこうと思ったら、トークンの取得の部分でリクエストがタイムアウトしてしまっているようです。
Pythonのrequests
を使ってtimeout=1
の指定をしていたのですが、短すぎてタイムアウトしているとは考えにくい。
なんでだろう?と首をひねっていたら、協力会社の方が「PUTレスポンスにはHOP制限あるってよ」と。
え?
EC2のドキュメント を読み返してみると、確かに最後に書いてあります。
デフォルトで、PUT リクエストに対するレスポンスには IP プロトコルレベルで 1 のレスポンスホップリミット (有効期限) があります。
はー!
確かに件のウェブアプリは、EC2インスタンス上のDocker上で動いています。
Dockerコンテナに入って先に試しのと同様に curl
コマンドで確認すると確かにレスポンスが返ってきません。
よく見直すと、Developes IOの記事の設定例のところに「メタデータレスポンスのホップ制限」項目がありました…。
PUT レスポンスホップリミットを変更する を参考にEC2インスタンスのホップリミットを 2
に変更してみると想定道理に動くようになりました。
起動テンプレートのホップリミット設定を変更して再度デプロイのフローを実行してみると、ちゃんと動いています。
今回は起動テンプレートの変更で済ませてしまっていますが、デプロイフローの中で設定するようにしておいたほうが無難だろうなあと考えているところです。
もう少し目立つように書いておいてほしかった、と思ってしまいますが、「ドキュメントはちゃんと読め」に尽きますね。
しっかり読みましょう!