2015-12-24 17 views
5

Ho stabilito un accs AWS. e sto provando a fare il mio primo PUT programmatico in S3. Ho usato la console per creare un secchio e mettere le cose lì. Ho anche creato una sottodirectory (myFolder) e l'ho resa pubblica. Ho creato il mio .aws/file di credenziali e hanno provato ad utilizzare i codici di esempio, ma ottengo il seguente errore:Errore durante l'esecuzione di "PutObject" su AWS, upload fallito

Error executing "PutObject" on "https://s3.amazonaws.com/gps-photo.org/mykey.txt"; AWS HTTP error: Client error: `PUT https://s3.amazonaws.com/gps-photo.org/mykey.txt` resulted in a `403 Forbidden` response: 
<?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>FC49CD (truncated...) 
AccessDenied (client): Access Denied - <?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>AccessDenied</Code><Message>Access Denied</Message <RequestId>FC49CD15567FB9CD</RequestId><HostId>1GTYxjzzzhcL+YyYsuYRx4UgV9wzTCQJX6N4jMWwA39PFaDkK2B9R+FZf8GVM6VvMXfLyI/4abo=</HostId></Error> 

mio codice è

<?php 

// Include the AWS SDK using the Composer autoloader. 
require '/home/berman/vendor/autoload.php'; 
use Aws\S3\S3Client; 
use Aws\S3\Exception\S3Exception; 
$bucket = 'gps-photo.org'; 
$keyname = 'my-object-key'; 
// Instantiate the client. 
$s3 = S3Client::factory(array(
    'profile' => 'default', 
    'region' => 'us-east-1', 
    'version' => '2006-03-01' 
)); 
try { 
    // Upload data. 
    $result = $s3->putObject(array(
     'Bucket' => $bucket, 
     'Key' => "myFolder/$keyname", 
     'Body' => 'Hello, world!', 
     'ACL' => 'public-read' 
    )); 
    // Print the URL to the object. 
    echo $result['ObjectURL'] . "\n"; 
} catch (S3Exception $e) { 
    echo $e->getMessage() . "\n"; 
} 

Se qualcuno mi può dare una mano, che sarebbe grande . Grazie. --Len

risposta

2

Il 403 indica che la chiave non è corretta oppure che il percorso della chiave non è corretto. Hai verificato che il pacchetto stia caricando la chiave corretta in /myFolder/$keyname?

Potrebbe essere utile provare qualcosa di più semplice (anziché preoccuparsi di caricare tipi di file, percorsi, permessi, ecc.) Per eseguire il debug.

$result = $client->listBuckets(); 
foreach ($result['Buckets'] as $bucket) { 
    // Each Bucket value will contain a Name and CreationDate 
    echo "{$bucket['Name']} - {$bucket['CreationDate']}\n"; 
} 

Tratto da http://docs.aws.amazon.com/aws-sdk-php/v2/guide/service-s3.html Verificate anche il costruttore di servizio lì.

+0

Ho controllato aws_access_key_id ed è corretto. Ho provato la richiesta semplificata che hai dato sopra e ho ottenuto lo stesso errore. Non so come controllare se la chiave segreta è corretta, ma dal momento che è stata eseguita con copia e incolla, non vedo alcun motivo per sospettare che sia errata. Sembra un problema di configurazione per me. – LenB

+0

Hai provato a semplicemente 'file_get_contents' e' echo' la chiave? Lo stai caricando attualmente da "myFolder/my-object-key". È il percorso corretto? Dovresti essere in grado di 'print_r (file_get_contents ('myFolder/my-object-key'))' Il problema non è necessariamente la chiave non è corretta (comunque sarai sorpreso che il copia e incolla possa spesso produrre caratteri errati se tu non sono sicuro), è che il percorso della chiave è probabilmente errato. – Denault

2

Il problema era la mancanza di autorizzazioni sul secchio stesso una volta che ho aggiunto che tutto funzionava bene.

+0

Lo stesso errore, questo non riesce a chiarire. Il bucket è leggibile, S3FullAccess non è abbastanza? – Kzqai

6

Sembra lo stesso problema in cui mi sono imbattuto. Aggiungi una politica AmazonS3FullAccess al tuo account AWS.

  • Accedi ad AWS.
  • In Servizi selezionare IAM.
  • Seleziona utenti> [tuo utente]
  • Aprire Permissoins Tab
  • Fissare la politica AmazonS3FullAccess all'account
+0

Grazie per la soluzione, funziona perfettamente per me – nitin

0

approccio di Braden funzionerà, ma è pericoloso. L'utente avrà pieno accesso a tutti i tuoi bucket S3 e alla possibilità di accedere alla console. Se le credenziali utilizzate nel sito sono compromessi, ben ...

un approccio più sicuro è:

  1. AWS Console -> IAM -> Policies -> Crea criterio
  2. Service = S3
  3. Azioni = (solo il minimo richiesto, ad esLista e Leggi)
  4. Risorse -> specifico -> bucket -> Aggiungi ARN (mettere l'ARN dei soli secchi necessario)
  5. Risorse -> specifico -> oggetto -> controllare qualsiasi o mettere l'ARN dispone di oggetti specifici
  6. Review e su Salva per creare la politica
  7. AWS Console -> IAM -> utenti -> Aggiungi utente
  8. tipo
  9. di accesso -> selezionare "accesso programmatico" solo
  10. Avanti: Autorizzazioni -> Allega politiche esistenti direttamente
  11. Cerca e seleziona la tua nuova politica
  12. Review e salvare per creare utente

In questo modo si avrà un utente con solo l'accesso necessario.

Problemi correlati