如何在 AWS CDK Python 中将队列对象从一个堆栈引用到另一个堆栈?

How to refer an queue object from one stack to another stack in AWS CDK Python?

我正在尝试将一个账户(账户 1)中的 EC2 终止事件发送到另一个账户(账户 2)中的 SQS 队列,只要账户中存在 EC2 终止。 1.

我正在使用 AWS CDK 来实现此功能。

我面临的问题是将 SQS 队列对象从堆栈 B 获取到堆栈 A,以便我可以将其添加为事件桥接规则的目标。

以下是我试过的代码:

堆栈 B

# This is the Queue
    TerminationQueue = sqs.Queue(
        self,
        'Queue',
        queue_name = 'TerminationQueue',
        delivery_delay = cdk.Duration.seconds(300),
        visibility_timeout = cdk.Duration.seconds(300),
        retention_period=cdk.Duration.seconds(7200)

    )
    
# Output
  cdk.CfnOutput(self, 'TerminationQueueOutput', value = TerminationQueue)

堆栈 A

# This is Termination Event
    TerminationEventRule = events.Rule(
        self,
        'EventRule',
        event_pattern = events.EventPattern(
            detail_type=["Termination Event Notification"],
            source=["aws.ec2"],
            detail = {
                "state": ["terminated"]
                 }
        ),
        enabled=True,
    )
 
# Import
  EventsQueue = cdk.Fn.import_value('TerminationQueueOutput')

当我尝试上述操作时出现错误 “需要一个字符串,得到了 {"$jsii.byref":"@aws-cdk/aws-sqs.Queue@10026"}"

然后我尝试通过 TerminationQueue.queue_name 发送队列名称,但出现以下错误 “jsii.errors.JSIIError:预期对象引用,得到“${Token[TOKEN.437]}”

CfnOutput 总是输出一个字符串。您可以输出队列的 ARN(在 TerminationQueue.queueArn 可用),然后使用 Queue.fromQueueArn

在另一个堆栈中创建队列

不过,执行此操作的惯用方法是将队列公开为实例变量,并将其传递给 Stack A 的构造函数。 CDK 将在幕后执行上述操作,将其抽象化。这是 docs:

中的示例
prod = cdk.Environment(account="123456789012", region="us-east-1")

stack1 = StackThatProvidesABucket(app, "Stack1", env=prod)

# stack2 will take a property "bucket"
stack2 = StackThatExpectsABucket(app, "Stack2", bucket=stack1.bucket, env=prod)

你可以用同样的方式传递你的队列。