使用CloudFormation部署WebSocket网关时Lambda函数缺少触发器问题
问题原因
你在控制台手动关联API Gateway和Lambda时,AWS会自动创建Lambda调用权限,允许API Gateway服务触发Lambda执行。但CloudFormation不会隐式生成该权限,必须显式声明对应的资源配置,所以才会出现集成已创建但Lambda侧看不到触发器的情况。
需要修改/新增的配置
你只需要在模板的Resources块中新增一个AWS::Lambda::Permission资源即可,示例配置如下:
# 新增Lambda调用权限,允许WebSocket API调用该Lambda LambdaInvokePermissionForWebSocket: Type: AWS::Lambda::Permission Properties: Action: lambda:InvokeFunction FunctionName: !GetAtt MyLambdaFunction.Arn Principal: apigateway.amazonaws.com # 这里的SourceArn可以按需调整范围,示例为允许该WebSocket API所有阶段的所有路由调用Lambda SourceArn: !Sub arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${MyWebSocket}/*/*/*
可选优化(建议调整)
你当前模板中API Gateway部署和阶段的关联逻辑有问题,可能导致路由变更后不会自动发布到阶段,建议调整两处配置:
- 删除
MyDeployment资源的StageName属性 - 在
testStage资源的Properties中新增DeploymentId: !Ref MyDeployment - 给
MyDeployment添加DependsOn规则,确保所有路由、集成配置完成后再执行部署,示例:
MyDeployment: Type: AWS::ApiGatewayV2::Deployment DependsOn: - MyConnectRoute - MyDefaultRoute - MyResponseRoute - MyIntegrationResponse Properties: ApiId: !Ref MyWebSocket Description: My Deployment testStage: Type: AWS::ApiGatewayV2::Stage Properties: ApiId: !Ref MyWebSocket StageName: testStage DeploymentId: !Ref MyDeployment
配置更新后重新创建CloudFormation栈,Lambda侧就会自动显示对应的WebSocket触发器了。
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

