我正在使用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::Alias
和AWS::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
属性不是必需的,因为权限现在隐式依赖于要创建的别名。