gpt4 book ai didi

aws-cloudformation - 为什么cloudformation给出 "Invalid method response 200"错误,但是手动部署可以工作? (AWS API 网关 Websocket)

转载 作者:行者123 更新时间:2023-12-03 07:38:43 24 4
gpt4 key购买 nike

当我部署一个简单的 websocket 模拟路由时,我收到此错误。

Execution failed due to configuration error: Output mapping refers to an invalid method response: 200

首先,我对方法响应的含义有点困惑,因为在Websocket API中,使用的术语是路由响应集成响应。我猜这是指路由响应

我拥有的资源是:

  • Websocket API
  • 舞台
  • 部署
  • $连接路线
  • $connect 与模拟集成(默认映射到 {"statusCode": 200})
  • $connect 集成响应(仅传递集成)
  • $connect 路由响应

有趣的是:要解决此问题,我所要做的就是转到控制台并单击部署 API。我不必更改任何配置。但这对我来说不是一个好的解决方案,因为我想在 CI/CD 管道上运行它。

我猜测问题出在路由响应上,因为它无法从控制台进行配置。因此,在控制台部署过程中,幕后一定发生了一些事情,而我在云信息部署过程中缺少了这一点。有什么想法可以解决这个问题吗?

这是我的 Cloudformation 模板。

Resources:
testWsApiBackendWsApi40DF2EE8:
Type: AWS::ApiGatewayV2::Api
Properties:
Name: testWsApi
ProtocolType: WEBSOCKET
RouteSelectionExpression: $request.body.action

testWsApiApiDeployment423ACBB9:
Type: AWS::ApiGatewayV2::Deployment
Properties:
ApiId:
Fn::GetAtt:
- testWsApiBackendWsApi40DF2EE8
- ApiId
DependsOn:
- MockWithAuthAwsStackwsMockRoute04DB7577
testWsApiApiStageF40CAAE0:
Type: AWS::ApiGatewayV2::Stage
Properties:
ApiId:
Fn::GetAtt:
- testWsApiBackendWsApi40DF2EE8
- ApiId
StageName: production
DeploymentId:
Fn::GetAtt:
- testWsApiApiDeployment423ACBB9
- DeploymentId

MockWithAuthAwsStackwsMockRoute04DB7577:
Type: AWS::ApiGatewayV2::Route
Properties:
ApiId:
Fn::GetAtt:
- testWsApiBackendWsApi40DF2EE8
- ApiId
RouteKey: $connect
Target:
Fn::Join:
- ""
- - integrations/
- Ref: MockWithAuthAwsStackwsMockIntegration36E7A460

MockWithAuthAwsStackwsMockIntegration36E7A460:
Type: AWS::ApiGatewayV2::Integration
Properties:
ApiId:
Fn::GetAtt:
- testWsApiBackendWsApi40DF2EE8
- ApiId
IntegrationType: MOCK
PassthroughBehavior: WHEN_NO_TEMPLATES
RequestTemplates:
$default: '{"statusCode":200}'
TemplateSelectionExpression: \$default

MockWithAuthAwsStackwsMockRouteResponseAEE0B8ED:
Type: AWS::ApiGatewayV2::RouteResponse
Properties:
ApiId:
Fn::GetAtt:
- testWsApiBackendWsApi40DF2EE8
- ApiId
RouteId:
Ref: MockWithAuthAwsStackwsMockRoute04DB7577
RouteResponseKey: $default

MockWithAuthAwsStackwsMockIntegrationResponse85928773:
Type: AWS::ApiGatewayV2::IntegrationResponse
Properties:
ApiId:
Fn::GetAtt:
- testWsApiBackendWsApi40DF2EE8
- ApiId
IntegrationId:
Ref: MockWithAuthAwsStackwsMockIntegration36E7A460
IntegrationResponseKey: $default
TemplateSelectionExpression: \$default

P.S 我实际上使用的是 AWS CDK。上面的模板是cdk Synth的结果。如果您想查看 CDK 代码,请告诉我。

最佳答案

使用控制台进行手动部署有效,而使用 cloudformation 偶尔会出现错误的原因在于这些资源的创建顺序。在控制台中,遵循以下顺序:

  1. 已创建路由、集成和响应
  2. 它们与一个阶段相关
  3. 它们被部署到指定阶段

使用cloudformation时,资源的创建顺序会混淆,导致资源无法正确连接。您似乎已将部署连接到依赖于首先创建的路由。您还需要确保阶段是在部署之前创建的。为此,您可以添加显式的 DependsOn 属性,或对部署中的阶段的隐式引用;也许在 stageName 属性中为 !Ref StageResource。或者您可以省去麻烦,只需将 autoDeploy: true 添加到您的阶段,它将自行处理链接和顺序。

关于aws-cloudformation - 为什么cloudformation给出 "Invalid method response 200"错误,但是手动部署可以工作? (AWS API 网关 Websocket),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75456230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com