Lambda function đọc dữ liệu

Chúng ta sẽ tạo một Lambda function đọc toàn bộ dữ liệu trong bảng của DynamoDB:

  1. Mở bảng điều khiển của AWS Lambda, ấn nút Create function LambdaListFunction

  2. Nhập tên cho function, ví dụ: books_list

    • Chọn Python 3.12 cho mục Runtime
    • Ấn nút Create function LambdaListFunction
  3. Sao chép đoạn code dưới đây và dán vào mục lambda_function.py, sau đó ấn nút Deploy

import json
import boto3
from decimal import *
from boto3.dynamodb.types import TypeDeserializer

client = boto3.client('dynamodb') 
serializer = TypeDeserializer()

class DecimalEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Decimal):
            return str(obj)
        return json.JSONEncoder.default(self, obj)
            
def deserialize(data):
    if isinstance(data, list):
        return [deserialize(v) for v in data]

    if isinstance(data, dict):
        try:
            return serializer.deserialize(data)
        except TypeError:
            return {k: deserialize(v) for k, v in data.items()}
    else:
        return data

def lambda_handler(event, context):
    data_books = client.scan(
        TableName='Books',
        IndexName='name-index'
    )
    format_data_books = deserialize(data_books["Items"])
    for book in format_data_books:
        data_comment = client.query(
            TableName="Books", 
            KeyConditionExpression="id = :id AND rv_id > :rv_id", 
            ExpressionAttributeValues={
                ":id": {"S": book['id']}, 
                ":rv_id": {"N": "0"}
            }
        )
        format_data_comment = deserialize(data_comment['Items'])
        print(data_comment['Items'])
        book["comments"] = format_data_comment
            
    print (format_data_books)
    return {
        "statusCode": 200,
        "headers": {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Methods": "GET,PUT,POST,DELETE, OPTIONS",
            "Access-Control-Allow-Headers": "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method,X-Access-Token,XKey,Authorization"
        },
        "body": json.dumps(format_data_books, cls=DecimalEncoder)
    }

LambdaListFunction

  1. Tiếp theo, cấp quyền cho function có thể đọc được dữ liệu từ DynamoDB

    • Ấn sang tab Configuration
    • Chọn Permissions ở menu phía bên trái
    • Ấn vào role mà function đang sử dụng LambdaListFunction
  2. Tại trang IAM Role, ấn nút Add permissions > Create inline policy LambdaListFunction

  3. Chọn tab JSON và thêm đoạn policy sau:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DynamoDBReadBooks",
      "Effect": "Allow",
      "Action": [
        "dynamodb:Scan",
        "dynamodb:Query"
      ],
      "Resource": [
        "arn:aws:dynamodb:AWS_REGION:ACCOUNT_ID:table/Books",
        "arn:aws:dynamodb:AWS_REGION:ACCOUNT_ID:table/Books/index/name-index"
      ]
    }
  ]
}
  • Thay AWS_REGION bằng vùng mà bạn tạo bảng trong DynamoDB, ví dụ: ap-southeast-2
  • Thay ACCOUNT_ID bằng id tài khoản của bạn
  • Ấn nút Next LambdaListFunction
  1. Nhập tên cho policy, ví dụ: LambdaBooksReadPolicy

    • Xem lại các quyền đã cấu hình
    • Ấn nút Create policy LambdaListFunction
  2. Policy đã được tạo thành công và đã được gắn vào role LambdaListFunction