Lambda Unauthorizedエラーの解決法
LambdaのAPIを叩くと、Unauthorizedエラーが返ってきたので、解決までの備忘録。
Cloudwatchのlogを確認してみる。
"message": "User: arn:aws:sts::940634425010:assumed-role/production-us-east-1-lambdaRole/production-app is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:us-east-1:940634425010:table/User-production because no identity-based policy allows the dynamodb:PutItem action",
"because no identity-based policy allows the dynamodb:PutItem action"
dynamodbにアクセスするための権限がない的な?意味だと推測。
権限なのでIAMが怪しいと思い、serverless.ymlファイルからIAMを削除して、AWS側でも削除してみた。
再びCloudwatchのlogを確認してみる。
{
02:51:45.812+09:00 "exception": {
02:51:45.812+09:00 "message": "User: arn:aws:sts::940634425010:assumed-role/production-us-east-1-lambdaRole/production-app is not authorized to perform: dynamodb:Query on resource: arn:aws:dynamodb:us-east-1:940634425010:table/ChatGptHistory-production/index/created_at-index because no identity-based policy allows the dynamodb:Query action",
02:51:45.812+09:00 "code": "AccessDeniedException",
02:51:45.812+09:00 "time": "17:51:45.811Z",
02:51:45.812+09:00 "requestId": "RJ9GICP34D5RQHCKLRLG5ILN33VV4KQNSO5AEMVJF66Q9ASUAAJG",
02:51:45.812+09:00 "statusCode": 400,
02:51:45.812+09:00 "retryable": false,
02:51:45.812+09:00 "retryDelay": 37.17619404014335
T02:51:45.812+09:00 }
T02:51:45.812+09:00 }
"User: arn:aws:sts::940634425010:assumed-role/production-us-east-1-lambdaRole/production-app is not authorized to perform: dynamodb:Query on resource: arn:aws:dynamodb:us-east-1:940634425010:table/Hoge-production/index/created_at-index because no identity-based policy allows the dynamodb:Query action"
と書いてあるので結局無理そう。
元に戻した。
provider:
name: aws
runtime: nodejs18.x
timeout: 30
apiGateway:
shouldStartNameWithService: true
environment:
AWS_NODEJS_CONNECTION_REUSE_ENABLED: 1
NODE_OPTIONS: --enable-source-maps --stack-trace-limit=1000
iam:
role:
statements:
- Effect: 'Allow'
Action:
- 'dynamodb:DescribeTable'
- 'dynamodb:Query'
- 'dynamodb:Scan'
- 'dynamodb:GetItem'
- 'dynamodb:PutItem'
- 'dynamodb:UpdateItem'
- 'dynamodb:DeleteItem'
Resource: arn:aws:dynamodb:us-west-2:*:table/*
deploymentMethod: direct
ここでserverless.ymlファイルをもう一度見てみると、
Resource: arn:aws:dynamodb:us-west-2:*:table/*
ここのregionがミスってることに気づいた。us-west-2
にしているが、デフォルトではus-west-1
が指定されるため、ここが一致していなくアクセスできないとのことだった。
因みにコンソールを見るとDynamoDBにTableが作られてないことは明らかなので、そこをよく見るべきだった。
以下のように修正して再度デプロイしたら無事動きました。
Resource: arn:aws:dynamodb:us-west-1:*:table/*
Discussion