部署时将SQS注册为Lambda触发器的CloudFormation模板问题咨询
SAM模板错误排查与修正
以下是模板中存在的问题,按影响优先级排序:
- 引用不存在的资源逻辑ID,导致部署直接失败
你定义的Lambda函数逻辑ID为CreateContractFunction,但Output段中!GetAtt CreateFunction.Arn错误引用了不存在的CreateFunction资源,该错误会直接触发CloudFormation部署回滚,所有关联资源都不会创建成功。 - SQS事件源的Queue属性配置无效
当前Queue: *arn*是占位值,且此处必须填写SQS队列的ARN(不能填队列URL)。如果你的SQS队列是在其他栈中导出的,需要确保导出的是队列ARN,直接替换占位符即可。 - (可选)AutoPublishAlias与事件源的绑定配置
你配置了AutoPublishAlias: live自动发布版本别名,若需要SQS触发器绑定到该别名(而非默认的$LATEST版本),可在SQSEvent的Properties中添加FunctionAlias: live配置,保证版本迭代时触发器关联的是正确的函数版本。
以下是修正后的完整模板示例:
AWSTemplateFormatVersion: "2010-09-09" Transform: AWS::Serverless-2016-10-31 Description: Create contract function Resources: CreateContractFunction: Type: AWS::Serverless::Function Properties: CodeUri: src/ Handler: index.handler Runtime: nodejs14.x Timeout: 30 Environment: Variables: # 注意此处如果是队列URL可保留,业务代码里调用SQS SDK用URL即可 QUEUE_REQUEST: !ImportValue request:Queue AutoPublishAlias: live Policies: - Version: "2012-10-17" Statement: - Effect: "Allow" Action: - "sqs:SendMessage" - "sqs:ReceiveMessage" - "sqs:DeleteMessage" - "sqs:GetQueueAttributes" # 建议替换为实际SQS队列ARN,缩小权限范围 Resource: "*" - Effect: "Allow" Action: - "lambda:InvokeFunction" - "lambda:InvokeAsync" Resource: "*" Events: SQSEvent: Type: SQS Properties: # 替换为你实际的SQS队列ARN,若为跨栈导出使用!ImportValue引入 Queue: !ImportValue request:QueueArn BatchSize: 10 MaximumBatchingWindowInSeconds: 30 Enabled: true # 可选,绑定到自动发布的别名 FunctionAlias: live DeploymentPreference: Type: AllAtOnce Outputs: LogFunction: # 修正逻辑ID引用 Value: !GetAtt CreateContractFunction.Arn Export: Name: lambda-create
内容的提问来源于stack exchange,提问作者Pavel Šrytr
相关产品推荐
相关产品推荐

