-
Notifications
You must be signed in to change notification settings - Fork 4
IAMRoleのトークンによるS3アクセス時のトークンの期限切れについて
mechamogera edited this page Feb 7, 2013
·
9 revisions
- この問題は最新のgemでは解決されているっぽいです(動作は未確認)。
- AmazonLinuxのyumではいるaws-sdkの1.8.0ではまだ発生
- fix expired_credentials? expired token error code name for SQS by xli · Pull Request #108 · aws/aws-sdk-rubyで対応されたっぽい
- => エラーコードにExpiredTokenが返ってきたらrefreshされるようになった(今まではExpiredTokenExceptionの場合のみ)
- => 実験したところS3からはExpiredTokenが返ってきてた
- EC2インスタンス上でIAM Roleを設定して、以下のようにrubyとaws-sdkを利用してアクセスする。
s3 = AWS::S3.new(options)
bucket = s3.buckets[bucket]
object = bucket.objects[object_key]
while true
object.read
sleep 60 * 10
end
- そのうち、以下のようなExpiredTokenエラーが発生する
The provided token has expired.
- 本文書はこの現象について調べたことをメモする
- ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
- aws-sdk (1.6.6)
- aws-sdkでは以下の通信でRoleのトークンを取得、保持してs3への通信を行う。
- GET /latest/meta-data/iam/security-credentials/[Role名]
- EC2上で設定されたIAM-RoleのAccessKeyIdとSecretAccessKeyを取得する参照
- このトークンの有効期限をこえると通信に失敗する。
- 以下のスクリプトで確認した。
- IAM roleトークンによるS3アクセスでの期限切れ確認用スクリプト — Gist
- 以下のような通信(Roleのトークン取得 => トークンを用いたS3からのダウンロード)が行われるようである。
- GET /latest/meta-data/iam/security-credentials/
- Role名を取得する
- GET /latest/meta-data/iam/security-credentials/[Role名]
- temporary security credentials情報を取得する
- temporary security credentialsとしてTokenが取得される
- temporary security credentialsのExpirationが取得される
- GET /[s3のダウンロード対象のキー]
- S3からのファイルダウンロード
- X-Amz-Security-Tokenヘッダに2.で取得したTokenの値が使用される
- 以下3.の繰り返し
- ExpiredTokenエラーについて
- 2012/09/29 13:54:24(GMT)にスクリプト開始
- 取得したExpirationは2012-09-29T20:13:30Z
- 開始から30分毎にs3からダウロードし19:54:31まで成功、20:24:30にExpiredTokenでエラーとなり以後ずっとエラー