フェデレーションユーザーで IAM ポリシー変数を使用するにはどうすればよいですか?

最終更新日: 2020 年 8 月 19 日

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 ポリシーで指定されたリソースへのアクセスが許可されないというシナリオを回避できます。詳細については、 一意の識別子を参照してください。