2015-12-24 11 views
5

Założyłem akta AWS. i próbuję zrobić mój pierwszy programowy PUT na S3. Użyłem konsoli, aby stworzyć wiadro i umieścić tam rzeczy. Stworzyłem również podkatalog (myFolder) i upubliczniłem go. Tworzę .aws/złożyć poświadczenia i próbowałem za pomocą kodów przykładowych, ale pojawia się następujący błąd:Błąd podczas wykonywania "PutObject" na AWS, przesyłanie nie powiodło się

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> 

mojego kodu jest

<?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"; 
} 

Jeśli ktoś może mi pomóc, że byłoby świetnie . Dzięki. --Len

Odpowiedz

2

403 sugeruje, że Twój klucz jest niepoprawny lub ścieżka do klucza jest nieprawidłowa. Czy zweryfikowałeś, że pakiet ładuje poprawny klucz w /myFolder/$keyname?

Może pomóc w wypróbowaniu czegoś prostszego (zamiast martwić się o przesyłanie typów plików, ścieżek, uprawnień itp.) Do debugowania.

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

Zrobione z http://docs.aws.amazon.com/aws-sdk-php/v2/guide/service-s3.html Sprawdź również budowniczy doręczenia.

+0

Sprawdziłem aws_access_key_id i jest on poprawny. Wypróbowałem uproszczoną prośbę podaną powyżej i otrzymałem ten sam błąd. Nie wiem, jak sprawdzić, czy tajny klucz jest poprawny, ale ponieważ wykonano go z wycięciem i wklejeniem, nie widzę powodu, aby podejrzewać, że jest niepoprawny. Wygląda mi na problem z konfiguracją. – LenB

+0

Czy próbowałeś po prostu 'file_get_contents' i' echo' klawisz? Ładujesz go obecnie z 'myFolder/my-object-key'. Czy to właściwa ścieżka? Powinieneś być w stanie 'print_r (file_get_contents ('myFolder/my-object-key'))' Problem niekoniecznie jest kluczem jest niepoprawny (jednak byłbyś zaskoczony, że kopiowanie i wklejanie często może powodować niepoprawne znaki, jeśli nie jest bezpieczny), jest to, że ścieżka do klucza jest prawdopodobnie niepoprawna. – Denault

2

Problem polegał na braku uprawnień do wiadra, gdy dodałem, że wszystko działało dobrze.

+0

Ten sam błąd, który nie wyjaśnia. Wiadro jest czytelne, czy S3FullAccess jest niewystarczające? – Kzqai

6

Wygląda na ten sam problem, na który wpadłem. Dodaj zasadę AmazonS3FullAccess do swojego konta AWS.

  • Zaloguj się do AWS.
  • W obszarze Usługi wybierz IAM.
  • Wybierz użytkowników> [Twój użytkownika]
  • Otwarte Permissoins Tab
  • Attach politykę AmazonS3FullAccess na konto
+0

Dzięki za rozwiązanie idealnie dla mnie działa – nitin

0

podejście Braden będzie działać, ale to jest niebezpieczne. Użytkownik będzie miał pełny dostęp do wszystkich swoich zasobników S3 i możliwość zalogowania się do konsoli. Jeśli poświadczenia używane w witrynie zostały naruszone, dobrze ...

Bezpieczniejsze podejście jest:

  1. AWS Console -> IAM -> Polityka -> Tworzenie Polityki
  2. service = S3
  3. Akcje = (tylko wymagane minimum, npLista i Odczyt)
  4. Zasoby -> Specjalny -> wiaderko -> Dodaj ARN (umieścić ARN z zaledwie wiader potrzebne)
  5. Zasoby -> Specjalny -> object -> sprawdzić Wszelkie lub umieścić ARN na konkretnych obiektach
  6. Przegląd i Zapisz, aby utworzyć polityka
  7. AWS Console -> IAM -> Użytkownicy -> Dodaj użytkownika
  8. typ
  9. Access -> zaznaczyć "programowy dostęp" tylko
  10. Następny: Uprawnienia -> Dołącz istniejące zasady bezpośrednio
  11. Wyszukaj i wybierz nowo utworzoną zasadę
  12. Przegląd i zapisać tworzyć użytkownikowi

W ten sposób będziesz miał użytkownikowi dostęp tylko potrzebne.

Powiązane problemy