go之具有默认 LambdaRole 的 Dynamo UpdateItem AccessDeniedException

bjzhanghao 阅读:93 2025-06-02 22:19:02 评论:0

我很难在我的 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-myfunc User: arn:aws:sts::{acct}:assumed-role/myservice-stage-us-east-1-lambdaRole是具有正确权限的角色:



我不确定 /myservice-stage-myfunc 是什么User 的一部分在异常中,因为 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'}* 


标签:Exception
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号