【问题标题】:Cross Account AWS Lambda with IAM credentials具有 IAM 凭证的跨账户 AWS Lambda
【发布时间】:2025-12-31 02:20:11
【问题描述】:

我有一个关于在 Lambda 函数中运行的跨账户 IAM 问题。 (我知道人们可能会使用 STS 假设,但是这个包确实不值得保护,我不想通过链接帐户)

帐户“A”。

S3 – package “s3://foo/foo”

IAM credentials “pkg_creds” for bucket "s3://foo" 

帐户“B”

Lamba function “gogo” runs

In this Lambda function, it attempts to use boto3 and the pkg_creds to
download package “s3://foo/foo”, but if fails with this error:

 **The provided token is malformed or otherwise invalid.**

Lambda 是只读的,但如果我使用 boto3.client(不是会话),我相信 boto3 不会将凭据写入 ~/.aws。但是,我还将 AWS_CONFIG_FILE 设置为 /tmp 以防万一。它仍然失败。我怀疑我的提议是不可能的,因为 LAMBDA 具有不可变的 AWS 凭证,您无法更改范围,即使是明确赋予 boto3 的范围。

让我知道你的想法。我可能会尝试使用 Faragate 来完成这项工作,但 Lambda 函数更易于维护和部署。

提前致谢!

【问题讨论】:

  • 与不正确且可能不安全的操作(共享 IAM 用户凭证)相比,正确且安全地执行此操作(具有跨账户角色信任)并没有那么大的努力。 PS“Lambda 是只读的”是什么意思?
  • jarmod,谢谢!我完全想坚持良好的标准做法。它实际上是一个 saas,我在其他用户帐户中创建存储桶。这不像一对少数的关系。用户提供 iam,然后我使用自己的 lambda 帐户为他们创建存储桶。
  • 对不起,当我用谷歌搜索这个错误时,它说 boto3 正在尝试将凭据写入主目录。实际上,如果我使用 boto3.session。我的错。应该提到我为什么写只读。
  • 他们为您提供他们账户的 IAM 用户凭证?或者他们授予您的账户(或您的 Lambda 函数的角色)在其账户中担任 IAM 角色的权限,并且该担任的角色授予您对其 S3 存储桶的权限?或者是其他东西? IAM 用户选项有效,但不是一个好的选项。第二个选项是您想要的理想位置。
  • 对于入职培训,我们将引导他们完成向导。他们提供 iam 凭据。他们可以在入职后删除即时消息凭据,但我们需要它像令牌一样为他们创建底层存储桶。如果我们让他们创建存储桶,它将被错误命名,没有加密......等等。

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


【解决方案1】:

Lambda 根本不使用~/.aws 配置文件,它默认使用环境变量。 boto3中有many ways配置AWS凭证。您应该能够使用明确的 AWS 凭证在您的 Lambda 函数中创建一个新的 boto3 客户端,如下所示:

client = boto3.client(
    's3',
    aws_access_key_id=ACCOUNT_A_ACCESS_KEY,
    aws_secret_access_key=ACCOUNT_A_SECRET_KEY
)

并将ACCOUNT_A_ACCESS_KEYACCOUNT_A_SECRET_KEY 作为环境变量传递给函数。

【讨论】:

  • 感谢您的建议!我实际上正在做这件事。我认为 lambda 足够聪明,可以限制自己的范围,即使我正在建立与不同帐户的显式连接。让我仔细检查一下。显式连接在继承的类中,尽管它在 ec2 asg 组中工作正常。这些天我宁愿去无服务器。
【解决方案2】:

用户错误。我可以验证 lambda 函数中的 boto3 可以使用其范围之外的凭据。

【讨论】:

    【解决方案3】:

    在排除更多故障之后。问题是我被带入了在 lambda 函数上设置的“环境变量”SESSION,而不是在我的 ec2 实例上。所以我一直在使用似乎覆盖了显式密钥和秘密的 lambda 会话密钥。

    【讨论】: