Cài đặt SDK cho S3
PutObject đã sẵn sàngVí dụ dùng ngay để tải tệp lên mà không gặp lỗi 403 âm thầm do cơ chế truyền checksum của AWS SDK mới.
Các bản AWS SDK gần đây mặc định truyền tệp kèm CRC32. Cổng S3 tương thích của chúng tôi chưa nhận định dạng đó, nên edge có thể trả về trang HTML 403 trước khi yêu cầu đến S3. Lỗi này trông giống lỗi quyền truy cập nhưng không phải.
Mọi ví dụ bên dưới đều tắt cách truyền checksum này để PutObject dùng yêu cầu SigV4 thông thường. Nếu ListBuckets, tải nhiều phần hoặc URL ký sẵn hoạt động nhưng PutObject trả về 403, đây là nguyên nhân có khả năng cao nhất.
Bạn cần chuẩn bị
- URL endpoint
https://s3south.storage.com.vn— được gửi cùng bucket. Chỉ dùng HTTPS. - Access key và secret keyĐược gửi trong email thiết lập bucket. Hãy giữ secret như mật khẩu: không đưa vào kho mã và không gửi xuống trình duyệt.
- Region và kiểu địa chỉDùng region
s3south— SigV4 cần một chuỗi region nhưng đây không phải region AWS. Dùng địa chỉ dạng path với chứng chỉ TLS chính.
Sao chép ví dụ và tải lên bằng PutObject
Thay<your-access-key> & <your-secret-key> bằng giá trị trong email thiết lập.import boto3
from botocore.client import Config
# Endpoint, access key, and secret come from your bucket provisioning email.
EP = "https://s3south.storage.com.vn"
AK = "<your-access-key>"
SK = "<your-secret-key>"
cfg = Config(
signature_version="s3v4",
region_name="s3south", # opaque SigV4 placeholder, not AWS
s3={"addressing_style": "path"},
request_checksum_calculation="when_required", # opt out of CRC32 streaming
response_checksum_validation="when_required",
)
s3 = boto3.client(
"s3",
aws_access_key_id=AK,
aws_secret_access_key=SK,
endpoint_url=EP,
config=cfg,
)
# Some edge proxies reject these headers on small-body PUTs. Strip them once
# at client construction time and every PutObject will be happy.
def _strip(request, **_):
for h in ("Expect", "expect", "amz-sdk-invocation-id", "amz-sdk-request"):
request.headers.pop(h, None)
s3.meta.events.register("before-send.s3.*", _strip)
# Round-trip a small object to confirm the client is wired correctly.
s3.put_object(Bucket="my-bucket", Key="hello.txt", Body=b"hello from htx")
print(s3.get_object(Bucket="my-bucket", Key="hello.txt")["Body"].read())
Đang dùng được
- ListBuckets / CreateBucket / HeadBucket / DeleteBucket
- PutObject / GetObject / HeadObject / CopyObject / DeleteObject cho tệp mọi kích thước
- Tải lên nhiều phần, nên dùng cho tệp lớn hơn 5 MB
- URL PUT và GET ký sẵn
- Quyền bucket có sẵn: public-read hoặc private
Cần nâng cấp gói
- PutBucketPolicy (chính sách tài nguyên)
- PutBucketVersioning
- PutBucketLifecycleConfiguration
- PutBucketCORS
- PutBucketTagging
- PutObjectAcl cho từng đối tượng
Các lệnh này trả về 403 ở gói mặc định ngay cả khi cài đặt đúng. Liên hệ sales@vinacis.com nếu tác vụ của bạn cần dùng.
Xử lý lỗi 403
- Kiểm tra nội dung phản hồi. HTML không có x-amz-request-id đến từ edge; XML có mã yêu cầu này đến từ S3 và thường liên quan đến quyền, hạn mức hoặc thông tin bucket.
- Thử ListBuckets trước. Nếu lệnh này chạy với cùng thông tin đăng nhập nhưng PutObject trả về 403, hãy áp dụng cài đặt checksum phía trên.
- Thử tải lên nhiều phần. Nếu cách này chạy nhưng PutObject một bước thất bại, nguyên nhân có khả năng là cách truyền checksum.
- Để kiểm tra chi tiết, tìm các header Transfer-Encoding: chunked, Content-Encoding: aws-chunked hoặc X-Amz-Trailer: x-amz-checksum-crc32.
Câu hỏi thường gặp
Vẫn gặp lỗi 403?
Gửi endpoint, phương thức, khóa đối tượng và nội dung phản hồi để chúng tôi lần theo yêu cầu. Gửi email đến sales@vinacis.com hoặc mở yêu cầu tại Thông báo.