使用承担角色从 lambda 访问 S3
Posted
技术标签:
【中文标题】使用承担角色从 lambda 访问 S3【英文标题】:Access S3 from lambda using assume role 【发布时间】:2021-12-06 19:46:02 【问题描述】:我正在尝试使用 terraform 创建一个简单的基础架构。Terraform 应该创建 lambda 和 s3 存储桶,使用 API 网关触发 lambda,该网关再次创建 terraform。 我创建了一个角色并将其分配给 lambda,以便 lambda 可以将对象放入 s3 存储桶中。 我的 lambda 是用 java 编写的,因为我将角色分配给 lambda 以访问 S3,我如何在我的代码中使用该角色? 我遇到了另一篇文章,它建议使用以下代码访问 S3。我认为令牌生成会处理这个问题。
var s3Client = AmazonS3ClientBuilder.standard()
.withCredentials(InstanceProfileCredentialsProvider(false))
.withRegion("ap-southeast-2")
.build()
我对如何访问 s3 感到困惑,我是否需要在我的代码中使用由 terraform 创建的角色,还是有其他方法可以从 java 代码访问 S3?
【问题讨论】:
不要指定区域或凭证提供者,你应该没问题。 【参考方案1】:您无需在 Lambda 函数中担任角色。相反,只需将 Lambda 函数配置为代入 IAM 角色。或者将相关的 S3 策略添加到 Lambda 的现有 IAM 角色。
在这种情况下,您通常不必明确提供凭据或区域。只需使用:
AmazonS3 s3Client = new AmazonS3Client();
请参阅 Terraform basic example 创建 IAM 角色和 Lambda 函数,并将 Lambda 函数配置为代入配置的角色。
【讨论】:
非常感谢,成功了。我在调用 S3 时也犯了另一个错误。``` s3Client.putObject(PutObjectRequest("bucket-test",response.fileName, response.content))``` 内容应该转换为字节流,但我传递使用不同构造函数的字符串。【参考方案2】:Jarmods 的回答是正确的,您可以直接配置 Lambda 的角色 - 但在某些特定用例中,您可能需要成为一个帐户的第一个,而不是另一个帐户。如果您需要在代码中间承担角色,请使用 SDK 的 STS 功能。 STS 是 aws sdk 中的库,用于控制通过代码代入角色的凭据。
【讨论】:
以上是关于使用承担角色从 lambda 访问 S3的主要内容,如果未能解决你的问题,请参考以下文章
通过 jclouds 使用 AWS (S3) - 如何承担角色
从 lambda 中使用 redshift COPY 命令的权限