2

我正在将 SAM 模板添加到现有的无服务器应用程序中。我没有。的 Lambda 调用其他 lambda,并且调用者具有指定“被调用者”或被调用 lambda 的 ARN 的策略。在这种情况下,由于我的函数名称是静态的,因此可以创建一次策略,例如:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:[acct-no]:function:MyLambda"
        }
    ]
}

当我更新被调用者时,我可以使用此策略为调用者分配一个角色,而无需更改它。然而,在 SAM/CloudFormations 框架下,创建的函数会自动在其名称后附加一个字符串(例如arn:aws:lambda:us-west-2:[acct-no]:function:MyLambda-3kx71lzkhge3),这会使以前创建的策略无效,因为旧 ARN 不再有效,这让我认为我需要动态创建策略 ARN。

我不确定这样做的正确方法是什么。我的理解是 ARN 是 的输出sam deploy,所以目前,我想首先部署被调用者,注意 ARN,然后使用 ARN 更新调用者的 sam 模板,然后部署调用者。然而,这感觉不正确,因为它是设计为自动化的过程的手动干预。我想知道是否有另一种方法可以解决这个问题,并且希望任何人都可以提供任何见解。

4

1 回答 1

3

你的直觉是正确的,你不应该手动做任何事情,或者使用多个部署。CloudFormation 将允许您通过GetAtt调用另一个 lambda 的 ARN 来执行此操作。这是另一个问题答案的示例

"MyFieldName": "Fn::GetAtt": ["MyLambdaFunc","Arn"]

所以你的 JSON 将是:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "Fn::GetAtt": ["MyLambda","Arn"]
        }
    ]
}
于 2021-11-02T15:37:40.650 回答