从不同账户部署 AWS Lambda

Posted

技术标签:

【中文标题】从不同账户部署 AWS Lambda【英文标题】:Deploying an AWS Lambda from a different account 【发布时间】:2019-10-17 12:52:30 【问题描述】:

我有一个 Lambda .jar,它是从 AWS 账户(“Account_Bld”)中的 Jenkins 盒子构建的。构建完成后,我将 .jar 复制到不同 AWS 账户(“Account_Dst”)中的 S3 存储桶,并尝试根据 S3 中新复制的 .jar 更新 Account_Dst 中的 Lambda。

我将此命令用作我的部署脚本的一部分,这是对另一个版本的轻微修改,当所有内容都位于同一帐户中时该版本可以工作:

aws lambda update-function-code --function-name arn:aws:lambda:us-east-1:Account_Dst_Id:function:lambda_function_name --zip-file fileb://jar_file_relative_path --区域 us-east-1

不出所料,我收到了这个错误:

调用 UpdateFunctionCode 操作时发生错误 (AccessDeniedException):用户:arn:aws:sts::Account_Bld_Id:assumed-role/jenkins_ec2_role/jenkins_ec2_instance_id 无权执行:lambda:UpdateFunctionCode on resource : arn:aws:lambda:us-east-1:Account_Dst_Id:function:lambda_function_name

我已授予 jenkins_ec2_role 权限以更新另一个帐户中的 Lambda,但我需要在 Account_Dst 中的某个地方回报这些权限是有道理的——假设有一个简单的解决方案来解决这个问题。

现在,可能的解决方案。我可以在 Account_Dst 中担任具有正确权限的角色并更新 Lambda,但这比现在对我来说更值得设置麻烦。我已经看到一些 Google 建议我可以使用 CodePipeline,但显然我使用的是 Jenkins,所以这似乎也不是一个好的解决方案。

所以,问题是,这里是否有一个我缺少的简单解决方案?

【问题讨论】:

【参考方案1】:

Account_Bld 中授予访问Account_Dst 的权限并不足以访问另一个帐户。这很好,因为您不希望人们授予自己访问其他人帐户的权限。

目标帐户需要接受传入请求。该方法因服务而异。例如,Amazon S3 可以创建存储桶策略以允许来自其他账户的访问,Amazon SQS 也可以。

但是,Lambda 中没有这样的概念来配置来自其他账户的传入请求。根本没有任何地方可以配置为允许来自另一个帐户的update-function-code

因此,您需要按照您的建议进行操作:

Account_Dst 中创建 IAM 用户或 IAM 角色 使用来自Account_Dst IAM 用户的凭证(最简单)或使用现有的Account_Bld 凭证来承担Account_Dst 中的角色(多几行代码) 使用这些凭据致电update-function-code

【讨论】:

补充:现在可以向 Lambda 函数添​​加基于资源的策略(例如,用于跨账户权限),the docs 说跨账户 update-function-code 应该是可能的。但是,我无法让它工作,只好按照您的描述使用目标帐户中的角色。

以上是关于从不同账户部署 AWS Lambda的主要内容,如果未能解决你的问题,请参考以下文章

使用boto3下载Lambda函数的部署包

最简单的方法是将现有的 AWS Lex 和 Lambda 部署为 Alexa Skills Kit (ASK)?

AWS Lambda 和 Gateway API - 使用 cloudformation 的蓝/绿部署

如何使用 AWS Lambda 脚本通过 Terraform 部署 AWS 基础设施

AWS CodePipeline 错误:不允许跨账户传递角色

在不同账户的 Lambda 中从 AWS Athena 查询 S3 文件时访问被拒绝