【问题标题】:How to create an SQS queue with cloudformation/SAM that works with lambdas created with SAM?如何使用 cloudformation/SAM 创建与使用 SAM 创建的 lambdas 一起使用的 SQS 队列?
【发布时间】:2019-12-02 15:43:10
【问题描述】:

我正在从 AWS SAM 创建 lambda,大多数情况下它们运行良好,但我不确定如何授予这些 lambda 由 SQS 触发的权限。每当我构建/打包/部署时,我都会尝试从控制台手动添加 SQS 触发器,但出现以下错误:

An error occurred when creating the trigger: The provided execution role does not have permissions to call ReceiveMessage on SQS (Service: AWSLambda; Status Code: 400; Error Code: InvalidParameterValueException

我完全意识到用 SAM 创建 SQS 也是理想的,但是我找不到像样的指南,特别是关于如何构建用于部署的 yaml 文件的指南。我想知道这个错误是否意味着我需要在 build/package/deploy 之前向 template.yaml 添加策略。所以我在 Resources:MyFunction:Properties:policies 下的 yaml 中添加了以下策略:

- SQSSendMessagePolicy:
    QueueName: "*"
- SQSPollerPolicy:
    QueueName: "*"

我从here 获得了这些信息,但我看不到“从 SQS 接收消息”政策,我不确定还能从哪里获得?或者如果这甚至是问题?

我还尝试在 yaml 中添加以下内容:

  Events:
    MySQSEvent:
      Type: SQS
      Properties:
        Queue: 
          !GetAtt arn:aws:sqs:eu-west-1:my_arn.my_queue
        BatchSize: 10

但是,当我尝试部署时,这给了我以下错误:

Template error: instance of Fn::GetAtt references undefined resource arn:aws:cloudformation:eu-west-1:my_arn

我曾尝试四处寻找通过 cloudformation 设置 SQS 的指南,但像样的指南似乎非常难以捉摸。周围的那些似乎过于冗长和复杂,使它们不适合新用户。

我想要实现的只是将事件列表传递给 SQS(可能带有 lambda),然后它将另一个 lambda 排队以分批接收这些事件,每批 10 个(总共大约 20,000 个)。我需要能够用 SAM 做到这一点是唯一的警告。我很欣赏在控制台上制作 lambda 会使这变得容易得多,但它不适合版本控制。

到目前为止,我已经查看了以下内容,但看不到明显的解决方案,这些信息似乎不太适合我的用例; SO question 1, SO question 2, aws alter stack tutorial, aws cloudformation templates, dzone tutorial, aws docs.

真的会感谢任何指针/帮助/操作指南/完整的工作解决方案吗?

非常感谢

【问题讨论】:

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


    【解决方案1】:

    你的事件部分应该是这样的

    Events:
    MySQSEvent:
      Type: SQS
      Properties:
        Queue: !GetAtt QUEUE_NAME.Arn
    

    其中 QUEUE_NAME 是 Cloud Formation 模板中 SQS 队列的逻辑名称

    【讨论】:

    • 感谢您的帮助,但我现在有一个新错误:“无法创建变更集:服务员 ChangeSetCreateComplete 失败:服务员遇到终端故障状态状态:FAILED。原因:模板错误:资源 QUEUE_NAME 确实不支持 Fn::GetAtt"中的属性类型 arn"
    • 您可以发布您的 SQS 队列和 Lambda 函数的 sn-p 吗?
    • 终于找到错误了!取名很讲究!我为我的项目队列使用了标准的 CamelCase 名称,并没有考虑它,但由于某种原因,“DbfToEaLambdaQueue”不起作用,但“MySqsQueue”很好。只是发帖以防其他人被困在这个问题上!这是自动生成的 arn 必须满足的正则表达式: arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\-])+:([az]{2}( (-gov)|(-iso(b?)))?-[az]+-\d{1})?:(\d{12})?:(.*) 感谢您的帮助!
    猜你喜欢
    • 2017-09-14
    • 2018-02-13
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2021-12-29
    • 2019-07-25
    • 1970-01-01
    • 2019-10-30
    相关资源
    最近更新 更多