Chúng ta sẽ tạo một hàm Lambda để xoá tất cả các mục với khoá phân vùng và khoá sắp xếp được chỉ định trong bảng DynamoDB. Đồng thời xoá tệp hình ảnh tương ứng trong bucket S3.
Mở tệp template.yaml trong thư mục fcaj-book-shop.
Thêm tài nguyên sau vào cuối tệp để tạo hàm Lambda BookDelete:
BookDelete:
Type: AWS::Serverless::Function
Properties:
CodeUri: fcaj-book-shop/book_delete
Handler: book_delete.lambda_handler
Runtime: python3.13
FunctionName: book_delete
Environment:
Variables:
BUCKET_NAME: !Ref BookImageResizeShop
TABLE_NAME: !Ref BooksTable
Architectures:
- x86_64
Policies:
- Statement:
- Sid: VisualEditor0
Effect: Allow
Action:
- dynamodb:DeleteItem
- dynamodb:GetItem
- dynamodb:Query
- s3:DeleteObject
Resource:
- !Sub arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${booksTableName}
- !Join
- ""
- - "arn:aws:s3:::"
- !Ref BookImageResizeShop
- /*

Tài nguyên này định nghĩa một Lambda function tên book_delete với:
BUCKET_NAME (trỏ đến resize bucket) và TABLE_NAMECấu trúc thư mục như sau:
fcaj-book-shop
├── fcaj-book-shop
│ ├── books_list
│ │ └── books_list.py
│ ├── book_create
│ │ ├── book_create.py
│ │ └── requirements.txt
│ └── book_delete
│ └── book_delete.py
└── template.yaml
import boto3
import os
BUCKET = os.environ['BUCKET_NAME']
TABLE = os.environ['TABLE_NAME']
s3_client = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(TABLE)
header_res = {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "OPTIONS,POST,GET,DELETE",
"Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token",
}
def lambda_handler(event, context):
delete_id = event.get('pathParameters', {})
delete_id['rv_id'] = 0
try:
# Get item from id
try:
delete_item = table.get_item(Key=delete_id)
image_path = delete_item['Item'].get('image', '')
image_name = image_path.split('/')[-1]
except Exception as e:
print(f"Error getting item with that {delete_id['id']}")
raise Exception(f"Error getting item with that {delete_id['id']}")
# Delete item in DynamoDB and s3 bucket
try:
items_with_same_id = table.query(
TableName=TABLE,
ProjectionExpression='rv_id',
KeyConditionExpression='id = :id',
ExpressionAttributeValues={':id': delete_id['id']}
)
for item in items_with_same_id['Items']:
delete_id['rv_id'] = item['rv_id']
table.delete_item(Key=delete_id)
s3_client.delete_object(Bucket=BUCKET, Key=image_name)
except Exception as e:
print(f"Error getting item with that {delete_id['id']}")
raise Exception(f"Error getting item with that {delete_id['id']}")
return {
'statusCode': 200,
'body': 'Successfully delete item!',
'headers': header_res
}
except Exception as e:
print(f'Error deleting item: {e}')
raise Exception(f'Error deleting item: {e}')

Chạy các lệnh sau để build và validate SAM template:
sam validate
sam build

Triển khai stack đã cập nhật:
sam deploy
Changeset sẽ hiển thị các tài nguyên mới được thêm:
BookDeleteRole (AWS::IAM::Role)BookDelete (AWS::Lambda::Function)Nhập y để xác nhận triển khai.

Chờ quá trình triển khai hoàn tất. Bạn sẽ thấy thông báo Successfully created/updated stack.

Mở Lambda console. Bạn sẽ thấy ba hàm: books_list, book_create và book_delete.

Nhấp vào hàm book_delete. Xem phần Code source.

Xem phần Function overview hiển thị sơ đồ function.

Nhấp vào tab Configuration, sau đó chọn Permissions từ menu bên trái. Nhấp vào tên execution role (ví dụ: fcaj-book-shop-BookDeleteRole-...).

Tại trang IAM Role, kiểm tra phần Permissions policies. Bạn sẽ thấy:

Nhấp vào BookDeleteRolePolicy0 để mở rộng. Xem chi tiết policy JSON cấp quyền dynamodb:DeleteItem, dynamodb:GetItem, dynamodb:Query và s3:DeleteObject.
