如何设置依赖于使用 SAM 创建的另一个无服务器函数的 ARN 的 SAM 调用权限?

How to set SAM invocation permission that depends on ARN of another serverless function created with SAM?

我正在将 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 模板,然后部署调用者。然而,这感觉不正确,因为它是设计为自动化的过程的手动干预。我想知道是否有另一种方法可以解决这个问题,如果有人能提供任何见解,我将不胜感激。

您的直觉是正确的,您不应该手动执行任何操作,或使用多个部署。 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"]
        }
    ]
}