Chia sẻ dữ liệu an toàn: AWS Lambda ghi vào S3 giữa các tài khoản
Giới thiệu
Trong môi trường AWS đa tài khoản, việc có các dịch vụ được lưu trữ trong một tài khoản và dữ liệu được nạp vào tài khoản khác là điều phổ biến. Ví dụ, có một hàm Lambda trong một tài khoản AWS và nó cần đọc hoặc ghi dữ liệu vào bucket S3 của một tài khoản khác.
Bài viết này sẽ giải thích chi tiết các bước cấu hình chính sách bucket S3 và vai trò IAM cho hàm Lambda nhằm đạt được quyền truy cập S3 giữa các tài khoản với AWS Lambda.
Kịch bản
- Tài khoản A (1111111111): Chứa hàm Lambda.
- Tài khoản B (2222222222): Sở hữu bucket S3 mục tiêu (account_b_bucket).
Mục tiêu là cho phép hàm AWS Lambda trong tài khoản A có thể đặt một đối tượng vào bucket S3 của tài khoản B.
Tổng quan kiến trúc
Cài đặt này bao gồm ba thành phần chính:
-
Vai trò IAM (account_a_lambda_role) trong tài khoản A và chính sách tùy chỉnh gắn với vai trò này để truy cập bucket S3 trong tài khoản B.
Gắn chính sách này vào vai trò thực thi Lambda (thay thế tên bucket):
json{ "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountS3", "Action": ["s3:GetObject", "s3:PutObject"], "Effect": "Allow", "Resource": ["arn:aws:s3:::account_b_bucket/*"] } ] }Điều này sẽ cấp quyền cho hàm Lambda yêu cầu truy cập vào bucket S3 trong tài khoản B.
-
Chính sách tin cậy của Vai trò Thực thi Lambda cho phép hàm Lambda giả định vai trò.
Gắn chính sách này vào vai trò thực thi Lambda:
json{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } -
Chính sách bucket trong Tài khoản B cho phép vai trò IAM gắn với hàm Lambda trong tài khoản A đặt đối tượng vào bucket.
Cấu hình chính sách bucket trong tài khoản B để tin tưởng vào vai trò Lambda của tài khoản A. Thay thế số tài khoản, vai trò Lambda và tên bucket:
json{ "Id": "ExamplePolicy", "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountBucket", "Action": ["s3:GetObject", "s3:PutObject"], "Effect": "Allow", "Resource": ["arn:aws:s3:::account_b_bucket/*"], "Principal": { "AWS": ["arn:aws:iam::1111111111:role/account_a_lambda_role"] } } ] }
Quy trình thực thi
Khi hàm Lambda trong tài khoản A được kích hoạt:
- Nó giả định vai trò IAM
account_a_lambda_role. - Chính sách vai trò cho phép thực hiện các hành động S3 trên bucket mục tiêu.
- Chính sách bucket trong tài khoản B xác thực ARN của vai trò đó.
- Giờ đây, Lambda có thể an toàn truy cập bucket giữa các tài khoản.
Mã mẫu Lambda
Thay thế "TARGET_BUCKET" trong mã dưới đây bằng tên bucket mục tiêu của bạn.
python
import boto3
import os
from datetime import datetime
# Khởi tạo client S3
s3_client = boto3.client("s3")
def lambda_handler(event, context):
# Lấy tên bucket từ biến môi trường
bucket_name = os.environ["TARGET_BUCKET"]
# Tạo nội dung file
timestamp = datetime.utcnow().strftime("%Y-%m-%d_%H-%M-%S")
file_content = f"Hello from Lambda!\nTimestamp: {timestamp}\n"
# Tên file để upload
file_name = f"lambda_output_{timestamp}.txt"
try:
# Upload nội dung file lên S3
s3_client.put_object(
Bucket=bucket_name,
Key=file_name,
Body=file_content.encode("utf-8")
)
return {
"statusCode": 200,
"body": f"File {file_name} đã được upload thành công vào {bucket_name}"
}
except Exception as e:
return {
"statusCode": 500,
"body": f"Lỗi khi upload file: {str(e)}"
}
Kết luận
Bằng cách cấu hình các chính sách vai trò IAM và chính sách bucket S3 đúng cách, chúng ta có thể đảm bảo sự giao tiếp an toàn giữa hàm Lambda trong một tài khoản AWS và bucket S3 trong một tài khoản khác.
Mô hình này không chỉ giới hạn ở hàm Lambda. Nó có thể được áp dụng cho các dịch vụ khác như EC2, ECS task, v.v.
Thực hành tốt nhất
- Đảm bảo rằng chính sách IAM chỉ cấp quyền cần thiết.
- Sử dụng các biến môi trường để quản lý thông tin nhạy cảm như tên bucket.
Những cạm bẫy phổ biến
- Không cấu hình đúng chính sách tin cậy giữa các tài khoản.
- Quên gắn chính sách IAM vào vai trò Lambda.
Mẹo hiệu suất
- Sử dụng cache hoặc dịch vụ trung gian để tối ưu hóa tốc độ truy cập dữ liệu.
Khắc phục sự cố
- Kiểm tra quyền truy cập IAM nếu gặp lỗi khi thực thi hàm Lambda.
- Đảm bảo rằng tên bucket và tên vai trò là chính xác.
Câu hỏi thường gặp
- Tại sao tôi cần chính sách tin cậy?
Chính sách tin cậy cho phép Lambda giả định vai trò và truy cập vào tài nguyên. - Tôi có thể sử dụng mô hình này cho dịch vụ nào khác không?
Có, bạn có thể áp dụng cho EC2, ECS task, và nhiều dịch vụ AWS khác.
Tài nguyên tham khảo
Lời kết
Hãy bắt đầu triển khai mô hình này để nâng cao khả năng bảo mật và hiệu quả trong quản lý dữ liệu giữa các tài khoản AWS của bạn.