如何使用一个CloudFormation堆栈中的SQS队列作为另一个CloudFormation堆栈中的lambda函数的触发器?

时间:2019-02-08 12:17:30

标签: amazon-web-services aws-lambda amazon-cloudformation amazon-sqs aws-serverless

enter image description here

到目前为止,我所做的事情:我从创建队列的堆栈中导出了队列的Arn和QueueName,并在我想触发并在lambda函数下的Events中使用了它们还定义了该堆栈中的QueuePolicy,以从队列中获取对ReceiveMessage的权限。

这种方法在我第一次构建两个堆栈时都有效,但是在下次构建时,它将禁用SQS队列定义中Lambda触发器下的触发器。我从未成功将其视为lambda函数下的触发器。

让我知道我在做错什么。

1 个答案:

答案 0 :(得分:0)

您可以使用NotificationArns选项调用cloudformation堆栈操作(创建/更新/删除...)。

这将为每个堆栈资源事件发送一条消息。然后,它提供了触发lambda的能力。

消息遵循这种有效负载:

{
    "Records": [
        {
            "EventSource": "aws:sns",
            "EventVersion": "1.0",
            "EventSubscriptionArn": "arn:aws:sns:eu-west-1:12345678912:my-sns-topic:00000000-0000-0000-0000-000000000000",
            "Sns": {
                "Type": "Notification",
                "MessageId": "00000000-0000-0000-0000-000000000000",
                "TopicArn": "arn:aws:sns:eu-west-0:000000000000:my-sns-topic",
                "Subject": "AWS CloudFormation Notification",
                "Message": "
                    StackId='${STACK_ID}'\n
                    Timestamp='2018-01-01T00:00:00.000Z'\n
                    EventId='00000000-0000-0000-0000-000000000000'\n
                    LogicalResourceId='${STACK_NAME}'\n
                    Namespace='000000000000'\n
                    PhysicalResourceId='${STACK_ID}'\n
                    PrincipalId='ABCDEFGHIJKLMNOPQRSTU:1234567890123456789'\n
                    ResourceProperties='null'\
                    ResourceStatus='${RESOURCE_STATUS}'\n
                    ResourceStatusReason=''\n
                    ResourceType='AWS::CloudFormation::Stack'\n
                    StackName='${STACK_NAME}'\n
                    ClientRequestToken='null'\n
                ",
                "Timestamp": "2018-01-01T00:00:00.000Z",
                "SignatureVersion": "1",
                "Signature": "_",
                "SigningCertUrl": "_",
                "UnsubscribeUrl": "_",
                "MessageAttributes": {}
            }
        }
    ]
}