首页 > 解决方案 > 从不同账户部署 AWS Lambda

问题描述

我有一个 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} --region us-东-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,但这比现在对我来说更值得设置麻烦。我已经看到一些谷歌建议我可以使用 CodePipeline,但显然我使用的是 Jenkins,所以这似乎也不是一个好的解决方案。

所以,问题是,这里有一个我想念的简单解决方案吗?

标签: amazon-web-servicesdeploymentaws-lambda

解决方案


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

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

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

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

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

推荐阅读