AWS CLIでプロキシサーバを使う場合の注意

アイキャッチ AWS EC2

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

はじめに

こんにちは。
くコ:彡がトレードマークの阿部です。

プロキシサーバがある環境でAWS CLIを使った所、嵌ったので共有します。

プロキシサーバの指定

AWS CLIではプロキシサーバを利用する事が可能です。
環境変数 HTTP_PROXYHTTPS_PROXYにプロキシサーバのIPアドレスとポート番号を指定します。

$ export HTTP_PROXY=http://xxx.xxx.xxx.xxx:xxxxx
$ export HTTPS_PROXY=http://xxx.xxx.xxx.xxx:xxxx

ここで嵌った

プロキシサーバとIAMロールを利用する場合、注意が必要です。
環境変数を設定しIAMロールを利用している環境で、aws ec2 describe-instancesコマンドを実行してみます。
EC2インスタンスの一覧が表示される事を期待しますが、クレデンシャルが読み込めない旨のエラーメッセージが表示されます。

$ aws ec2 describe-instances
Unable to locate credentials. You can configure credentials by running "aws configure".

プロキシの除外設定を追加し、aws ec2 describe-instancesコマンドを実行すると、インスタンス一覧が表示されます。

$ export NO_PROXY=169.254.169.254
$ aws ec2 describe-instances
  ( 略 )

なぜ、除外設定が必要?

除外した169.254.169.254はインスタンスメタデータへのアクセスに利用されます。
インスタンスメタデータには、そのインスタンス自体内からのみアクセス出来ます。

利用出来るデータは、こちらにまとめられています。
試しにAMI IDを表示してみましょう。
curlコマンドでami-idを指定すると、そのインスタンスのAMI IDが表示されます。

$ curl http://169.254.169.254/latest/meta-data/ami-id
ami-0a1b3c4d

IAMロールを利用する場合、AWS CLIはインスタンスメタデータiam/security-credentials/role-nameを利用します。
メタデータには以下のような、一時的なセキュリティ認証情報が格納されます。

{
  "Code" : "Success",
  "LastUpdated" : "20XX-XX-XXTxx:xx:xxZ",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "AKIAEGRGCCMEXAMPLE",
  "SecretAccessKey" : "afeiu8Gb2Ynse/L9WNIWEG/mvIPoiCMEXAMPLEKEY",
  "Token" : "token",
  "Expiration" : "20YY-YY-YYTyy:yy:yyZ"
}

プロキシサーバを経由するとメタデータに格納された認証情報にアクセスできないため、クレデンシャルエラーが出たという事がわかりました。
同じ事象が起きた場合は、NO_PROXYを設定してみて下さい。

参考

以下を参考にしました。

AWS Command Line Interface User Guide

Amazon Elastic Compute Cloud Linux インスタンス用ユーザーガイド

おわりに

AWS CLIとプロキシサーバを利用する場合の注意点について、まとめました。
クレデンシャルエラーが出た場合、この記事を思い出して頂けると嬉しいです。