如何在CloudFormation YAML中获取Lambda最新版本并解决CloudFront引用报错
针对你提出的两个问题,我来一步步帮你解决:
1. 如何在CloudFormation YAML中获取Lambda函数的最新版本?
CloudFormation不会自动为Lambda函数生成版本,除非你显式声明一个AWS::Lambda::Version资源。这个资源会绑定到你的Lambda函数,每次函数代码或配置更新时,它会自动创建一个新的版本(也就是当前的最新版本)。
给你一个实际的YAML配置示例:
Resources: # 首先定义你的Lambda函数 BasicAuthLambdaFunction: Type: AWS::Lambda::Function Properties: Runtime: nodejs18.x Handler: index.handler Code: S3Bucket: your-lambda-code-bucket S3Key: auth-function.zip Role: !GetAtt LambdaExecutionRole.Arn # 声明Lambda版本资源,自动关联最新的函数状态 BasicAuthLambdaFunctionLatestVersion: Type: AWS::Lambda::Version Properties: FunctionName: !Ref BasicAuthLambdaFunction Description: "Auto-generated latest version of BasicAuthLambda"
之后你就可以通过!Ref BasicAuthLambdaFunctionLatestVersion或者!GetAtt BasicAuthLambdaFunctionLatestVersion.Arn来获取这个最新版本的ARN了。
2. CloudFront Edge Lambda引用报错的解决方法
你遇到的报错是CloudFront的硬性要求导致的:Edge Lambda必须引用带具体版本号的ARN,不能直接用函数本身的ARN或者$LATEST版本。这是因为CloudFront需要固定的函数版本来保证边缘节点部署的稳定性,避免函数代码更新时导致边缘服务出现不可预期的变化。
解决方法就是用上文提到的AWS::Lambda::Version资源,把CloudFront配置里的Lambda ARN改成引用这个版本资源的ARN:
GGGCloudFrontDistribution: Type: AWS::CloudFront::Distribution Properties: DistributionConfig: # 其他分发配置(比如 Origins、DefaultCacheBehavior 等)... LambdaFunctionAssociations: - EventType: viewer-request LambdaFunctionARN: !Ref BasicAuthLambdaFunctionLatestVersion
这样就能满足CloudFront的版本要求,不会再抛出那个报错了。
另外补充一点:当你更新Lambda函数的代码或配置时,CloudFormation会自动创建一个新的AWS::Lambda::Version资源,对应的ARN会带上新的版本号,CloudFront也会自动同步这个引用(前提是你在模板里用的是版本资源的引用,而非硬编码的ARN)。
内容的提问来源于stack exchange,提问作者Daniel Birowsky Popeski

