AWS SAM模板-定义由API网关触发的SQS队列

时间:2018-10-30 16:56:30

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

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

我要创建的只是一个SQS队列,并隐式创建一个API网关,该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网关?如何?

谢谢!

2 个答案:

答案 0 :(得分:2)

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文件要容易得多。

答案 1 :(得分:0)

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

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