2011-12-22 22 views
6

Recientemente he intentado escribir código para agregar y eliminar contenido de una categoría de Amazon S3. Soy completamente nuevo en Amazon S3 y AmazonWS .Net SDK.Tengo problemas para acceder a la categoría que no usa la región de EE. UU. Con el .Net SDK

El criterio de valoración región de cubo es http://sqs.eu-west-1.amazonaws.com así que construyó mi cliente como esto:

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

Si dejo a cabo el bit AmazonS3Config consigo este error:

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.

cuando pongo en el AmazonS3Config Ya no me da ese error, pero parece que no tengo acceso a este cubo en absoluto o a cualquier otro cubo al que normalmente tendría acceso. Cualquier solicitud que envíe devuelve nulo.

He probado mi código con otros depósitos que están configurados en la región estándar de EE. UU. Y todo funciona bien. La única diferencia está en el método CreateAmazonS3Client donde establezco la configuración con el punto final de la UE.

¿Alguien podría darme alguna orientación sobre cómo debo configurar a mi cliente para trabajar con un cubo en la región de la UE (Irlanda)? He estado buscando durante unas horas y cada tutorial o documento que he seguido no ha funcionado hasta ahora.

Respuesta

15

sólo tiene que utilizar el criterio de valoración estándar - 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

Había intentado ese punto final antes, pero no había puesto "CommunicationProtocol = Amazon.S3.Model.Protocol.HTTP" en la configuración. Agregar eso hizo el truco. Muchas gracias por la respuesta. –

+6

Si desea usar HTTPS, creo que debe usar el extremo específico de la UE que es 's3-eu-west-1.amazonaws.com'. Estaba usando el punto final del servicio de cola simple. Ver http://docs.amazonwebservices.com/general/latest/gr/rande.html –

+0

Dios, nunca vi los sqs allí en vez de s3. Creo que acabo de copiarlo de algún post en algún lugar en lugar de abordar los documentos de Amazon correctamente. No sabía lo que estaba pasando, pero ahora es tan obvio. Parece que tengo algo que leer. Gracias de nuevo. –

4

A quien pueda persiste la preocupación ..

con el antiguo SDK de AWS (versión 1), se puede crear simplemente el cliente S3 sin una región o un AmazonS3Config. No es necesario especificar una URL de servicio, utiliza la predeterminada, mencionada anteriormente, para usted. La única vez que realmente necesita la región para trabajar con S3 es cuando crea un cubo, que probablemente rara vez es un requisito para una aplicación. Esto funciona para mí y todas las comunicaciones que realizo a S3 tienen más de https.

Con el nuevo AWS SDK para .Net (versión 2 y superior) parece que el parámetro de región es obligatorio y, de hecho, el AmazonS3Client arrojaría una excepción si no se proporcionara uno. Intenté solucionar esta limitación especificando una URL https://s3.amazonaws.com genérica y fallida, porque el nuevo SDK no sigue la redirección 301 desde el punto final predeterminado (US-EAST-1 creo).

Por lo tanto, en resumen, es mejor especificar la región, incluso en la antigua API, para evitar romper en el futuro. Si su aplicación realiza llamadas entre regiones, y es más lenta (posiblemente) y más costosa, probablemente sea mejor que su código lo atestigüe.

Cuestiones relacionadas