Amazon web services AWS上的Websocket连接总是导致请求过多,即使只有一个请求

Amazon web services AWS上的Websocket连接总是导致请求过多,即使只有一个请求,amazon-web-services,api,websocket,terraform,Amazon Web Services,Api,Websocket,Terraform,所以我有一个terraform,它似乎将websocket api连接部署到AWS,但是。。。。 一旦部署,当我连接时,总是会出现“429太多请求”错误。 使用地形0.13.4。 我已经在控制台中手动打开了请求,但是每次我wscat-c{MYENDPOINT}都会得到一个429。 在网上或手册中找不到与此相关的任何内容。 这是地形。想知道是否有人能看到我的路线或集成中是否遗漏了什么? 以下是我从日志中不断得到的回复: (VH_SDESljoEF7tg=)网关响应主体:{“消息”:“请求太多”,“

所以我有一个terraform,它似乎将websocket api连接部署到AWS,但是。。。。 一旦部署,当我连接时,总是会出现“429太多请求”错误。 使用地形0.13.4。 我已经在控制台中手动打开了请求,但是每次我
wscat-c{MYENDPOINT}
都会得到一个429。 在网上或手册中找不到与此相关的任何内容。 这是地形。想知道是否有人能看到我的路线或集成中是否遗漏了什么? 以下是我从日志中不断得到的回复:
(VH_SDESljoEF7tg=)网关响应主体:{“消息”:“请求太多”,“连接ID”:“VH_SDd21joECIeg=”,“请求ID”:“VH_SDESljoEF7tg=”}

资源“aws\u api网关V2\u api”“websocket api”{
name=“websocket api”
协议类型=“WEBSOCKET”
}
资源“aws\U apigatewayv2\U集成”“聊天室连接集成”{
api_id=aws_api网关V2_api.websocket-api.id
集成\u type=“AWS\u代理”
集成\u uri=aws\u lambda\u function.ChatRoomConnectFunction.invoke\u arn
集成方法=“POST”
}
资源“aws\U apigatewayv2\U路由”“连接路由”{
api_id=aws_api网关V2_api.websocket-api.id
route_key=“$connect”
target=“integrations/${aws\u apigatewayv2\u integration.chatRoomConnectIntegration.id}”
}
资源“aws\U apigatewayv2\U部署”“部署”{
api_id=aws_api网关V2_api.websocket-api.id
description=“测试部署”
触发器={
重新部署=sha1(加入(“,”,列表(
JSONECODE(aws_apigatewayv2_集成、聊天室连接集成),
jsonencode(aws_apigatewayv2_route.connectRoute),
)))
}
生命周期{
在销毁之前创建=真
}
}
资源“aws\U apigatewayv2\U阶段”“测试阶段”{
api_id=aws_api网关V2_api.websocket-api.id
name=“测试”
访问日志设置{
目的地\u arn=aws\u cloudwatch\u log\u group.access\u logs.arn
format=“$context.identity.sourceIp---[$context.requestTime]\”$context.httpMethod$context.routeKey$context.protocol\“$context.status$context.responseLength$context.requestId$context.integrationErrorMessage”
}
默认路由设置{
数据\跟踪\已启用=真
日志记录\u level=“INFO”
节流率限制=42
}
路由设置{
route_key=“$connect”
数据\跟踪\已启用=真
日志记录\u level=“INFO”
节流率限制=42
}
}
资源“aws\U api\U网关\U帐户”“api\U网关\U访问日志”{
cloudwatch\u role\u arn=aws\u iam\u role.cloudwatch.arn
}
资源“aws_iam_角色”“cloudwatch”{
name=“api\U网关\U cloudwatch\U全局”

假设\u role\u policy=我无法解释节流的原因,但我将此块添加到我的
aws\u apigatewayv2\u stage
资源中,触发了一个新的部署,现在我可以使用
wscat
进行连接:

  default_route_settings {
    throttling_rate_limit = 100
    throttling_burst_limit = 50
  }

()

你找到原因了吗?我也得到了同样的答案。就是这样!Terraform默认使用0,HTTP API(使用默认限制)对它的解释似乎与Websocket API不同(将限制固定在0)。这对我也有帮助。我使用的是Terraform,默认值确实是
0
,就像@Krotton reported。谢谢:)
resource "aws_apigatewayv2_api" "websocket-api" {
  name                       = "websocket-api"
  protocol_type              = "WEBSOCKET"
}

resource "aws_apigatewayv2_integration" "chatRoomConnectIntegration" {
  api_id           = aws_apigatewayv2_api.websocket-api.id
  integration_type = "AWS_PROXY"
  integration_uri  = aws_lambda_function.ChatRoomConnectFunction.invoke_arn
  integration_method = "POST"
}

resource "aws_apigatewayv2_route" "connectRoute" {
  api_id    = aws_apigatewayv2_api.websocket-api.id
  route_key = "$connect"
  target = "integrations/${aws_apigatewayv2_integration.chatRoomConnectIntegration.id}"
}
resource "aws_apigatewayv2_deployment" "deploy" {
  api_id      = aws_apigatewayv2_api.websocket-api.id
  description = "testing deployment"

  triggers = {
    redeployment = sha1(join(",", list(
      jsonencode(aws_apigatewayv2_integration.chatRoomConnectIntegration),
      jsonencode(aws_apigatewayv2_route.connectRoute),
    )))
  }

  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_apigatewayv2_stage" "test-stage" {
  api_id = aws_apigatewayv2_api.websocket-api.id
  name   = "test"
  access_log_settings {
    destination_arn = aws_cloudwatch_log_group.access_logs.arn
    format = "$context.identity.sourceIp - - [$context.requestTime] \"$context.httpMethod $context.routeKey $context.protocol\" $context.status $context.responseLength $context.requestId $context.integrationErrorMessage"
  }
  default_route_settings {
    data_trace_enabled = true
    logging_level = "INFO"
    throttling_rate_limit = 42
  }
  route_settings {
    route_key = "$connect"
    data_trace_enabled = true
    logging_level = "INFO"
    throttling_rate_limit = 42
  }
}

resource "aws_api_gateway_account" "api_gateway_accesslogs" {
  cloudwatch_role_arn = aws_iam_role.cloudwatch.arn
}

resource "aws_iam_role" "cloudwatch" {
  name = "api_gateway_cloudwatch_global"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
}

resource "aws_iam_role_policy" "cloudwatch" {
  name = "default"
  role = aws_iam_role.cloudwatch.id

  policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents",
                "logs:GetLogEvents",
                "logs:FilterLogEvents"
            ],
            "Resource": "*"
        }
    ]
}
EOF
}

resource "aws_lambda_permission" "allow_api_gateway" {
  action = "lambda:InvokeFunction"
  function_name = aws_lambda_function.ChatRoomConnectFunction.arn
  statement_id = "AllowExecutionFromApiGateway"
  principal = "apigateway.amazonaws.com"
  source_arn = "${aws_apigatewayv2_api.websocket-api.execution_arn}/*/*/*"
}

output "endpoint" {
  value = aws_apigatewayv2_stage.test-stage.invoke_url
}
  default_route_settings {
    throttling_rate_limit = 100
    throttling_burst_limit = 50
  }