2011-12-22 19 views
6

Gần đây tôi đã cố gắng viết mã để thêm và xóa nội dung tạo thành một thùng chứa S3 của Amazon. Tôi hoàn toàn mới với Amazon S3 và AmazonWS .Net SDK.Gặp sự cố khi truy cập nhóm không sử dụng khu vực của Hoa Kỳ với .Net SDK

Tiêu chí khu vực xô là http://sqs.eu-west-1.amazonaws.com vì vậy tôi xây dựng khách hàng của tôi như thế này:

_s3Client = AWSClientFactory.CreateAmazonS3Client(accessKey, awsSecretKey, new AmazonS3Config().WithServiceURL("http://sqs.eu-west-1.amazonaws.com")); 

Nếu tôi bỏ qua các bit AmazonS3Config tôi nhận được lỗi này:

A redirect was returned without a new location. This can be caused by attempting to access buckets with periods in the name in a different region then the client is configured for.

Khi tôi đặt trong AmazonS3Config bit tôi không còn nhận được lỗi đó nhưng dường như tôi không có quyền truy cập vào nhóm này ở tất cả hoặc bất kỳ nhóm nào khác mà tôi thường có quyền truy cập. Bất kỳ yêu cầu nào tôi gửi đều trả về null.

Tôi đã thử nghiệm mã của mình với các nhóm khác được định cấu hình theo vùng chuẩn của Hoa Kỳ và tất cả đều hoạt động tốt. Sự khác biệt duy nhất là trong phương thức CreateAmazonS3Client, nơi tôi đặt cấu hình với điểm cuối EU.

Ai đó có thể cho tôi một số hướng dẫn về cách tôi nên thiết lập khách hàng của tôi để làm việc với một xô trong khu vực EU (Ireland). Tôi đã tìm kiếm một vài giờ và mọi hướng dẫn hoặc tài liệu tôi đã theo dõi vẫn chưa hoạt động.

Trả lời

15

Chỉ cần sử dụng các thiết bị đầu cuối tiêu chuẩn - s3.amazonaws.com

AmazonS3Config S3Config = new AmazonS3Config { 
    ServiceURL = "s3.amazonaws.com", 
    CommunicationProtocol = Amazon.S3.Model.Protocol.HTTP 
}; 

AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(AWS_Key, AWS_SecretKey, S3Config); 

PutObjectRequest UploadToS3Request = new PutObjectRequest(); 
UploadToS3Request.WithFilePath(localPath) 
       .WithBucketName(bucket) 
       .WithKey(key); 

client.PutObject(UploadToS3Request); 
+2

Tôi đã thử điểm cuối đó trước đây nhưng chưa đặt "CommunicationProtocol = Amazon.S3.Model.Protocol.HTTP" trong cấu hình. Thêm vào đó đã làm các trick. Cảm ơn bạn rất nhiều cho câu trả lời. –

+6

Nếu bạn muốn sử dụng HTTPS, tôi nghĩ bạn cần sử dụng điểm cuối cụ thể của EU là 's3-eu-west-1.amazonaws.com'. Bạn đang sử dụng điểm cuối Dịch vụ Hàng đợi Đơn giản. Xem http://docs.amazonwebservices.com/general/latest/gr/rande.html –

+0

Thiên Chúa, tôi thậm chí không bao giờ phát hiện thấy các sqs ở đó thay vì s3. Tôi nghĩ rằng tôi chỉ cần sao chép nó từ một số bài đăng ở đâu đó thay vì giải quyết các tài liệu Amazon đúng cách. Tôi không biết chuyện gì đã xảy ra nhưng bây giờ nó rất rõ ràng. Hình như tôi có một số đọc để làm. Cảm ơn một lần nữa. –

4

Mà nó có thể vẫn còn quan tâm ..

Với SDK AWS cũ (phiên bản 1), bạn có thể chỉ đơn giản là tạo ra khách hàng S3 mà không có một khu vực hoặc AmazonS3Config. Không cần phải chỉ định một URL dịch vụ, nó sử dụng mặc định, được đề cập ở trên, cho bạn. Thời gian duy nhất bạn thực sự cần khu vực để làm việc với S3 là khi bạn tạo một thùng mà có lẽ hiếm khi là một yêu cầu cho một ứng dụng. Điều này phù hợp với tôi và tất cả thông tin liên lạc tôi thực hiện với S3 đều trên https.

Với SDK AWS mới cho .Net (phiên bản 2 trở lên) có vẻ như tham số vùng là bắt buộc và trên thực tế, AmazonS3Client sẽ ném một ngoại lệ nếu không được cung cấp. Tôi đã thử làm việc xung quanh giới hạn này với chỉ định một URL chung https://s3.amazonaws.com và không thành công, vì SDK mới không thực hiện theo chuyển hướng 301 từ điểm cuối mặc định (US-EAST-1 tôi nghĩ).

Vì vậy, tóm lại, tốt nhất là chỉ định khu vực, ngay cả trên API cũ, để tránh vi phạm trong tương lai. Nếu ứng dụng của bạn đang thực hiện cuộc gọi giữa các vùng và chậm hơn (có thể) và tốn kém hơn, có lẽ tốt nhất là mã của bạn sẽ làm chứng cho điều đó.

Các vấn đề liên quan