【问题标题】:AWS Lambda : Even after STS:AssumeRole was successful, the lambda function still uses the old IAM roleAWS Lambda:即使在 STS:AssumeRole 成功后,lambda 函数仍然使用旧的 IAM 角色
【发布时间】:2019-07-29 08:53:24
【问题描述】:

我创建了一个新的 IAM 角色,它可以访问(扫描/查询)特定的 DynamoDb 表。

我正在尝试从我的 lambda 函数中使用 STS Assume Role API 调用,以便 lambda 函数可以访问特定的 Dynamo Db 表。

Assume Role 调用成功,我得到了角色 ID、AccesskeyId、Secret Access Key 和 Session Token。

当我从我的 lambda 函数调用以访问 Dynamo DB 时,我收到一个错误

AccessDeniedException:用户: arn:aws:sts::>:假定角色/ota-dev-us-east-1-lambdaRole/ 无权执行:dynamodb:扫描资源: arn:aws:dynamodb:us-east-1:>:table/

我的问题是,即使在 Lambda 函数中角色 Assume 调用成功后,为什么 lambda 函数仍然使用旧角色来访问 Dynamo DB?

我期待 Lambda 函数承担新角色,但从看起来的日志来看,它仍在使用旧角色。

看起来我在两者之间缺少一些步骤。

【问题讨论】:

  • 再澄清一点:roleId 是指 AccessKeyId 吗? ota-dev-us-east-1-lambdaRole 是你提到的老角色的名字吗?
  • 是的,ota-dev-us-east-1-lambdaRole 是我的角色名称

标签: amazon-web-services aws-lambda amazon-iam


【解决方案1】:

STS AssumeRole 调用(取决于您触发它的方式)不会自动刷新 SDK 的 AWS.config 全局对象中的凭证。

您需要检索AssumeRole 返回的访问密钥、会话密钥和会话令牌,并将其传递给您的全局 AWS 凭证 SDK 对象。

具体的代码取决于你使用的编程语言,这里是 Python 的 Boto3 的文档

https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html

顺便说一句,我想知道您为什么不授予对 Lambda 执行角色中的 DynamoDB 表的永久访问权限。这是为了限制函数范围并在运行时根据调用者的身份提供细粒度的访问控制吗?

【讨论】:

  • 谢谢@Sébastien Stormacqm 是的,我明白了。我将需要检索 AssumeRole 返回的访问密钥、会话密钥和会话令牌。有 Go 语言 SDK 的示例吗?关于对 DynamoDb 表的访问,我想根据调用者的身份提供对 DynamoDB 表的细粒度访问。
  • 这是我用 Go 编写的代码 sn-p 并且它有效。 roleArn := "arn:aws:iam::AccountID:role/RoleName" sess := session.Must(session.NewSession()) creds := stscreds.NewCredentials(sess, roleArn) dbSession := dynamodb.New(sess, &aws.Config{Credentials: creds})
  • 我发现下一个链接很有用,并且可以相互补充 stackoverflow.com/a/57456841/9783262(对于 Python)stackoverflow.com/a/48530115/9783262(对于 JavaScript)。由于以下原因,我遇到了类似的错误:我没有将 region_name= 传递到 AWS.config.update({...}) 和(或)没有使用 AWS.config.region = ;
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 2022-06-10
  • 1970-01-01
  • 2021-04-11
  • 2019-12-17
  • 2016-11-02
相关资源
最近更新 更多