GetFederationToken API を使用して一時的な認証情報を生成すると、ポリシー変数 ${aws:userName} が機能しません。
解決方法
GetFederationToken API を使用する場合は、ポリシー変数 ${aws:userName} ではなく、ポリシー変数 ${aws:userID} を使用します。これは、principal がフェデレーションユーザーの場合、変数 ${aws:userName} が存在しないためです。詳細については、ポリシー変数を使用する場所を参照してください。
次の JSON IAM ポリシーは、${aws:userName} ポリシー変数が ${aws:userID} ポリシー変数に置き換えられた例を示しています。
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"AllowListingOfUserFolder",
"Action":[
"s3:ListBucket"
],
"Effect":"Allow",
"Resource":[
"arn:aws:s3:::TESTBUCKET"
],
"Condition":{
"StringLike":{
"s3:prefix":[
"TESTBUCKET/${aws:userid}/*"
]
}
}
},
{
"Sid":"AllowAllS3ActionsInUserFolder",
"Action":[
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectVersion",
"s3:DeleteObject"
],
"Effect":"Allow",
"Resource":[
"arn:aws:s3:::TESTBUCKET/${aws:userid}/*"
]
}
]
}
aws:userid 変数の値は、「ACCOUNTNUMBER:caller-specified-name」である必要があります。
GetFederationToken API を呼び出す場合、Name パラメーター値は GetFederationToken で設定されたガイドラインに従う必要があります。たとえば、フレンドリ名 Bob を指定すると、正しい形式は「123456789102:Bob」になります。これにより、セッションに名前が付けられ、プレフィックスが一致する Amazon Simple Storage Service (Amazon S3) バケットへのアクセスが許可されます。
注意: この例では、aws:userid 変数の発信者指定の名前 (フレンドリ名) 部分が一意であることを前提としています。一意のフレンドリ名を使用すると、同じフレンドリ名を持つ別のユーザーに、JSON ポリシーで指定されたリソースへのアクセスが許可されないというシナリオを回避できます。詳細については、 一意の識別子を参照してください。
関連情報
GetFederationToken のアクセス許可
ID 登録用の Token vending machine - サンプル Java ウェブアプリケーション
IAM ポリシー要素: 変数とタグ
IAM 識別子