Szukałem w Internecie od ponad dwóch dni i prawdopodobnie przejrzałem większość udokumentowanych online scenariuszy i obejść, ale jak dotąd nic nie działało.
Jestem na AWS SDK dla PHP V2.8.7 działającego na PHP 5.3.
Próbuję połączyć się z moim wiadrem S3 za pomocą następującego kodu:
// Create a `Aws` object using a configuration file
$aws = Aws::factory('config.php');
// Get the client from the service locator by namespace
$s3Client = $aws->get('s3');
$bucket = "xxx";
$keyname = "xxx";
try {
$result = $s3Client->putObject(array(
'Bucket' => $bucket,
'Key' => $keyname,
'Body' => 'Hello World!'
));
$file_error = false;
} catch (Exception $e) {
$file_error = true;
echo $e->getMessage();
die();
}
//
Mój plik config.php jest następujący:
<?php
return array(
// Bootstrap the configuration file with AWS specific features
'includes' => array('_aws'),
'services' => array(
// All AWS clients extend from 'default_settings'. Here we are
// overriding 'default_settings' with our default credentials and
// providing a default region setting.
'default_settings' => array(
'params' => array(
'credentials' => array(
'key' => 'key',
'secret' => 'secret'
)
)
)
)
);
Powoduje następujący błąd:
Podpis żądania, który obliczyliśmy, nie pasuje do podanego przez Ciebie podpisu. Sprawdź swój klucz i metodę podpisywania.
Sprawdziłem już mój klucz dostępu i sekret co najmniej 20 razy, wygenerowałem nowe, użyłem różnych metod przekazywania informacji (tj. Profilu i umieszczania poświadczeń w kodzie), ale w tej chwili nic nie działa.
amazon-web-services
amazon-s3
aws-php-sdk
Joseph Lam
źródło
źródło
secret
wyższy) i używa go do obliczenia podpisu na podstawie Twojego klucza dostępu, aktualnego sygnatury czasowej oraz szeregu innych czynników. Zobacz docs.aws.amazon.com/general/latest/gr/… . To długa perspektywa, ale biorąc pod uwagę, że zawierają one sygnaturę czasową, być może czas twojego lokalnego środowiska jest wyłączony?Content-Length
) w metadanych obiektu. (Wersja długa: bezpośrednio przekazywaliśmy strumień wejściowy z JavyHttpServletRequest
do klienta S3 i przekazywaliśmy gorequest.getContentLength()
jakoContent-Length
metadane; gdy serwlet (losowo) odbierał podzielone żądania (Transfer-Encoding: chunked
),getContentLength()
zwracał-1
- co prowadziłoputObject
do niepowodzenia (losowo). Niejasne; ale najwyraźniej nasza wina, ponieważ mijaliśmy obiekt o nieprawidłowym rozmiarze)Odpowiedzi:
Po dwóch dniach debugowania w końcu odkryłem problem ...
Klucz, który przypisałem obiektowi zaczynał się od kropki tj.
..\images\ABC.jpg
I to spowodowało wystąpienie błędu.Chciałbym, żeby API zapewniało bardziej znaczące i odpowiednie komunikaty o błędzie, niestety, mam nadzieję, że pomoże to komuś innemu!
źródło
+
w kluczu pojawił się znak plus .Content-Type
Otrzymuję ten błąd z niewłaściwymi poświadczeniami. Myślę, że były niewidzialne postacie, kiedy pierwotnie go wklejałem.
źródło
key_hash_lala/key_hash_continues
i wybrałem tylko jedną część. Niestety, jak trudno powiedzieć użytkownikowi „złe hasło, koleś!”?Miałem ten sam problem, gdy próbowałem skopiować obiekt z niektórymi znakami UTF8. Poniżej znajduje się przykład JS:
Rozwiązany przez zakodowanie CopySource za pomocą
encodeURIComponent()
źródło
Ten błąd pojawia się głównie wtedy, gdy przed lub po tajnym kluczu jest spacja
źródło
Właściwie w Javie otrzymywałem ten sam błąd. Po spędzeniu 4 godzin na debugowaniu tego, stwierdziłem, że problem tkwił w metadanych w obiektach S3, ponieważ było miejsce podczas umieszczania kontrolek pamięci podręcznej w plikach s3. To miejsce było dozwolone w 1.6. * wersja, ale w 1.11. * jest niedozwolona i dlatego zgłaszała błąd niezgodności podpisu
źródło
Content-Length
metadaneJeśli żadne z innych wymienionych rozwiązań nie działa dla Ciebie, spróbuj użyć
to polecenie otworzy zestaw opcji z pytaniem o klucze, region i format wyjściowy.
Mam nadzieję że to pomoże!
źródło
U mnie użyłem axios i głucho wysyła nagłówek
więc zmieniam, aby wysłać:
a także musiałem dodać ten typ treści do podpisu AWS
źródło
W poprzedniej wersji aws-php-sdk, przed wycofaniem
S3Client::factory()
metody, można było umieścić część ścieżki pliku lub,Key
jak to się nazywa wS3Client->putObject()
parametrach , na parametrze wiadra. Miałem menedżera plików w środowisku produkcyjnym, używając zestawu SDK v2. Ponieważ metoda fabryczna nadal działała, nie wróciłem do tego modułu po aktualizacji do~3.70.0
. Dzisiaj spędziłem większą część dwóch godzin na debugowaniu, dlaczego zacząłem otrzymywać ten błąd, a skończyło się to na parametrach, które mi przekazałem (które kiedyś działały):Musiałem przenieść
catsinhats
część mojej ścieżki wiadra / klucza doKey
parametru, na przykład:Wydaje mi się, że
Bucket
teraz nazwa jest zakodowana w formacie URL. Po dokładnym sprawdzeniu dokładnej wiadomości, jaką otrzymałem z SDK, znalazłem to:Błąd podczas wykonywania
PutObject
nahttps://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png
Błąd HTTP AWS: błąd klienta:
PUT https://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png
spowodował plik403 Forbidden
To pokazuje,
/
że podanyBucket
przeze mnie parametr przeszedłurlencode()
i jest teraz%2F
.Sposób działania podpisu jest dość skomplikowany, ale problem sprowadza się do zasobnika, a klucz jest używany do generowania zaszyfrowanego podpisu. Jeśli nie pasują dokładnie zarówno do klienta wywołującego, jak i w ramach AWS, żądanie zostanie odrzucone z błędem 403. Komunikat o błędzie faktycznie wskazuje na problem:
Więc
Key
myliłem się, ponieważBucket
myliłem się.źródło
Miałem ten sam błąd w nodejs. Ale dodanie
signatureVersion
konstruktora s3 pomogło mi:źródło
Właśnie doświadczyłem tego, przesyłając obraz do S3 przy użyciu AWS SDK z React Native. Okazało się, że jest to spowodowane przez
ContentEncoding
parametrem.Usunięcie tego parametru „rozwiązało” problem.
źródło
Miałem ten sam problem. Miałem domyślną metodę, PUT ustawioną na zdefiniowanie wstępnie podpisanego adresu URL, ale próbowałem wykonać GET. Błąd wynikał z niedopasowania metody.
źródło
W moim przypadku używałem,
s3.getSignedUrl('getObject')
gdy musiałem używaćs3.getSignedUrl('putObject')
(ponieważ używam PUT do przesyłania mojego pliku), dlatego podpisy się nie zgadzają.źródło
Miałem podobny błąd, ale wydawało mi się, że był on spowodowany ponownym wykorzystaniem użytkownika IAM do pracy z S3 w dwóch różnych środowiskach Elastic Beanstalk. Usunąłem ten symptom, tworząc użytkownika IAM z identycznymi uprawnieniami dla każdego środowiska i to spowodowało, że błąd zniknął.
źródło
W moim przypadku przeanalizowałem adres URL S3 na jego składniki.
Na przykład:
Został przetworzony na:
Posiadanie części ścieżki zawierającej wiodący znak „/” nie powiodło się.
źródło
Innym możliwym problemem może być to, że wartości meta zawierają znaki inne niż US-ASCII. U mnie pomogło to UrlEncode wartości podczas dodawania ich do putRequest:
request.Metadata.Add(AmzMetaPrefix + "artist", HttpUtility.UrlEncode(song.Artist)); request.Metadata.Add(AmzMetaPrefix + "title", HttpUtility.UrlEncode(song.Title));
źródło
Rozwiązałem ten problem, zmieniając uprawnienia publiczne w moim zasobniku AWS s3 i dodając poniższą konfigurację CORS do ustawień zasobnika.
Zobacz dokumentację AWS s3, aby uzyskać więcej informacji.
źródło
W większości przypadków dzieje się tak z powodu niewłaściwego klucza (AWS_SECRET_ACCESS_KEY). Zweryfikuj krzyżowo swój AWS_SECRET_ACCESS_KEY. Mam nadzieję, że to zadziała ...
źródło
Wystąpił ten błąd podczas próby skopiowania obiektu. Naprawiłem to przez zakodowanie copySource. Jest to faktycznie opisane w dokumentacji metody:
źródło
W moim przypadku użyłem S3 (wielkie litery) jako nazwy usługi podczas wysyłania żądania za pomocą listonosza w metodzie autoryzacji podpisu AWS
źródło
Po debugowaniu i spędzeniu dużo czasu, w moim przypadku problem dotyczył access_key_id i secret_access_key, po prostu dwukrotnie sprawdź swoje poświadczenia lub wygeneruj nowe, jeśli to możliwe, i upewnij się, że przekazujesz poświadczenia w params.
źródło
Dla zestawu Python - wersja_sygnatury s3v4
źródło
W moim przypadku nazwa wiadra była błędna, zawierała pierwszą część klucza (bucketxxx / keyxxx) - z podpisem nie było nic złego.
źródło
W moim przypadku (python) nie udało się, ponieważ miałem te dwie linie kodu w pliku, odziedziczone ze starszego kodu
http.client.HTTPConnection._http_vsn = 10 http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'
źródło
Napotkałem to na obrazie Dockera, z punktem końcowym innym niż AWS S3, podczas korzystania z najnowszej wersji
awscli
wersji dostępnej dla Debiana stretch, tj. Wersji 1.11.13.Aktualizacja do wersji CLI 1.16.84 rozwiązała problem.
Aby zainstalować najnowszą wersję CLI z plikiem Dockerfile opartym na obrazie stretch Debiana, zamiast:
Posługiwać się:
źródło
Musiałem ustawić
wcześniej z ruby aws sdk v2 (prawdopodobnie jest coś podobnego do tego w innych językach)
źródło
Nie wiem, czy ktoś przyszedł do tego problemu, próbując przetestować wyjściowy adres URL w przeglądarce, ale jeśli używasz
Postman
i próbujesz skopiować wygenerowany adres URL AWS zRAW
zakładki, z powodu ucieczki odwrotnego ukośnika otrzymasz powyższy błąd .Użyj
Pretty
karty, aby skopiować i wkleić adres URL, aby sprawdzić, czy rzeczywiście działa.Niedawno napotkałem ten problem i to rozwiązanie rozwiązało mój problem. Służy do celów testowych, aby sprawdzić, czy faktycznie pobierasz dane za pośrednictwem adresu URL.
Ta odpowiedź jest odniesieniem do tych, którzy próbują wygenerować pobieranie, tymczasowy link z AWS lub generalnie generują adres URL z AWS do użycia.
źródło
Problemem w moim przypadku był adres URL API Gateway używany do konfigurowania Amplify, który miał dodatkowy ukośnik na końcu ...
Zapytany adres URL wyglądał jak
https://....amazonaws.com/myapi//myendpoint
. Usunąłem dodatkowy slash w conf i zadziałało.Nie jest to najbardziej wyraźny komunikat o błędzie w moim życiu.
źródło
W moim przypadku dzwoniłem do
s3request.promise().then()
nierzetelności, co spowodowało dwukrotne wykonanie żądania, gdy wykonano tylko jedną rozmowę.Chodzi mi o to, że iterowałem przez 6 obiektów, ale zgłoszono 12 żądań (możesz to sprawdzić logując się w konsoli lub debugując sieć w przeglądarce)
Ponieważ sygnatura czasowa drugiego, niechcianego żądania nie zgadza się z oznaczeniem pierwszego, które spowodowało ten problem.
źródło
Wystąpił ten błąd podczas przesyłania dokumentu do CloudSearch za pomocą Java SDK. Problem był spowodowany specjalnym znakiem w przesyłanym dokumencie. Błąd „Podpis żądania, który obliczyliśmy, nie jest zgodny z podanym przez Ciebie. Sprawdź swój tajny klucz dostępu AWS i metodę podpisywania”. jest bardzo myląca.
źródło
wygenerowanie nowego klucza dostępu zadziałało dla mnie.
źródło