CognitoのAdmin系関数を使うと「AccessDeniedException」という訳の分からんエラーが出よる。
Laravelで「aws-sdk」を使用しており、その中で「AdminGetUser」などの、いわゆる認証情報が必要な関数を使用しています。
認証情報自体は、EC2に付与されたIAMロールから取得しているのですが、そのロールに権限が足りなそうな感じです。
ということで今回は、CognitoのAdmin系関数でAccessDeniedExceptionが出る件について見ていきます。
前提
- EC2にIAMロールが付与されていること
- 認証情報はEC2のIAMロールから取得すること
- IAMロールには最低限必要なCognitoに関するポリシーをアタッチしていること
エラー内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Message: ErrorexecutingAdminGetUseronhttps://cognito-idp.ap-northeast-1.amazonaws.com; AWSHTTPerror:Clienterror:resultedinaresponse: \n{__type:AccessDeniedException,Message:User:arn:aws:sts:**********assumed-role/ **********/i-03f0(truncated...)\nAccessDeniedException(client): User:arn:aws:sts:**********assumed-role/**********/ *********isnotauthorizedtoperform:cognito-idp:AdminGetUseronresource:arn: aws:cognito-idp:ap-northeast-1**********userpool/ap-northeast-1_**********- {__type:AccessDeniedException,Message:User:arn:aws:sts:**********assumed-role/ **********/**********isnotauthorizedtoperform:cognito-idp:AdminGetUseronresource:arn: aws:cognito-idp:ap-northeast-1:**********:userpool/ap-northeast-1_**********} StackTrace: #0/var/www/laravel/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php(100):Aws\WrappedHttpHandler->parseError(Array,Object(GuzzleHttp\Psr7\Request),Object(Aws\Command),Array) #1/var/www/laravel/vendor/guzzlehttp/promises/src/Promise.php(203):Aws\WrappedHttpHandler->Aws\{closure}(Array) #2/var/www/laravel/vendor/guzzlehttp/promises/src/Promise.php(174):GuzzleHttp\Promise\Promise::callHandler(2,Array,Array) #3/var/www/laravel/vendor/guzzlehttp/promises/src/RejectedPromise.php(40):GuzzleHttp\Promise\Promise::GuzzleHttp\Promise\{closure}(Array) #4/var/www/laravel/vendor/guzzlehttp/promises/src/TaskQueue.php(47):GuzzleHttp\Promise\RejectedPromise::GuzzleHttp\Promise\{closure}() #5/var/www/laravel/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(98):GuzzleHttp\Promise\TaskQueue->run() #6/var/www/laravel/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(125):GuzzleHttp\Handler\CurlMultiHandler->tick() #7/var/www/laravel/vendor/guzzlehttp/promises/src/Promise.php(246):GuzzleHttp\Handler\CurlMultiHandler->execute(true) #8/var/www/laravel/vendor/guzzlehttp/promises/src/Promise.php(223):GuzzleHttp\Promise\Promise->invokeWaitFn() #9/var/www/laravel/vendor/guzzlehttp/promises/src/Promise.php(267):GuzzleHttp\Promise\Promise->waitIfPending() #10/var/www/laravel/vendor/guzzlehttp/promises/src/Promise.php(225):GuzzleHttp\Promise\Promise->invokeWaitList() #11/var/www/laravel/vendor/guzzlehttp/promises/src/Promise.php(267):GuzzleHttp\Promise\Promise->waitIfPending() #12/var/www/laravel/vendor/guzzlehttp/promises/src/Promise.php(225):GuzzleHttp\Promise\Promise->invokeWaitList() #13/var/www/laravel/vendor/guzzlehttp/promises/src/Promise.php(62):GuzzleHttp\Promise\Promise->waitIfPending() #14/var/www/laravel/vendor/aws/aws-sdk-php/src/AwsClientTrait.php(58):GuzzleHttp\Promise\Promise->wait() #15/var/www/laravel/vendor/aws/aws-sdk-php/src/AwsClientTrait.php(77):Aws\AwsClient->execute(Object(Aws\Command)) |
ということで、EC2のIAMロールに最強権限を与えてみます。
エラー解消法
以下のポリシーをアタッチします。
- AmazonCognitoDeveloperAuthenticatedIdentities
- AmazonCognitoPowerUser
これですべて解決です。
これで解決しない場合、権限の問題ではないので、他の解決策を探す必要があります。
ポリシーの意味
AmazonCognitoPowerUser | ID プールのあらゆる側面にアクセスし、管理するためのアクセス権限。 |
---|---|
AmazonCognitoDeveloperAuthenticatedIdentities | Amazon Cognito と統合するための認証システムのアクセス権限。 |
二ついるんか?分からん。。
参考サイト
まとめ
それにしてもCognito周りで悩まされることが多すぎます。
権限やらネットワークの問題やら、原因を探すのにクソ時間かかります。
Cognitoっていうワード、二度と聞きたくない。
ではまた!