概要
- Lambda関数として用意していたDynamoDBへのGet/Postメソッドの実行時にエラーが出力された。
- エラー内容は以下である。
An error occurred (AccessDeniedException) when calling the GetItem operation
- これの解決方法を記載する。
目次
- エラーの内容
- 解決方法
1.エラーの内容
このエラーはGetメソッドのコールが失敗していることを表しています。
An error occurred (AccessDeniedException) when calling the GetItem operation
ただ、DynamoDBへのフルアクセス権限はIAMロールにポリシーを作成していたのですが、このエラーが出たので???となりました。
こういったエラーが出た時に、AWSの公式が解決方法を示してくれています。
Amazon DynamoDB テーブルにアクセスしようとしているときに表示される AccessDeniedException というエラーをトラブルシューティングする方法を教えてください。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/dynamodb-access-denied-exception/
上記の記事によると、今回のようにAccessDeniedExceptionというエラーに遭遇した場合、以下のような要因が考えられるそうです。
- DynamoDB テーブルへのアクセスに使用した AWS Identity and Access Management (IAM) ロールに必要なアクセス許可がない。
- DynamoDB テーブルへのアクセスが組織レベルで制限されている。
- DynamoDB の Amazon Virtual Private Cloud (Amazon VPC) エンドポイントに関連付けられたポリシーにより、オペレーションが制限されている。
- 多要素認証 (MFA) を有効にし、MFA を使用してサインインせずにテーブルにアクセスしようとした。
- DynamoDB テーブルの保護に、カスタマーマネージドキーまたは AWS マネージドキーを使用している。
一番上が怪しいですけど、IAMロールでの権限の作成から、LambdaからDynamoDBへのフルアクセス権限のポリシーは設定済みです。
こりゃわからない・・・と思ってましたが、Lambda関数の許可ポリシーを確認すると、AmazonDynamoDBFullAccessのポリシーが添付できていませんでした。。。。ロールの設定だけしてたのが原因です。
2.解決方法
実際にLambda関数に以下のポリシーを設定していきます。
このポリシーはDynamoDBへのフルアクセス権限を表します。
実行ロールにある、AmazonDynamoDBFullAccessポリシーを紐づけたBeAbleToFullAccessFromLambdaToDynamoDBというロールを作成していたので、付与しました。
具体的には、以下の実行ロールの右側にある編集を押下し、
基本設定から既存のロールを選択後、保存を押下します。
これで、LambdaからDynamoDBへアクセスするための権限が付与されたので、エラーを解消できるはずです。
おわりに
- 完全に備忘録ですね。
- cliからも解決してみたい。