2017-10-03 19 views
1

私は現在、AWS S3を使用してシステムを作成しています。私は現在、署名されたURLの仮想ホストを設定する際に問題が発生しています。 bucket.s3を指し示すCNAMEレコードをAmazon S3は署名付きURLに仮想ホストを使用します

<Error> 
    <Code>NoSuchKey</Code> 
    <Message>The specified key does not exist.</Message> 
    <Key>bucket/object-key</Key> 
    <RequestId>363C44A299AA1E88</RequestId> 
    <HostId> 
    aCUab3+AD6396dJRMX8rCfYDl9EMjEBDn9somLQa3Ii6Bm6GoJGHT+f/qSZGprcR+3iG/hXC3EQ= 
    </HostId> 
</Error> 

私のバーチャルホストmedia.example.comされています。次のコードは、$source=http://media.example.com/object-key

$host = get_option('dn-s3-host'); 
     if (strpos($host,'http://') === FALSE) $host = 'http://' . $host; 
     if (strpos($source,get_option('dn-s3-host')) !== FALSE) { 
      $s3Client = new Aws\S3\S3Client(array(
       'version' => 'latest', 
       'region' => get_option('dn-s3-region'), 
       'endpoint' => $host, 
       'use_path_style_endpoint' => true, 
       'force_path_style' => true, 
       'credentials' => array(
        // 'region' => get_option('dn-s3-region'), 
        'key'=>get_option('dn-s3-key'), 
        'secret'=>get_option('dn-s3-secret') 
        ) 
      )); 
      $source = str_replace('http://','',$source); 
      $source = ltrim(str_replace(get_option('dn-s3-host'),'',$source),'/'); 
      $cmd = $s3Client->getCommand('GetObject',array(
        'Bucket'=>get_option('dn-s3-bucket'), 
        'Key'=>$source 
       )); 
      $request = $s3Client->createPresignedRequest($cmd,'+2 hours'); 
      $source = (string) $request->getUri(); 
     } 
    } 

このコードが実行さ$host=media.example.comを実行する前に

、私はこのエラーが発生します.amazonaws.com

私がhttp://media.example.com/object-keyにアクセスすると、ファイルが正しく取得されます。署名されたURLにこの仮想ホストを設定するにはどうすればよいですか?

+0

「パススタイル」はバケット名を最初の要素として指定するURLを参照するため、 ''use_path_style_endpoint' => true、または ' 'force_path_style '=> trueのいずれかが間違っているようです。パス、そしてそれはまさにあなたのエラーが示していることです、ここで起こっています。それは2番目かもしれないようです。 –

+0

私は 'force_path_style'を無効にしましたが、何も変わりません。 'use_path_style_endpoint'を無効にすると、署名されたURLは単に' media.example.com'の代わりに 'bucket.media.example.com'になります –

+0

'// 'endpoint' => $ host、 。あなたが意図した通りにこのライブラリを使用していないように感じます。つまり、あなたが達成しようとしているものが完全に有効であっても、このライブラリの機能の意図的な部分ではないかもしれないので、成功するためには一見非論理的なアプローチが必要になるかもしれません。 –

答えて

0

あなたの署名付きURLを使用すると、以下のようなエラーになります無効な場合、

<Error> 
<Code>MissingKey</Code> 
<Message> 
Missing Key-Pair-Id query parameter or cookie value 
</Message> 
</Error> 

エラーは、オブジェクトが存在しないこと、を示しています。あなたのURLで二回バケツを繰り返しているよう

<Key>bucket/object-key</Key> 

が見えるのエラーメッセージに基づいて

、。

実際に署名されたURLを印刷して、URLがどのようなものかを確認してください。これは、あなたがそこで行ったエラーの考えを示します。

希望します。

+0

このエラーの例はCloudFrontエラーです。元の質問にはCloudFrontは言及されていません。 –

+0

オブジェクトキーをgetCommandに送信する前に印刷しようとしましたが、バケット/オブジェクトキーが取得されません –

関連する問題