【问题标题】:AWS SAM Template - Define SQS queue triggered by API GatewayAWS SAM 模板 - 定义由 API Gateway 触发的 SQS 队列
【发布时间】:2019-04-03 18:59:36
【问题描述】:

我在尝试通过 AWS SAM CLI 部署堆栈时遇到问题。我正在使用我打包和部署的 SAM 简化模板。

我想要的只是创建一个 SQS 队列并隐式创建一个 API 网关,它将仅将有效负载放入队列中。

这是我迄今为止尝试过的(我定义 Queue + Api 的那段代码):

MyProjectQueue:
    Type: AWS::SQS::Queue
    Properties:
        Events:
            MyProjectApi:
                Type: Api
                Properties:
                    Path: /myproject/push
                    Method: post

运行 sam validatesam package 时一切正常,但运行 sam deploy 时失败。为了获取我使用的错误aws cloudformation describe-stack-events --stack-name myproject-stack

STACKEVENTS     
MyProjectQueue-CREATE_FAILED-2018-10-30T16:33:29.764Z       
MyProjectQueue                      
CREATE_FAILED   
Encountered unsupported property Events AWS::SQS::Queue arn:aws:cloudformation:eu-west-1:<MY_AWS>:stack/myproject-stack/<GIUD>     
myproject-stack  2018-10-30T16:33:29.764Z

上面清楚地写着Events it's not supported for AWS::SQS::Queue。但这适用于 Lambdas(资源类型 AWS::Serverless::Function),这就是我尝试这种方式的原因。

但是,如果可能的话,我想避免在网关和队列之间使用 lambda。

是否可以直接为 SQS 队列定义 API 网关?如何?

谢谢!

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation amazon-sqs aws-sam-cli aws-sam


    【解决方案1】:

    AWS::SQS::Queue 资源类型不支持Events 属性,如AWS::Serverless::Function。 Amazon API Gateway 确实支持直接调用另一个 AWS 服务(如 SQS)的资源方法,而无需中间的 Lambda 函数。

    我的建议是您在 SAM 模板中创建一个 AWS::Serverless::Api 资源,该资源引用定义 API 资源方法的 OpenAPI (Swagger) 文件。然后使用x-amazon-apigateway-integration OpenAPI 扩展来定义 API 资源方法和 SQS 队列之间的集成。

    我还建议遵循链接的 AWS 文档提示并使用控制台首先定义您与 SQS 的集成,然后将其导出到 OpenAPI 定义文件。这比尝试从头开始编写 OpenAPI 文件更容易。

    【讨论】:

    • 我想知道是否可以隐式定义它(根据 Lambda)但找不到任何内容,因此我尝试使用 Event。似乎我必须遵循这条路径并将 API GW 定义为资源。为关于导出定义的建议干杯
    • 欢迎您在SAM GitHub repo 上打开一个请求此功能的问题。
    • 我发现这很有帮助(在构建 HTTP API 直接集成部分下)aws.amazon.com/blogs/compute/…
    【解决方案2】:

    您可能已经想出了解决方案。对于那些还没有的人,可以通过使用 api 网关的 x-amazon-apigateway-integration 属性来实现此功能,其中 API 网关充当将有效负载推送到 SQS 队列的代理。更多解释请查看https://medium.com/@pranaysankpal/aws-api-gateway-proxy-for-sqs-simple-queue-service-5b08fe18ce50

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    您所面临的错误是预期的。 AWS::SQS::Queue 不支持 Events 属性 according its documentation,而 AWS::Serverless::Function does

    不确定我是否完全理解您的用例,但我建议您查看函数的 Events 属性,因为您应该可以使用 define SQS as the Event Source

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 2020-07-18
      • 2018-12-04
      • 2018-05-27
      • 2019-09-01
      • 2021-04-11
      • 2020-06-14
      • 1970-01-01
      • 2019-08-11
      相关资源
      最近更新 更多