Lambda function xoá dữ liệu

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.

Chỉnh sửa SAM Template

  1. Mở tệp template.yaml trong thư mục fcaj-book-shop.

  2. 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 BookDelete

Tài nguyên này định nghĩa một Lambda function tên book_delete với:

  • Runtime Python 3.13 trên kiến trúc x86_64
  • Biến môi trường cho BUCKET_NAME (trỏ đến resize bucket) và TABLE_NAME
  • Được cấp quyền dynamodb:DeleteItem, dynamodb:GetItem, dynamodb:Query trên bảng Books
  • Được cấp quyền s3:DeleteObject trên bucket BookImageResizeShop

Tạo mã Lambda Function

  1. Cấ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
    
    • Tạo thư mục book_delete trong thư mục fcaj-book-shop/fcaj-book-shop/.
    • Tạo tệp book_delete.py và sao chép đoạn mã sau vào đó:
    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}')
    

    Mã nguồn book_delete.py

Build và Deploy

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

    sam validate
    sam build
    

    SAM Validate và Build

  2. 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.

    SAM Deploy - Changeset

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

    Deploy hoàn tất

Kiểm tra trên AWS Console

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

    Lambda Functions

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

    Code Source

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

    Function Overview

  4. 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-...).

    Permissions - Execution Role

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

    • AWSLambdaBasicExecutionRole (AWS managed) - cho CloudWatch Logs
    • BookDeleteRolePolicy0 (Customer inline) - policy tùy chỉnh mà chúng ta đã định nghĩa

    IAM Role Permissions

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

    BookDeleteRolePolicy0 JSON