首页 > 解决方案 > 具有默认 LambdaRole 的 Dynamo UpdateItem AccessDeniedException

问题描述

我很难在我的 golang lambda 处理程序中获得正确的角色来执行 Dynamo UpdateItem。

我已经使用具有以下配置的无服务器框架部署了该功能:

provider:
  name: aws
  runtime: go1.x
  stage: ${opt:stage, 'dev'}
  environment: ${file(./env/config.${self:provider.stage}.yml)}
  iamRoleStatements: # TODO: create special roles and restrict access per lambda
    - Effect: Allow
      Action:
        - dynamodb:DescribeTable
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource:
        - "Fn::GetAtt": [ myTable, Arn ]

resources:
  Resources:
    myTable:
      Type: 'AWS::DynamoDB::Table'
      Properties:
        TableName: myTable-${opt:stage, 'dev'}
        AttributeDefinitions:
          - AttributeName: UserID
            AttributeType: S
        KeySchema:
          - AttributeName: UserID
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1

functions:
  myFunc:
    handler: bin/myFunc
    events:
      - http:
          path: myFunc
          method: post
          authorizer: app-auth
          cors: true

处理程序使用 golang aws-sdk 创建会话并在表上调用 UpdateItem:

    sess, err := session.NewSession()
    svc := dynamodb.New(sess)
    input := &dynamodb.UpdateItemInput{
        ...
    }
    _, err = svc.UpdateItem(input)

这会引发异常:

AccessDeniedException: User: arn:aws:sts::{acct}:assumed-role/myservice-stage-us-east-1-lambdaRole/myservice-stage-myfunc

User: arn:aws:sts::{acct}:assumed-role/myservice-stage-us-east-1-lambdaRole是一个具有正确权限的角色:

在此处输入图像描述

我不确定/myservice-stage-myfunc用户的哪一部分在异常中,因为 IAM 控制台中不存在任何此类内容。

我是否缺少某种配置步骤。据我所知,serverless.yaml 中的 IAM 权限设置应该适用于所有功能。但是,在使用 go-aws-sdk 时假定的角色似乎是错误的。

标签: goaws-lambdaamazon-iamserverless-frameworkaws-sdk-go

解决方案


DynamoDB 具有经常需要访问的子资源。为了确保您也解决了这些子项目,我建议*在资源末尾添加一个通配符。为此,我更喜欢使用serverless-pseudo-parameters插件(您可以使用 快速安装它serverless plugin install --name serverless-pseudo-parameters),然后使用它来更清晰地描述资源,例如:

      Resource:
        - arn:aws:dynamodb:#{AWS::Region}:#{AWS::AccountId}:table/myTable-${opt:stage, 'dev'}*

推荐阅读