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ớiBucket
(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ớiBucket
vàKey
. - 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
- Tên bucket và key: Thay
your-bucket-name
vàpath/to/your/file.txt
bằng giá trị thực tế. - Quyền truy cập: Đảm bảo Lambda có IAM role với quyền
s3:GetObject
. - 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ộ.
- Region: Đảm bảo region của Lambda và S3 bucket khớp nhau để tránh lỗi.
- Timeout: Tăng thời gian timeout của Lambda nếu file lớn hoặc xử lý lâu.