0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Truy cập S3 từ Redshift qua tài khoản khác

Đăng vào 3 tháng trước

• 3 phút đọc

Chủ đề:

#aws

🔹 Giới thiệu về Redshift UNLOAD

  • UNLOAD là một lệnh SQL trong Redshift cho phép xuất kết quả của một truy vấn từ cụm Redshift của bạn vào các tệp được lưu trữ trong Amazon S3.
  • Đây có thể coi là trái ngược với lệnh COPY (lệnh dùng để tải dữ liệu vào Redshift từ S3).
  • Trường hợp sử dụng: Nếu bạn chạy một truy vấn trong Redshift và muốn lưu kết quả vào S3 để phân tích tiếp theo, sao lưu hoặc chia sẻ giữa các tài khoản, bạn có thể chạy lệnh như sau:
Copy
UNLOAD ('SELECT * FROM sales')
TO 's3://my-bucket/unloads/sales_'
IAM_ROLE 'arn:aws:iam::123456789012:role/RedshiftRole'
FORMAT AS PARQUET;

Lệnh này tạo ra các tệp trong S3 (sales_0000, sales_0001, …) chứa kết quả truy vấn của bạn.

⚠️ Vấn đề: Theo mặc định, các đối tượng thuộc về tài khoản AWS mà Redshift thuộc về ("người tải lên"), chứ không phải là chủ sở hữu của bucket. Đó là lý do tại sao quyền truy cập có thể bị lỗi nếu không có thiết lập quyền truy cập giữa các tài khoản.

✅ Giải pháp (Thiết lập quyền truy cập giữa các tài khoản)

  1. Trong tài khoản bucket S3 (tài khoản của bạn):

    • Tạo một vai trò IAM ("Bucket Role") với quyền đọc/ghi bucket.
  2. Trong tài khoản Redshift (tài khoản khác):

    • Tạo một vai trò IAM ("Cluster Role") cho phép Redshift giả lập vai trò "Bucket Role".
  3. Mối quan hệ tin cậy:

    • Cập nhật vai trò Bucket Role để cho phép vai trò Cluster Role tin cậy và sử dụng nó.
  4. Chạy UNLOAD với cả hai vai trò:

    • Bây giờ khi Redshift thực hiện lệnh unload, nó sẽ sử dụng quyền của bạn, vì vậy các tệp sẽ được lưu vào bucket mà bạn sở hữu (tài khoản bucket), không phải tài khoản của Redshift.

🔹 Giải pháp hiện đại: Quyền sở hữu đối tượng S3 (Chủ sở hữu bucket được thực thi)

AWS đã giới thiệu Quyền sở hữu đối tượng vào năm 2020 để giải quyết chính xác vấn đề này.

  • Với Chủ sở hữu bucket được thực thi, S3 tự động gán quyền sở hữu của tất cả các đối tượng trong bucket của bạn cho chủ sở hữu bucket, bất kể ai đã tải lên chúng.

  • Điều này có nghĩa là:

    • Không cần phải xử lý ACL nữa.
    • Không cần lo lắng về việc Redshift (hoặc tài khoản khác) sở hữu các tệp.
    • Chừng nào Redshift có thể ghi vào bucket, bạn sẽ luôn là chủ sở hữu của đối tượng.

✅ Cách kích hoạt

  1. Đi đến bucket của bạn trong Bảng điều khiển S3.
  2. Mở Quyền → Quyền sở hữu đối tượng.
  3. Chọn Chủ sở hữu bucket được thực thi.
  • Điều này hoàn toàn vô hiệu hóa ACL và buộc quyền sở hữu của chủ sở hữu bucket.

Hoặc thông qua CLI:

Copy
aws s3api put-bucket-ownership-controls \
  --bucket my-bucket \
  --ownership-controls 'Rules=[{ObjectOwnership=BucketOwnerEnforced}]'

🔹 Tóm tắt

  • Redshift UNLOAD = xuất kết quả truy vấn ra S3.
  • Giải pháp cũ = thiết lập quyền IAM giữa các tài khoản (Cluster Role + Bucket Role).
  • Giải pháp mới (được ưa chuộng) = kích hoạt Quyền sở hữu đối tượng S3 (Chủ sở hữu bucket được thực thi) để chủ sở hữu bucket luôn sở hữu các đối tượng — không cần ACL, không phiền phức.

⚠️ Ngoại lệ

  • Nếu bucket S3 hoặc Redshift sử dụng mã hóa bên phía máy chủ với AWS KMS (SSE-KMS), phương pháp này không hoạt động theo mặc định, vì KMS tạo ra một lớp khác của các chính sách khóa. Điều này yêu cầu thiết lập thêm quyền KMS.
Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào