Mộc Viên's Blog Mộc Viên's Blog
Cách đọc dữ liệu từ S3 bucket trong Lambda?

Cách đọc dữ liệu từ S3 bucket trong Lambda?

Ngày đăng:

Thẻ :

aws API cloud Python Node

Cách đọc dữ liệu từ S3 bucket trong Lambda?

Dưới đây là hướng dẫn cách đọc dữ liệu từ S3 bucket trong AWS Lambda sử dụng Python và Node.js. Tôi sẽ cung cấp mã mẫu ngắn gọn và giải thích các bước cơ bản.


1. Python

Để đọc dữ liệu từ S3 bucket trong Lambda bằng Python, bạn cần sử dụng thư viện boto3, SDK của AWS cho Python.

Mã mẫu

import json
import boto3

def lambda_handler(event, context):
    # Khởi tạo client S3
    s3_client = boto3.client('s3')
    
    try:
        # Đọc file từ S3
        bucket_name = 'your-bucket-name'
        file_key = 'path/to/your/file.txt'
        
        response = s3_client.get_object(Bucket=bucket_name, Key=file_key)
        
        # Đọc nội dung file
        file_content = response['Body'].read().decode('utf-8')
        
        # In nội dung hoặc xử lý tiếp
        print(file_content)
        
        return {
            'statusCode': 200,
            'body': json.dumps({'message': 'File read successfully', 'content': file_content})
        }
    
    except Exception as e:
        print(e)
        return {
            'statusCode': 500,
            'body': json.dumps({'error': str(e)})
        }

Giải thích

  • Thư viện boto3: Được sử dụng để tương tác với các dịch vụ AWS như S3.
  • Phương thức get_object: Lấy object từ S3 bucket với Bucket (tên bucket) và Key (đường dẫn file).
  • Đọc nội dung: Dữ liệu từ S3 được trả về dưới dạng stream, sử dụng read() để lấy nội dung và decode('utf-8') để chuyển sang chuỗi nếu là văn bản.
  • Xử lý lỗi: Sử dụng try-except để bắt các lỗi như bucket không tồn tại hoặc quyền truy cập.

Cấu hình IAM

  • Lambda cần quyền truy cập S3. Gắn IAM role với Lambda có chính sách như:
{
    "Effect": "Allow",
    "Action": [
        "s3:GetObject"
    ],
    "Resource": "arn:aws:s3:::your-bucket-name/*"
}

2. Node.js

Để đọc dữ liệu từ S3 trong Lambda bằng Node.js, sử dụng AWS SDK v3 (hoặc v2 nếu bạn dùng phiên bản cũ hơn). Dưới đây là ví dụ với AWS SDK v3.

Mã mẫu

const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3');
const { Readable } = require('stream');

exports.handler = async (event) => {
    // Khởi tạo client S3
    const s3Client = new S3Client({ region: 'your-region' });
    
    try {
        // Đọc file từ S3
        const bucketName = 'your-bucket-name';
        const fileKey = 'path/to/your/file.txt';
        
        const command = new GetObjectCommand({
            Bucket: bucketName,
            Key: fileKey
        });
        
        const response = await s3Client.send(command);
        
        // Chuyển stream thành chuỗi
        const fileContent = await streamToString(response.Body);
        
        // In nội dung hoặc xử lý tiếp
        console.log(fileContent);
        
        return {
            statusCode: 200,
            body: JSON.stringify({ message: 'File read successfully', content: fileContent })
        };
    } catch (error) {
        console.error(error);
        return {
            statusCode: 500,
            body: JSON.stringify({ error: error.message })
        };
    }
};

// Hàm hỗ trợ chuyển stream thành chuỗi
const streamToString = async (stream) => {
    const chunks = [];
    for await (const chunk of stream) {
        chunks.push(chunk);
    }
    return Buffer.concat(chunks).toString('utf-8');
};

Giải thích

  • AWS SDK v3: Sử dụng module @aws-sdk/client-s3 để tương tác với S3.
  • Phương thức GetObjectCommand: Lấy object từ S3 với BucketKey.
  • Xử lý stream: Dữ liệu từ S3 trả về dưới dạng stream, cần chuyển thành chuỗi bằng hàm streamToString.
  • Xử lý lỗi: Sử dụng try-catch để bắt lỗi như bucket không tồn tại hoặc quyền truy cập.
  • Region: Đảm bảo chỉ định region phù hợp (thay your-region bằng vùng thực tế, ví dụ us-east-1).

Cấu hình IAM

  • Tương tự Python, Lambda cần quyền s3:GetObject. Gắn IAM role với chính sách tương tự như trên.

Cài đặt phụ thuộc

  • Nếu dùng AWS SDK v3, thêm dependency trong package.json:
{
    "dependencies": {
        "@aws-sdk/client-s3": "^3.0.0"
    }
}
  • Nén mã và dependency thành file ZIP để deploy Lambda.

Lưu ý chung

  1. Tên bucket và key: Thay your-bucket-namepath/to/your/file.txt bằng giá trị thực tế.
  2. Quyền truy cập: Đảm bảo Lambda có IAM role với quyền s3:GetObject.
  3. Kích thước file: Lambda có giới hạn bộ nhớ (mặc định 128MB, tối đa 10GB). Nếu file lớn, cân nhắc xử lý stream thay vì đọc toàn bộ.
  4. Region: Đảm bảo region của Lambda và S3 bucket khớp nhau để tránh lỗi.
  5. Timeout: Tăng thời gian timeout của Lambda nếu file lớn hoặc xử lý lâu.

Gần đây