【问题标题】:Dynamo UpdateItem AccessDeniedException with default LambdaRole具有默认 Lambda 角色的 Dynamodb UpdateItem AccessDeniedException
【发布时间】:2023-03-19 01:03:01
【问题描述】:

我很难在我的 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 时假定的角色似乎是错误的。

【问题讨论】:

    标签: go aws-lambda amazon-iam serverless-framework aws-sdk-go


    【解决方案1】:

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

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

    【讨论】:

    • 我暂时使用 *。
    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 2015-11-03
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多