0

Trying to use moto library to mock AWS services. I have been successful trying to put a SQS queue as target to event bridge in the same account Account1. Not sure if moto supports cross account event bridge test cases, however, when I try to put event bus in Account2 as target to event bridge in Account1, I was getting some weird exception as below.

def send_to_targets(self, event_bus_name, event):
    event_bus_name = event_bus_name.split("/")[-1]
    if event_bus_name != self.event_bus_name.split("/")[-1]:
        return

    if not self.event_pattern.matches_event(event):
        return

    # supported targets
    # - CloudWatch Log Group
    # - EventBridge Archive
    # - SQS Queue + FIFO Queue
    for target in self.targets:
        arn = self._parse_arn(target["Arn"])

        if arn.service == "logs" and arn.resource_type == "log-group":
            self._send_to_cw_log_group(arn.resource_id, event)
        elif arn.service == "events" and not arn.resource_type:
            input_template = json.loads(target["InputTransformer"]["InputTemplate"])
            archive_arn = self._parse_arn(input_template["archive-arn"])

            self._send_to_events_archive(archive_arn.resource_id, event)
        elif arn.service == "sqs":
            group_id = target.get("SqsParameters", {}).get("MessageGroupId")
            self._send_to_sqs_queue(arn.resource_id, event, group_id)
        else:
            raise NotImplementedError(f"Expr not defined for {type(self)}")
        NotImplementedError: Expr not defined for <class 'moto.events.models.Rule'>

Below is my test case where events_client.put_events(Entries=test_events) raises above error.

def test_put_events_event_bus_forwarding_rules(events_client, sqs_test, create_event_bus, roles):
pattern = {
    "source": ["source1"],
    "detail-type": ["test-detail-type"],
    "detail": {
        "test": [{"exists": True}],
    },
}

os.environ["MOTO_ACCOUNT_ID"] = "222222222222"

events_client.put_rule(
    Name='event_bus_2_rule',
    EventPattern=json.dumps(pattern),
    State="ENABLED",
    EventBusName='event_bus_2',
)

events_client.put_targets(
    Rule='event_bus_2_rule',
    EventBusName='event_bus_2',
    Targets=[
        {
            "Id": "sqs-dedup-fifo",
            "Arn": "arn:aws:sqs:us-east-1:222222222222:test-queue.fifo",
            "SqsParameters": {"MessageGroupId": "group-id"},
        }
    ],
)

policy = {
    "Statement": [
        {
            "Sid": "Account1",
            "Action": "events:PutEvents",
            "Principal": "123456789012",
            "StatementId": "Account1",
            "Effect": "n/a",
            "Resource": "n/a",
        }
    ]
}

events_client.put_permission(EventBusName='event_bus_2', Policy=json.dumps(policy))

del os.environ["MOTO_ACCOUNT_ID"]

events_client.put_rule(
    Name='event_bus_1_rule',
    RoleArn='arn:aws:iam::123456789012:role/Administrator',
    EventPattern=json.dumps(pattern),
    State="ENABLED",
    EventBusName='event_bus_1',
)

events_client.put_targets(
    Rule='event_bus_1_rule',
    EventBusName='event_bus_1',
    Targets=[
        {
            "Id": 'event_bus_2',
            "Arn": 'arn:aws:events:us-east-1:222222222222:event-bus/event_bus_2',
            "RoleArn": 'arn:aws:iam::123456789012:role/Administrator',
        },
    ],
)

test_events = [{
    'Source': 'source1',
    'DetailType': 'test-detail-type',
    'Detail': json.dumps({"test": "true"}),
    'EventBusName': 'event_bus_1'
}]

events_client.put_events(Entries=test_events)

os.environ["MOTO_ACCOUNT_ID"] = "222222222222"

sqs_client = MySQSClient()
queue_url = sqs_client.get_queue_url(queue_name="test-queue.fifo")

response = sqs_client.receive_message(
    queue_url=queue_url,
)

response["Messages"].should.have.length_of(1)

print(response)
del os.environ["MOTO_ACCOUNT_ID"]
ZZzzZZzz
  • 1,800
  • 3
  • 29
  • 51

0 Answers0