Cognito ID Poolで指定するロールに、そのID Poolの作成時に生成したもの以外を指定する場合にはロールに信頼関係を追加する


初めに

Cognitoを用いてWebアプリケーションのログイン機構を作る場合、大体の場合はログインユーザーに対してAWSリソースの実行権限を与えるために、IDプールをセットで利用すると思います。
複数のIDプールを利用する必要があるものの、それぞれのIDプールから払い出す権限は同一でよい場合、紐づける「認証されていないロール」「認証されたロール」に、複数のIDプールで同一のIAMロールを指定することになると思います。
IDプールで使うIAMロールは、IDプール作成時に自動生成したロールをそのまま使い、別のIDプールを追加した時に既存のIDプール生成時に作られたロールを紐づけて使う、というやり方を取ることが考えられますが、この時に気を付けないと引っかかる権限問題がありましたのでご紹介します。

前提

  • 2つのIDプールを利用するとする
    • testIdPool
    • testIdPool2
  • 一方のIDプール作成時に作成したIAMロールを、もう一方のIDプールの「認証されたロール」「認証されていないロール」にそれぞれ設定

問題

前提の通りにIDプールとロールを作成/設定します。
testIdPoolの作成時に新しいIAMロールを作成します。

testIdPool2を作成後、「IDプールの編集」から編集画面を開き、testIdPoolの作成時に作成したIAMロールを設定します。

この状態でIDプールからcredentialsを発行しようとすると、testIdPoolでは問題なく可能ですが、testIdPool2では以下のエラーが発生します。

InvalidIdentityPoolConfigurationException: Invalid identity pool configuration. Check assigned IAM roles for this pool.

解決

信頼関係タブを開き、「信頼関係の編集」からJSONの信頼関係ドキュメントを見てみると、以下のようになっていることが分かります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "ap-northeast-1:1d394b04-1f10-41dc-a277-71b5c953794f"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}

ここで、Conditionにap-northeast-1:1d394b04-1f10-41dc-a277-71b5c953794fというIDが指定されていることが分かりますが、これはこのロールを生成する元になった、testIdPoolのIDが設定されています。
該当のIDプールの「ID プールの編集」を開き、「ID プールの ID」を確認してみてください。

つまり、ConditionにこのロールをアタッチしたtestIdPool2のIDが指定されていないために、
InvalidIdentityPoolConfigurationException: Invalid identity pool configuration. Check assigned IAM roles for this pool.
が発生しました。

解消には信頼関係ドキュメントのConditionに、紐づけるIDプールのIDを追加してやればいい、ということになります。
配列の形式にして、追加してやります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": [
            "ap-northeast-1:1d394b04-1f10-41dc-a277-71b5c953794f",
            "ap-northeast-1:8e7a8af9-4a66-4987-b0f0-4be1473895e8"
          ]
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}

これでInvalidIdentityPoolConfigurationExceptionが発生することはなくなったと思います。

参考