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"]