Tenho pesquisado na web há mais de dois dias e provavelmente já examinei a maioria dos cenários e soluções alternativas documentados on-line, mas nada funcionou para mim até agora.
Estou no AWS SDK para PHP V2.8.7 em execução no PHP 5.3.
Estou tentando me conectar ao meu intervalo S3 com o seguinte código:
// 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();
}
//
Meu arquivo config.php é o seguinte:
<?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'
)
)
)
)
);
Ele está produzindo o seguinte erro:
A assinatura da solicitação que calculamos não corresponde à assinatura que você forneceu. Verifique sua chave e método de assinatura.
Já verifiquei minha chave de acesso e segredo pelo menos 20 vezes, gerei novos, usei métodos diferentes para passar as informações (ou seja, perfil e inclusão de credenciais no código), mas nada está funcionando no momento.
amazon-web-services
amazon-s3
aws-php-sdk
Joseph Lam
fonte
fonte
secret
superior) e a usa para calcular uma assinatura com base em sua chave de acesso, o carimbo de data / hora atual, além de vários outros fatores. Consulte docs.aws.amazon.com/general/latest/gr/… . É uma possibilidade remota, mas, considerando que incluem o carimbo de data / hora, talvez o horário do seu ambiente local esteja errado.Content-Length
) nos metadados do objeto. (Versão longa: estávamos passando diretamente o fluxo de entrada de um JavaHttpServletRequest
para o cliente S3, e passandorequest.getContentLength()
porContent-Length
meio de metadados; quando o servlet estava (aleatoriamente) recebendo solicitações fragmentadas (Transfer-Encoding: chunked
),getContentLength()
estava retornando-1
- o que levouputObject
à falha (aleatoriamente). Obscuro; mas claramente nossa culpa, porque estávamos passando um tamanho de objeto incorreto.)Respostas:
Após dois dias de depuração, finalmente descobri o problema ...
A chave que eu estava atribuindo ao objeto começava com um ponto
..\images\ABC.jpg
, isto é , e isso causava o erro.Desejo que a API forneça mensagens de erro mais significativas e relevantes, infelizmente, espero que isso ajude alguém por aí!
fonte
+
na minha chave.Content-Type
Recebo este erro com as credenciais erradas. Acho que havia personagens invisíveis quando colei originalmente.
fonte
key_hash_lala/key_hash_continues
e ele selecionou apenas uma parte. Infelizmente, é difícil dizer ao usuário "senha errada, cara!"?Tive o mesmo problema ao tentar copiar um objeto com alguns caracteres UTF8. Abaixo está um exemplo de JS:
Resolvido ao codificar o CopySource com
encodeURIComponent()
fonte
Este erro parece ocorrer principalmente se houver um espaço antes ou depois da sua chave secreta
fonte
Na verdade, em Java, eu estava recebendo o mesmo erro. Depois de passar 4 horas para depurá-lo, descobri que o problema estava nos metadados em Objetos S3, pois havia espaço ao sentar os controles de cache em arquivos s3. Esse espaço era permitido em 1.6. * versão, mas em 1.11. * não é permitido e, portanto, estava gerando o erro de incompatibilidade de assinatura
fonte
Content-Length
nos metadadosPara mim usei axios e por surdo manda cabeçalho
então eu mudo para enviar:
e também teve que adicionar este Content-Type à assinatura AWS
fonte
Se nenhuma das outras soluções mencionadas funcionar para você, tente usar
este comando abrirá um conjunto de opções solicitando chaves, região e formato de saída.
Espero que isto ajude!
fonte
Em uma versão anterior do aws-php-sdk, antes da depreciação do
S3Client::factory()
método, você tinha permissão para colocar parte do caminho do arquivo, ouKey
como é chamado nosS3Client->putObject()
parâmetros , no parâmetro bucket. Tive um gerenciador de arquivos em uso em produção, usando o SDK v2. Como o método de fábrica ainda funcionava, não visitei novamente este módulo depois de atualizar para~3.70.0
. Hoje gastei quase duas horas depurando porque comecei a receber esse erro, e acabou sendo devido aos parâmetros que eu estava passando (que funcionavam):Tive que mover a
catsinhats
parte do meu caminho de intervalo / chave para oKey
parâmetro, assim:O que eu acredito que está acontecendo é que o
Bucket
nome agora está sendo codificado por URL. Após uma inspeção mais detalhada da mensagem exata que estava recebendo do SDK, encontrei o seguinte:Erro ao executar
PutObject
emhttps://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png
Erro HTTP AWS: Erro do cliente:
PUT https://s3.amazonaws.com/awesomecatpictures%2Fcatsinhats/whitecats/white_cat_in_hat1.png
resultou em um403 Forbidden
Isso mostra que o que
/
eu forneci ao meuBucket
parâmetro já passouurlencode()
e agora está%2F
.A maneira como a assinatura funciona é bastante complicada, mas o problema se resume ao intervalo e à chave usados para gerar a assinatura criptografada. Se eles não corresponderem exatamente no cliente de chamada e dentro da AWS, a solicitação será negada com um 403. A mensagem de erro realmente aponta o problema:
Então, eu
Key
estava errado porque euBucket
estava errado.fonte
Eu tive o mesmo erro no nodejs. Mas adicionar o
signatureVersion
construtor s3 me ajudou:fonte
No meu caso, eu estava usando
s3.getSignedUrl('getObject')
quando precisava usars3.getSignedUrl('putObject')
(porque estou usando um PUT para fazer upload do meu arquivo), por isso as assinaturas não coincidem.fonte
Para conjunto Python - assinatura_version s3v4
fonte
Acabei de fazer o upload de uma imagem para S3 usando o SDK da AWS com React Native. Descobriu-se que era causado pelo
ContentEncoding
parâmetro.A remoção desse parâmetro "corrigiu" o problema.
fonte
Eu tive o mesmo problema. Eu tinha o método padrão, PUT configurado para definir a URL pré-assinada, mas estava tentando executar um GET. O erro foi devido à incompatibilidade de método.
fonte
Eu tive um erro semelhante, mas para mim parecia ser causado pela reutilização de um usuário IAM para trabalhar com o S3 em dois ambientes diferentes do Elastic Beanstalk. Tratei o sintoma criando um usuário IAM com permissão idêntica para cada ambiente e isso fez o erro desaparecer.
fonte
No meu caso, analisei um url S3 em seus componentes.
Por exemplo:
Foi analisado em:
Ter a parte do caminho contendo um '/' inicial falhou na solicitação.
fonte
Outro possível problema pode ser que os metavalores contenham caracteres não US-ASCII. Para mim, ajudou a UrlEncode os valores ao adicioná-los ao putRequest:
request.Metadata.Add(AmzMetaPrefix + "artist", HttpUtility.UrlEncode(song.Artist)); request.Metadata.Add(AmzMetaPrefix + "title", HttpUtility.UrlEncode(song.Title));
fonte
Resolvi esse problema alterando as permissões públicas em meu bucket AWS s3 e adicionando a configuração CORS abaixo às configurações de meu bucket.
Consulte a documentação do AWS s3 para obter mais informações.
fonte
Na maioria das vezes, isso acontece por causa da chave errada (AWS_SECRET_ACCESS_KEY). Faça uma verificação cruzada de seu AWS_SECRET_ACCESS_KEY. Espero que funcione ...
fonte
Recebi este erro ao tentar copiar um objeto. Eu consertei codificando o copySource. Na verdade, isso está descrito na documentação do método:
fonte
No meu caso, eu estava usando S3 (maiúsculas) como nome de serviço ao fazer a solicitação usando carteiro no método de autorização de assinatura da AWS
fonte
Depois de depurar e gastar muito tempo, no meu caso, o problema era com access_key_id e secret_access_key, apenas verifique suas credenciais ou gere uma nova se possível e certifique-se de que está passando as credenciais em params.
fonte
No meu caso, o nome do intervalo estava errado, ele incluía a primeira parte da chave (bucketxxx / keyxxx) - não havia nada de errado com a assinatura.
fonte
No meu caso (python) falhou porque eu tinha essas duas linhas de código no arquivo, herdadas de um código mais antigo
http.client.HTTPConnection._http_vsn = 10 http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'
fonte
Eu encontrei isso em uma imagem Docker, com um endpoint não AWS S3, ao usar o mais recente
awscli
versão recente disponível para extensão do Debian, ou seja, versão 1.11.13.O upgrade para a versão CLI 1.16.84 resolveu o problema.
Para instalar a versão mais recente da CLI com um Dockerfile baseado em uma imagem esticada do Debian, em vez de:
Usar:
fonte
Eu tive que definir
antes com o ruby aws sdk v2 (provavelmente há algo semelhante a isso nas outras línguas também)
fonte
Não sei se alguém teve esse problema ao tentar testar o URL de saída no navegador, mas se você estiver usando
Postman
e tentar copiar o url gerado do AWS daRAW
guia, por causa de barras invertidas de escape, você obterá o erro acima .Use a
Pretty
guia para copiar e colar o url para ver se ele realmente funciona.Encontrei esse problema recentemente e essa solução resolveu o meu problema. É para fins de teste, para ver se você realmente recupera os dados por meio do url.
Esta resposta é uma referência para aqueles que tentam gerar um download, um link temporário da AWS ou geralmente gerar uma URL da AWS para usar.
fonte
O problema no meu caso era o URL do API Gateway usado para configurar o Amplify que tinha uma barra extra no final ...
O url consultado parecia
https://....amazonaws.com/myapi//myendpoint
. Eu removi a barra extra no conf e funcionou.Não é a mensagem de erro mais explícita da minha vida.
fonte
No meu caso, eu estava chamando
s3request.promise().then()
incorreclty, o que causou duas execuções da solicitação ocorrendo quando apenas uma chamada foi feita.O que quero dizer é que eu estava iterando por meio de 6 objetos, mas 12 solicitações foram feitas (você pode verificar fazendo login no console ou depurando rede no navegador)
Como o carimbo de data / hora da segunda solicitação indesejada não correspondia à assinatura da primeira, isso gerou esse problema.
fonte
Recebi este erro ao fazer o upload do documento para CloudSearch por meio do Java SDK. O problema era devido a um caractere especial no documento a ser carregado. O erro "A assinatura da solicitação que calculamos não corresponde à assinatura que você forneceu. Verifique sua chave de acesso secreta da AWS e o método de assinatura." é muito enganador.
fonte
gerar uma nova chave de acesso funcionou para mim.
fonte