J'ai effectué des recherches sur le Web pendant plus de deux jours, et j'ai probablement parcouru la plupart des scénarios documentés en ligne et des solutions de contournement, mais rien n'a fonctionné pour moi jusqu'à présent.
Je suis sur AWS SDK pour PHP V2.8.7 sous PHP 5.3. J'essaie de me connecter à mon compartiment S3 avec le code suivant:
// 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();
}
//
Mon fichier config.php est le suivant:
<?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'
)
)
)
)
);
Il produit l'erreur suivante:
La signature de demande que nous avons calculée ne correspond pas à la signature que vous avez fournie. Vérifiez votre clé et votre méthode de signature.
J'ai déjà vérifié ma clé d'accès et mon secret au moins 20 fois, en ai généré de nouvelles, utilisé différentes méthodes pour transmettre les informations (profil, informations d'identification incluses dans le code), mais rien ne fonctionne pour le moment.
Après deux jours de débogage, j'ai finalement découvert le problème ...
La clé que j’assignais à l’objet commençait par un point, c.-à-d.
Je souhaite que l'API fournisse un message d'erreur plus significatif et pertinent, hélas, j'espère que cela aidera quelqu'un d'autre!
Je reçois cette erreur avec les mauvais identifiants. Je pense qu'il y avait des personnages invisibles quand je l'ai collé à l'origine.
J'ai eu le même problème lorsque j'ai essayé de copier un objet avec des caractères UTF8. Ci-dessous un exemple JS:
var s3 = new AWS.S3();
s3.copyObject({
Bucket: 'somebucket',
CopySource: 'path/to/Weird_file_name_ðÓpíu.jpg',
Key: 'destination/key.jpg',
ACL: 'authenticated-read'
}, cb);
Résolu en encodant le CopySource avec encodeURIComponent()
En fait, en Java, je recevais la même erreur.Après avoir passé 4 heures à le déboguer, j’ai trouvé que le problème était lié aux métadonnées dans les objets S3, car il y avait de l’espace tout en maintenant des contrôles de cache dans les fichiers s3. version, mais dans 1.11. * il est interdit et génère donc l'erreur de non-concordance de signature
Je viens tout juste d’expérimenter le téléchargement d’une image sur S3 à l’aide du kit AWS SDK avec React Native. Cela s'est avéré être causé par le paramètre ContentEncoding
.
Supprimer ce paramètre "corrige" le problème.
Si aucune des solutions mentionnées ne vous convient, essayez d’utiliser
aws configure
cette commande ouvrira un ensemble d'options demandant les clés, la région et le format de sortie.
J'espère que cela t'aides!
Je l'ai rencontré dans une image Docker, avec un point de terminaison non AWS S3, lors de l'utilisation de la dernière version awscli
disponible pour Debian Stretch, à savoir la version 1.11.13.
La mise à niveau vers la CLI version 1.16.84 a résolu le problème.
Pour installer la dernière version de la CLI avec un fichier Docker basé sur une image étendue Debian, au lieu de:
RUN apt-get update
RUN apt-get install -y awscli
RUN aws --version
Utilisation:
RUN apt-get update
RUN apt-get install -y python-pip
RUN pip install awscli
RUN aws --version
Dans mon cas (python), cela a échoué car j'avais dans le fichier ces deux lignes de code héritées d'un code
http.client.HTTPConnection._http_vsn = 10
http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'
Je devais mettre
Aws.config.update({
credentials: Aws::Credentials.new(access_key_id, secret_access_key)
})
avant avec Ruby aws sdk v2 (il existe probablement quelque chose de similaire à cela dans les autres langues également)
Dans mon cas, j'ai analysé une URL S3 dans ses composants.
Par exemple:
Url: s3://bucket-name/path/to/file
A été analysé dans:
Bucket: bucket-name
Path: /path/to/file
Avoir la partie chemin contenant un '/' initial a échoué à la demande.
J'ai eu une erreur similaire, mais pour moi, cela semblait être dû à la réutilisation d'un utilisateur IAM pour travailler avec S3 dans deux environnements Elastic Beanstalk différents. J'ai traité le symptôme en créant un utilisateur IAM ayant les mêmes autorisations pour chaque environnement, ce qui a permis d'éliminer l'erreur.
Je pourrais résoudre ce problème en définissant des variables d'environnement.
export AWS_ACCESS_KEY=
export AWS_SECRET_ACCESS_KEY=
Dans IntelliJ + py.test, je définis les variables d'environnement avec [Run] > [Edit Configurations] > [Configuration] > [Environment] > [Environment variables]
Pour moi, j'ai utilisé axios et par défaut, il envoie un en-tête
content-type: application/x-www-form-urlencoded
alors je change pour envoyer:
content-type: application/octet-stream
et devait également ajouter ce type de contenu à la signature AWS
const params = {
Bucket: bucket,
Key: key,
Expires: expires,
ContentType = 'application/octet-stream'
}
const s3 = new AWS.S3()
s3.getSignedUrl('putObject', params)
Dans mon cas, le nom de compartiment était incorrect, il comprenait la première partie de la clé (bucketxxx/keyxxx) - la signature ne présentait aucun problème.
Un autre problème possible pourrait être que les méta-valeurs contiennent des caractères non US-ASCII. Pour moi, cela a aidé UrlEncode les valeurs lors de leur ajout à putRequest:
request.Metadata.Add(AmzMetaPrefix + "artist", HttpUtility.UrlEncode(song.Artist));
request.Metadata.Add(AmzMetaPrefix + "title", HttpUtility.UrlEncode(song.Title));