Skip to content

Commit ec87872

Browse files
authored
Merge pull request #78 from Sage-Bionetworks/etl-537
[ETL-537] Modify lambda event generation script to produce SQS events
2 parents 3555747 + 405c1a1 commit ec87872

File tree

3 files changed

+48
-9
lines changed

3 files changed

+48
-9
lines changed

config/develop/namespaced/s3-event-config-lambda.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ template:
66
dependencies:
77
- develop/namespaced/s3-event-config-lambda-role.yaml
88
- develop/namespaced/s3-to-glue-lambda.yaml
9+
- develop/namespaced/sqs-queue.yaml
910
stack_name: '{{ stack_group_config.namespace }}-lambda-S3EventConfig'
1011
stack_tags: {{ stack_group_config.default_stack_tags }}
1112
parameters:

config/prod/namespaced/s3-event-config-lambda.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ template:
66
dependencies:
77
- prod/namespaced/s3-event-config-lambda-role.yaml
88
- prod/namespaced/s3-to-glue-lambda.yaml
9+
- prod/namespaced/sqs-queue.yaml
910
stack_name: '{{ stack_group_config.namespace }}-lambda-S3EventConfig'
1011
stack_tags: {{ stack_group_config.default_stack_tags }}
1112
parameters:

src/lambda_function/s3_to_glue/events/generate_test_event.py

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def read_args() -> argparse.Namespace:
5959

6060
def create_event(bucket: str, key: str, key_prefix: str, key_file: str) -> dict:
6161
"""
62-
Create an S3 event notification for testing.
62+
Create an SQS event wrapping S3 event notification(s) for testing.
6363
6464
This function accepts either an S3 object key or an S3 key prefix that will
6565
be included in the test event. If an S3 object key is provided, then the test
@@ -76,7 +76,7 @@ def create_event(bucket: str, key: str, key_prefix: str, key_file: str) -> dict:
7676
include in the test event. Takes precedence over `key` and `key_prefix`.
7777
7878
Returns:
79-
dict: An S3 event notification
79+
dict: An SQS event wrapping S3 event notifications
8080
"""
8181
if key_file is not None:
8282
with open(key_file, "r") as key_file_obj:
@@ -94,10 +94,14 @@ def create_event(bucket: str, key: str, key_prefix: str, key_file: str) -> dict:
9494
]
9595
else:
9696
test_data = [key]
97-
s3_event = {
98-
"Records": [create_s3_event_record(bucket=bucket, key=k) for k in test_data]
99-
}
100-
return s3_event
97+
s3_events = [
98+
create_s3_event_record(bucket=bucket, key=k) for k in test_data
99+
]
100+
sqs_messages = [
101+
create_sqs_message(s3_event) for s3_event in s3_events
102+
]
103+
sqs_event = {"Records": sqs_messages}
104+
return sqs_event
101105

102106
def create_s3_event_record(bucket: str, key: str) -> dict:
103107
"""
@@ -149,10 +153,43 @@ def create_s3_event_record(bucket: str, key: str) -> dict:
149153
s3_event_record["s3"]["object"]["key"] = key
150154
return s3_event_record
151155

156+
def create_sqs_message(s3_event_record: dict) -> dict:
157+
"""
158+
Create an SQS message wrapper for an individual S3 event notification.
159+
160+
See `create_s3_event_record` for creating S3 event notifications.
161+
162+
Args:
163+
s3_event_record (dict): A dictionary formatted as a "Record"
164+
object would be in an S3 event notification
165+
166+
Returns:
167+
dict: A dictionary formatted as an SQS message
168+
"""
169+
sqs_event_record = {
170+
"messageId": "bf7be842",
171+
"receiptHandle": "AQEBLdQhbUa",
172+
"body": None,
173+
"attributes": {
174+
"ApproximateReceiveCount": "1",
175+
"SentTimestamp": "1694541052297",
176+
"SenderId": "AIDAJHIPRHEMV73VRJEBU",
177+
"ApproximateFirstReceiveTimestamp": "1694541052299"
178+
},
179+
"messageAttributes": {},
180+
"md5OfMessageAttributes": None,
181+
"md5OfBody": "abdc58591d121b6a0334fb44fd45aceb",
182+
"eventSource": "aws:sqs",
183+
"eventSourceARN": "arn:aws:sqs:us-east-1:914833433684:mynamespace-sqs-S3ToLambda-Queue",
184+
"awsRegion": "us-east-1"
185+
}
186+
sqs_event_record["body"] = json.dumps({"Records": [s3_event_record]})
187+
return sqs_event_record
188+
152189
def main() -> None:
153190
args = read_args()
154191
print("Generating mock S3 event...")
155-
s3_event = create_event(
192+
sqs_event = create_event(
156193
bucket=args.input_bucket,
157194
key=args.input_key,
158195
key_prefix=args.input_key_prefix,
@@ -161,11 +198,11 @@ def main() -> None:
161198

162199
if args.input_key_file is not None or args.input_key_prefix is not None:
163200
with open(os.path.join(args.output_directory, MULTI_RECORD_OUTFILE), "w") as outfile:
164-
json.dump(s3_event, outfile)
201+
json.dump(sqs_event, outfile)
165202
print(f"Event with multiple records written to {outfile.name}.")
166203
else:
167204
with open(os.path.join(args.output_directory, SINGLE_RECORD_OUTFILE), "w") as outfile:
168-
json.dump(s3_event, outfile)
205+
json.dump(sqs_event, outfile)
169206
print(f"Event with single record written to {outfile.name}.")
170207
print("Done.")
171208

0 commit comments

Comments
 (0)