go - 具有默认 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 时假定的角色似乎是错误的。
解决方案
DynamoDB 具有经常需要访问的子资源。为了确保您也解决了这些子项目,我建议*
在资源末尾添加一个通配符。为此,我更喜欢使用serverless-pseudo-parameters
插件(您可以使用 快速安装它serverless plugin install --name serverless-pseudo-parameters
),然后使用它来更清晰地描述资源,例如:
Resource:
- arn:aws:dynamodb:#{AWS::Region}:#{AWS::AccountId}:table/myTable-${opt:stage, 'dev'}*
推荐阅读
- html - Srcset 似乎找不到正确的图像
- rust - 使用参考枢轴循环时出现可变借用问题
- rust - 如何使用潮汐和glommio将错误传播回调用者?
- python - 使用方法链接分配给 Pandas 数据框
- azure-active-directory - 在 Azure AD 应用程序对象上设置 AppId uri 时获取“HostNameNotOnVerifiedDomain”
- javascript - 如何使用javascript在href中获取标签值
- python - Python3 Pandas 键错误:0
- spss - 比较或组合列中的值
- r - 在字符之间添加逗号
- javascript - 如何使用条件语句更新 eventlistner 内的变量号