![跨账户 Lambda 调用永远不会成功](https://linux22.com/image/735475/%E8%B7%A8%E8%B4%A6%E6%88%B7%20Lambda%20%E8%B0%83%E7%94%A8%E6%B0%B8%E8%BF%9C%E4%B8%8D%E4%BC%9A%E6%88%90%E5%8A%9F.png)
我有一个中央工具帐户,其中包含部署管道和另一个部署应用程序的帐户(“阶段”)。管道中的一个步骤是使用暂存帐户中的 lambda 函数迁移数据库。该函数被调用,但它遇到错误,因为它无法访问代码管道,并且管道中的阶段在约 20 分钟后超时。管道中的错误消息表明 lambda 函数未调用 PutJobSuccessResult/PutJobFailureResult 或不允许该函数调用。
该函数正在调用这些函数,但似乎它没有工具账户中代码管道的访问权限。
这些是附加到 Lambda 和 Codepipeline 的策略:
Lambda:
...,{
"Action": [
"codepipeline:PutJobSuccessResult",
"codepipeline:PutJobFailureResult"
],
"Effect": "Allow",
"Resource": [
"*",
"${var.pipelineArn}"
]
},...
和Codepipeline:
..., {
"Effect": "Allow",
"Action": [
"codepipeline:*",
"iam:ListRoles",
"cloudformation:Describe*",
"cloudFormation:List*",
"codecommit:List*",
"codecommit:Get*",
"codecommit:GitPull",
"codecommit:UploadArchive",
"codecommit:CancelUploadArchive",
"codebuild:BatchGetBuilds",
"codebuild:StartBuild",
"cloudformation:CreateStack",
"cloudformation:DeleteStack",
"cloudformation:DescribeStacks",
"cloudformation:UpdateStack",
"cloudformation:CreateChangeSet",
"cloudformation:DeleteChangeSet",
"cloudformation:DescribeChangeSet",
"cloudformation:ExecuteChangeSet",
"cloudformation:SetStackPolicy",
"cloudformation:ValidateTemplate",
"iam:PassRole",
"s3:ListAllMyBuckets",
"s3:GetBucketLocation"
],
"Resource": "*"
}, ...
对缺少什么有什么想法吗?我想我需要在某处添加原则,但我不知道在哪里……
答案1
您可能需要假设跨账户角色在 Lambda 中获取对代码管道资源的访问权限。这实际上会使 lambda 看起来像是在工具帐户。
查看此处了解其工作原理和如何设置策略的一些背景信息:跨账户访问
然后在你的 lambda 中你必须调用STS:承担角色从其他帐户获取凭据。例如,如果您使用 Python,则可以使用博托3 sts.assume_role()
称呼。
希望有帮助:)
答案2
目前无法授予对 Codepipeline 的基于资源的访问权限。就我而言,我必须修改 Staging 帐户内的 lambda 函数。该函数必须从工具帐户中承担一个角色才能访问 codepipeline。