AWSのUsing Temporary Security Credentialsがうまくいかない

AWSのUsing Temporary Security Credentialsがうまくいかないメモ。



AWS Security Credentialsとは


AWSに関する様々な操作を行う時に必要な認証情報。Security Credentials(以下、SC)があれば、EC2インスタンス内からコマンド経由でインスタンスを作ったりすることが出来る。


一番セキュアにSCを取得する方法は、IAM Roleを付与したインスタンスからSCを取得する方法。のはずが、何故かうまくいかない…。いつか解決するかもなので、とりあえず途中経過だけメモしておく。



IAM Roleを作成する


IAM Roleを作成することで、インスタンスメタデータからSCを取得することができるようになる。さらにこのSCは自動的に循環させられるので、永久に使えるSCよりは安全なものになる。


IAMのRoleから、


Create New Role


Role Type

AWS Service Roles > Amazon EC2


Set Permissions

Select Policy Template > Power User Access


という項目を順次選ぶだけでIAM Roleを作成できる。Policy Documentはいじる必要がない。


IAM Roleを作ったら、そのRoleを適用したEC2インスタンスを作成しておいてください。EC2インスタンス作成ウイザードにRoleの選択画面があるので、そこで今回作成したRoleを選んでおいてください。



Security Credentialsをインスタンスメタデータから取得する


新規に作成したRoleを正しくEC2インスタンスに割り当てていれば、後はGETコマンドで特定のIPアドレスにアクセスするだけで、SCが取得できる。


GET http://169.254.169.254/latest/meta-data/iam/security-credentials/[ROLE_NAME]

# 結果
{
  "Code" : "Success",
  "LastUpdated" : "2013-12-30T12:22:37Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "ACCESS_KEY_ID",
  "SecretAccessKey" : "SECRET_ACCESS_KEY",
  "Token" : "TOKEN",
  "Expiration" : "2013-12-30T18:46:17Z"
}

jqコマンド(sudo yum install -y jqでインストール)があれば、返ってきたJSONから特定の部分のみを簡単に抜き出すことができる。


GET http://169.254.169.254/latest/meta-data/iam/security-credentials/[ROLE_NAME] | jq .
GET http://169.254.169.254/latest/meta-data/iam/security-credentials/[ROLE_NAME] | jq '.SecretAccessKey,.AccessKeyId'


コマンドでEC2インスタンスを操作する


EC2インスタンスをコマンドから操作するためには、下記の2つの環境変数をセットしておく必要がある。IAM Roleを正しく設定できていれば、下記のコマンドを実行するだけで大丈夫。


# Security Credentialsのセット
export AWS_ACCESS_KEY="`GET http://169.254.169.254/latest/meta-data/iam/security-credentials/[ROLE_NAME] | jq -r '.AccessKeyId'`"
export AWS_SECRET_KEY="`GET http://169.254.169.254/latest/meta-data/iam/security-credentials/[ROLE_NAME] | jq -r '.SecretAccessKey'`"

# Security Credentialsの確認
echo $AWS_ACCESS_KEY && echo $AWS_SECRET_KEY

# インスタンス一覧の表示(東京リージョン)
ec2-describe-instances --region ap-northeast-1

本当はこれでインスタンスの情報が表示されるはずなんだけど、下記のようなエラーが表示されて失敗する…。


Client.AuthFailure: AWS was not able to validate the provided access credentials


参考リンク


Setting Up the Amazon EC2 Command Line Interface Tools on Linux/UNIX

ec2-describe-instances

Amazon EC2 の IAM ロール

インスタンスメタデータとユーザーデータ


著者プロフィール
Webサイトをいくつか作っています。
著者プロフィール