我很难在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创建 session 并在表上调用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-myfuncUser: arn:aws:sts::{acct}:assumed-role/myservice-stage-us-east-1-lambdaRole是具有正确权限的角色:

go - 带有默认LambdaRole的Dynamo UpdateItem AccessDeniedException-LMLPHP

我不确定用户的/myservice-stage-myfunc部分是什么例外,因为IAM控制台中不存在任何此类内容。

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

最佳答案

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

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

关于go - 带有默认LambdaRole的Dynamo UpdateItem AccessDeniedException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58206844/

10-11 21:50