Skip to content

Commit dfb4618

Browse files
Documentation
1 parent bd29d0a commit dfb4618

File tree

1 file changed

+22
-60
lines changed

1 file changed

+22
-60
lines changed

docs/utilities/data_classes.md

+22-60
Original file line numberDiff line numberDiff line change
@@ -1083,80 +1083,42 @@ This example is based on the AWS S3 Batch Operations documentation [Example Lamb
10831083

10841084
=== "app.py"
10851085

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"
10871087
import boto3
1088+
10881089
from botocore.exceptions import ClientError
10891090

10901091
from aws_lambda_powertools.utilities.data_classes import (
10911092
S3BatchOperationEvent,
1092-
S3BatchOperationResult,
10931093
S3BatchOperationResponse,
1094+
event_source
10941095
)
1096+
from aws_lambda_powertools.utilities.typing import LambdaContext
10951097

1096-
import logging
1097-
1098-
logger = logging.getLogger(__name__)
1099-
logger.setLevel("INFO")
11001098

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")
11021102

1103-
@event_route(data_class=S3BatchOperationEvent)
1104-
def lambda_handler(event: S3BatchOperationEvent, context):
1105-
response = S3BatchOperationResponse(event.invocation_schema_version, event.invocation_id)
11061103
result = None
11071104
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')
11081109

11091110
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))
11601122
finally:
11611123
response.add_result(result)
11621124

0 commit comments

Comments
 (0)