2017-12-18 8 views
1

Der Versuch, ein Bild zu einem S3 Eimer, als Blob zu laden, schlägt mit dem folgenden Fehler:Das Hochladen eines Blobs in einen S3-Bucket mithilfe von PutObject funktioniert nicht: SignatureDoesNotMatch. Warum?

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calcul (truncated...) 
SignatureDoesNotMatch (client): The request signature we calculated does not match the signature you provided. Check your key and signing method. - <?xml version="1.0" encoding="UTF-8"?> 

Die Anmeldeinformationen aus einer /.aws/credentials Datei gezogen werden und ich weiß für eine Tatsache, dass sie arbeiten, weil putObject aus Eine Datei funktioniert perfekt. Es ist nur der Blob, der nicht hochgeladen werden kann.

Die S3-Klasse hat die folgenden Teile, die von Interesse sind, in diesem Fall:

class S3_model extends CI_Model { 

private $s3Client; 
private $s3Config = [ 
    'version' => '2006-03-01',  // See `version` parameter documentation here: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/configuration.html 
    'region' => 'eu-central-1' 
]; 

private $bucket = 'tprdev'; 

public function __construct() 
{ 
    parent::__construct(); 
    $this->load->model('log_model'); 
    $this->s3Client = new Aws\S3\S3Client($this->s3Config); 
} 

public function putObjectFromBlob ($key, $blob) 
{ 
    try { 
     $params = [ 
      'Bucket' => $this->bucket, 
      'Key' => $key, 
      'Body' => $blob 
     ]; 

     $this->s3Client->putObject($params); 
     $this->s3Client->waitUntil('ObjectExists', $params); 
    } catch (Exception $e) { 
     $this->log_model->log("{$e->getMessage()}\n{$e->getTraceAsString()}"); 
     return false; 
    } 

    return true; 
} 
} 

Antwort

1

Wie sich herausstellt, ist diese neue Version des SDK, die ich verwendet habe, ist pingelig Objektschlüssel mit einem führender Schrägstrich Ich habe den führenden Schrägstrich entfernt und die Blobs jetzt hochgeladen.

+0

Der Fehler (imho) war tatsächlich in den älteren SDKs zu freizügig. Ein führender Schrägstrich in Objektschlüsseln war immer * technisch * falsch - auf die Gefahr hin, pedantisch zu sein, bedeutet '/' die Wurzel des Buckets, ist aber nicht das erste Zeichen des Objektschlüssels (es gibt kein Objekt mit dem Namen '/') - aber der ältere Code tolerierte es, indem er es als optional behandelte. Ich weiß nicht, ob das ein zufälliges oder absichtliches ("hilfreiches") Design war. +1 für das Aussortieren Ihres eigenen Problems. –

Verwandte Themen