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



尝试通过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网关?如何?

谢谢!

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

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

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

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

您所面临的错误是意料之中的。根据其文档,AWS::SQS::Queue不支持Events属性,而AWS::Serverless::Function支持。

不确定我是否完全理解您的用例,但我建议您查看函数的Events属性,因为您应该能够将SQS定义为事件源。

最新更新