@@ -1083,80 +1083,42 @@ This example is based on the AWS S3 Batch Operations documentation [Example Lamb
1083
1083
1084
1084
=== "app.py"
1085
1085
1086
- ```python hl_lines="4 -8 17-19 24- 26 38-40 55-57 61-63 72 75 77 "
1086
+ ```python hl_lines="5 -8 13 15 26 31 33 35 "
1087
1087
import boto3
1088
+
1088
1089
from botocore.exceptions import ClientError
1089
1090
1090
1091
from aws_lambda_powertools.utilities.data_classes import (
1091
1092
S3BatchOperationEvent,
1092
- S3BatchOperationResult,
1093
1093
S3BatchOperationResponse,
1094
+ event_source
1094
1095
)
1096
+ from aws_lambda_powertools.utilities.typing import LambdaContext
1095
1097
1096
- import logging
1097
-
1098
- logger = logging.getLogger(__name__)
1099
- logger.setLevel("INFO")
1100
1098
1101
- s3 = boto3.client("s3")
1099
+ @event_source(data_class=S3BatchOperationEvent)
1100
+ def lambda_handler(event: S3BatchOperationEvent, context: LambdaContext):
1101
+ response = S3BatchOperationResponse(event.invocation_schema_version, event.invocation_id, "PermanentFailure")
1102
1102
1103
- @event_route(data_class=S3BatchOperationEvent)
1104
- def lambda_handler(event: S3BatchOperationEvent, context):
1105
- response = S3BatchOperationResponse(event.invocation_schema_version, event.invocation_id)
1106
1103
result = None
1107
1104
task = event.task
1105
+ src_key: str = task.s3_key
1106
+ src_bucket: str = task.s3_bucket
1107
+
1108
+ s3 = boto3.client("s3", region_name='us-east-1')
1108
1109
1109
1110
try:
1110
- obj_key = task.s3_key
1111
- obj_version_id = task.s3_version_id
1112
- bucket_name = task.s3_bucket
1113
-
1114
- logger.info(
1115
- "Got task: remove delete marker %s from object %s.", obj_version_id, obj_key
1116
- )
1117
-
1118
- try:
1119
- # If this call does not raise an error, the object version is not a delete
1120
- # marker and should not be deleted.
1121
- head_response = s3.head_object(
1122
- Bucket=bucket_name, Key=obj_key, VersionId=obj_version_id
1123
- )
1124
- result = S3BatchOperationResult.as_permanent_failure(task,
1125
- f"Object {obj_key}, ID {obj_version_id} is not a delete marker."
1126
- )
1127
-
1128
- logger.debug(head_response)
1129
- except ClientError as error:
1130
- delete_marker = error.response["ResponseMetadata"]["HTTPHeaders"].get(
1131
- "x-amz-delete-marker", "false"
1132
- )
1133
- if delete_marker == "true":
1134
- logger.info(
1135
- "Object %s, version %s is a delete marker.", obj_key, obj_version_id
1136
- )
1137
- try:
1138
- s3.delete_object(
1139
- Bucket=bucket_name, Key=obj_key, VersionId=obj_version_id
1140
- )
1141
- result = S3BatchOperationResult.as_succeeded(task,
1142
- f"Successfully removed delete marker {obj_version_id} from object {obj_key}."
1143
- )
1144
- except ClientError as error:
1145
- # Mark request timeout as a temporary failure so it will be retried.
1146
- if error.response["Error"]["Code"] == "RequestTimeout":
1147
- result = S3BatchOperationResult.as_temporary_failure(
1148
- task, f"Attempt to remove delete marker from object {obj_key} timed out."
1149
- )
1150
- else:
1151
- raise
1152
- else:
1153
- raise ValueError(
1154
- f"The x-amz-delete-marker header is either not present or is not 'true'."
1155
- )
1156
- except Exception as error:
1157
- # Mark all other exceptions as permanent failures.
1158
- result = S3BatchOperationResult.as_permanent_failure(task, str(error))
1159
- logger.exception(error)
1111
+ dest_bucket, dest_key = do_some_work(s3, src_bucket, src_key)
1112
+ result = task.build_task_batch_response("Succeeded", f"s3://{dest_bucket}/{dest_key}")
1113
+ except ClientError as e:
1114
+ error_code = e.response['Error']['Code']
1115
+ error_message = e.response['Error']['Message']
1116
+ if error_code == 'RequestTimeout':
1117
+ result = task.build_task_batch_response("TemporaryFailure", "Retry request to Amazon S3 due to timeout.")
1118
+ else:
1119
+ result = task.build_task_batch_response("PermanentFailure", f"{error_code}: {error_message}")
1120
+ except Exception as e:
1121
+ result = task.build_task_batch_response("PermanentFailure", str(e))
1160
1122
finally:
1161
1123
response.add_result(result)
1162
1124
0 commit comments