使用...创建一个直接连接到SQS的API网关 - Theodo

作者:API传播员 · 2025-12-11 · 阅读时间:4分钟

将消息排入AWS简单队列服务(SQS)的常见方式是通过向API网关托管的端点发送POST请求。虽然通过AWS管理控制台可以轻松设置API网关与SQS之间的连接,但使用CloudFormation进行配置不仅可以实现自动化,还能享受基础设施即代码(IaC)带来的诸多好处。


为什么选择IaC?

IaC的主要优势在于,它允许开发者通过代码管理和部署基础设施。这种方法能够显著减少手动部署中的错误和配置漂移,同时加速迭代和变更的自动化部署。在本文中,我们将通过JSON格式的CloudFormation模板,展示如何配置API网关与SQS的连接。


创建API网关资源

首先,我们需要在CloudFormation中定义API网关资源。在此示例中,我们将使用RestAPI作为API网关的类型。以下是一个基本的配置模板:

{
  "Type": "AWS::ApiGateway::RestApi",
  "Properties": {
    "Name": "MyApiGateway"
  }
}

配置SQS队列

在CloudFormation中创建SQS队列非常简单。需要配置的关键参数包括:

  • 最大消息大小:定义队列中单条消息的最大字节数。
  • 消息保留期:设置消息在队列中保留的时间。
  • 等待时间:指定接收消息时的等待时间。

此外,还需要为队列定义访问策略,以确保其安全性。以下是一个适用于大多数场景的基础模板:

{
  "Type": "AWS::SQS::Queue",
  "Properties": {
    "QueueName": "MyQueue",
    "VisibilityTimeout": 30
  }
}

创建IAM角色

为了使API网关能够向SQS发送消息,我们需要创建一个IAM角色,并为其分配必要的权限。以下是IAM角色的基本配置:

{
  "Type": "AWS::IAM::Role",
  "Properties": {
    "AssumeRolePolicyDocument": {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "apigateway.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    },
    "Policies": [
      {
        "PolicyName": "SQSSendMessagePolicy",
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": "sqs:SendMessage",
              "Resource": "arn:aws:sqs:region:account-id:queue-name"
            }
          ]
        }
      }
    ]
  }
}

添加API端点

接下来,我们为API网关添加端点。在此示例中,我们创建了一个名为v1的顶级端点,并在其下嵌套了一个名为enqueue的子端点。最终的API调用URL类似于:

https:///v1/enqueue

配置POST和OPTIONS方法

为了将消息发送到SQS,我们需要为API网关配置POST方法,并指定以下参数:

  • Content-Type:设置为application/x-www-form-urlencoded,以确保消息格式符合SQS的要求。

以下是POST方法的配置示例:

{
  "Type": "AWS::ApiGateway::Method",
  "Properties": {
    "HttpMethod": "POST",
    "AuthorizationType": "NONE",
    "Integration": {
      "Type": "AWS",
      "IntegrationHttpMethod": "POST",
      "Uri": "arn:aws:apigateway:region:sqs:path/queue-name"
    }
  }
}

此外,为了解决跨域资源共享(CORS)问题,还需要配置OPTIONS方法。


部署API网关

完成所有资源配置后,我们需要创建部署和阶段资源,以便将API网关部署到指定阶段。以下是部署资源的基本模板:

{
  "Type": "AWS::ApiGateway::Deployment",
  "Properties": {
    "RestApiId": {
      "Ref": "MyApiGateway"
    },
    "StageName": "prod"
  }
}

设置自定义域名(可选)

如果需要为API网关设置自定义域名,则需要额外配置以下资源:

  1. API自定义域资源:定义自定义域名。
  2. Route 53资源:将域名解析到API网关。
  3. API映射资源:将自定义域名映射到API网关的阶段。

开始使用

完成上述配置后,可以通过AWS管理控制台创建CloudFormation堆栈。只需将JSON模板复制到相应的字段中,即可部署堆栈。一旦部署完成,您可以使用API网关的URL,通过POST请求向SQS发送消息。例如,您可以使用Axios库发送请求:

const axios = require('axios');

axios.post('https:///v1/enqueue', {
  message: 'Hello, SQS!'
});

总结

通过CloudFormation,您可以轻松实现API网关与SQS的集成,并享受IaC带来的高效与灵活性。以上模板仅为起点,您可以根据实际需求进一步定制和扩展。未来,您还可以利用CloudFormation配置更复杂的堆栈,为应用程序和项目提供强大的基础设施支持。

原文链接: https://blog.theodo.com/2022/07/api-gateway-to-sqs-cloudformation/