跨账户 Lambda 调用永远不会成功

跨账户 Lambda 调用永远不会成功

我有一个中央工具帐户,其中包含部署管道和另一个部署应用程序的帐户(“阶段”)。管道中的一个步骤是使用暂存帐户中的 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。

相关内容