😎

Lambda Unauthorizedエラーの解決法

2023/09/03に公開

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