Cloudformation 依赖性问题 - AWS 中的自动发布别名::Serverless::Function



我正在使用SAM模板来部署Lambda函数和api网关。我正在使用 AWS::Serverless::Function 来定义我的 lambda 函数。我正在使用 AWS::Serverless::API 来定义我的 API。我还使用 AWS::Lambda::P ermission 向 apigateway 授予函数的权限。

问题是 AWS::Lambda::P ermission 的资源创建失败,因为我的别名不可用。我的 LambdaFunction 资源创建了别名,但在创建别名之前,就会触发 Lambda 权限资源的创建,如果它没有看到提到的别名,它就会失败。

我使用"AWS Cloudformation Deploy"来部署模板

将 DependsOn 属性添加到 LambdaPermission 资源不起作用

> LambdaFunction:
>     Type: AWS::Serverless::Function
>     Properties:
>       Handler: MyHandler
>       Runtime: !Ref LambdaJavaVersion
>       CodeUri: ./build.jar
>       Description: !Sub "${LambdaName} function"
>       Role: !GetAtt LambdaIAMRole.Arn
>       FunctionName: !Ref LambdaName
>       AutoPublishAlias: prod
> APIResource:
>   DependsOn: LambdaFunction
>   Type: AWS::Serverless::Api
>   Properties:
>     DefinitionUri: ./swagger/swagger.yml
>     EndpointConfiguration: REGIONAL
>     StageName: prod
> 
> LambdaPermission:
>   DependsOn: 
>     - LambdaFunction
>     - APIResource
>   Type: AWS::Lambda::Permission
>   Properties:
>     FunctionName: !Join
>       - ""
>       - [!GetAtt LambdaFunction.Arn,":","prod"]
>     Action: lambda:InvokeFunction
>     Principal: apigateway.amazonaws.com
>     SourceArn: !Join
>         - ""
>         - [!Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}",':',!Ref
> APIResource,'/*/*/*']

我想只在发布别名后创建 LambdaPermission。

在自己为此苦苦挣扎之后,我在文档中找到了这个:

指定了自动发布别名属性

AWS::Serverless::Function的自动发布别名属性为 指定,AWS SAM 生成以下 AWS CloudFormation 资源:

AWS::Lambda::AliasAWS::Lambda::Version.

AWS::Lambda::别名

逻辑 ID:<function‑LogicalId>Alias<alias‑name>

<别名>是自动发布别名设置为的字符串。为 例如,如果将自动发布别名设置为活动,则 LogicalId 为: MyFunctionAliaslive.

可参考属性:<function‑LogicalId>.Alias

最后一行是解决方案。因此,为了使您的权限依赖于别名,因此仅在创建别名后创建,您可以通过以下方式引用别名:

亚姆

LambdaPermission:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !Ref LambdaFunction.Alias
Action: lambda:InvokeFunction
Principal: apigateway.amazonaws.com

杰伦

"LambdaPermission": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"FunctionName": {
"Ref": "LambdaFunction.Alias"
},
"Action": "lambda:InvokeFunction",
"Principal": "apigateway.amazonaws.com"
}
}

DependsOn属性不是必需的,因为权限现在隐式依赖于要创建的别名。

最新更新