从不同账户部署 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的主要内容,如果未能解决你的问题,请参考以下文章
最简单的方法是将现有的 AWS Lex 和 Lambda 部署为 Alexa Skills Kit (ASK)?
AWS Lambda 和 Gateway API - 使用 cloudformation 的蓝/绿部署
如何使用 AWS Lambda 脚本通过 Terraform 部署 AWS 基础设施