2011-12-22 8 views
6

Recentemente ho provato un codice di scrittura per aggiungere ed eliminare il contenuto da un bucket Amazon S3. Sono completamente nuovo per Amazon S3 e Amazon. SDK .Net.Problemi di accesso al bucket che non utilizza la regione USA con .Net SDK

La regione secchio endpoint è http://sqs.eu-west-1.amazonaws.com così ho costruito il mio cliente in questo modo:

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

Se lascio fuori la punta AmazonS3Config ottengo questo errore:

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.

quando ho messo nel AmazonS3Config bit Non ho più ricevuto questo errore, ma non ho alcun accesso a questo bucket in tutto o in nessun altro bucket a cui avrei normalmente accesso. Qualsiasi richiesta che invio restituisce null.

Ho testato il mio codice con altri bucket configurati nella regione standard degli Stati Uniti e tutto funziona correttamente. L'unica differenza è nel metodo CreateAmazonS3Client in cui ho impostato la configurazione con l'endpoint UE.

Qualcuno potrebbe darmi qualche indicazione su come dovrei impostare il mio cliente per lavorare con un secchio nella regione dell'UE (Irlanda). Ho cercato per qualche ora e ogni tutorial o documento che ho seguito non ha funzionato finora.

risposta

15

basta utilizzare il punto finale di serie - 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

Avevo già provato quell'endpoint ma non avevo inserito "CommunicationProtocol = Amazon.S3.Model.Protocol.HTTP" nella configurazione. Aggiungendo questo ha fatto il trucco. Grazie mille per la risposta. –

+6

Se si desidera utilizzare HTTPS, penso che sia necessario utilizzare l'endpoint specifico UE che è 's3-eu-west-1.amazonaws.com'. Stavi usando l'endpoint del servizio Queue semplice. Vedi http://docs.amazonwebservices.com/general/latest/gr/rande.html –

+0

Dio, non ho mai visto i sqs presenti invece di s3. Penso di averlo appena copiato da qualche post invece di affrontare correttamente i documenti Amazon. Non sapevo cosa sarebbe andato storto ma è così ovvio ora. Sembra che abbia qualche lettura da fare. Grazie ancora. –

4

A chi può ancora preoccupazione ..

Con i vecchi SDK AWS (versione 1), si può semplicemente creare il client S3, senza una regione o un AmazonS3Config. Non c'è bisogno di specificare un URL di servizio, utilizza il predefinito, menzionato sopra, per te. L'unica volta in cui hai davvero bisogno della regione per lavorare con S3 è quando crei un bucket che è probabilmente raramente un requisito per un'applicazione. Questo funziona per me e tutte le comunicazioni che eseguo su S3 sono su https.

Con il nuovo SDK AWS per. Net (versione 2 e successive) sembra che il parametro regione sia necessario e infatti lo AmazonS3Client genererebbe un'eccezione se non ne viene fornita una. Ho provato a risolvere questa limitazione specificando un URL generico e non sono riuscito, perché il nuovo SDK non segue il reindirizzamento 301 dall'endpoint predefinito (US-EAST-1 I think).

Quindi, in breve, è meglio specificare la regione, anche sulla vecchia API, per evitare di rompere in futuro. Se la tua applicazione sta effettuando chiamate tra più regioni, e sono più lente (probabilmente) e più costose, è probabilmente meglio che il tuo codice lo confermi.

Problemi correlati