2013-11-04 18 views
10

PHP用のAWS SDKを使用して、S3 Consoleで静的なWebサイトに設定されているバケットにファイルをプログラムでアップロードしようとしています。Amazon AWSのPHPクライアントで適切なエンドポイントを設定するPHP SDK

バケットの名前はfoo.ourdomain.comで、eu-westでホストされています。私はファイルをアップロードできるかどうか試してみて、テストするには、次のコードを使用しています:

PHP Fatal error: Uncaught Aws\S3\Exception\PermanentRedirectException: AWS Error Code: PermanentRedirect, Status Code: 301, AWS Request ID: -, AWS Error Type: client, AWS Error Message: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint: "foo.ourdomain.com.s3.amazonaws.com"., User-Agent: aws-sdk-php2/2.4.8 Guzzle/3.7.4 curl/7.22.0 PHP/5.3.10-1ubuntu3.8

$client = \Aws\S3\S3Client::factory(array('key' => bla, 'secret' => bla)); 
    $client->upload('foo.ourdomain.com', 'test.txt', 'hello world', 'public-read'); 

これはかなりそれはしかし、例にあるようなものですが、私は次の例外を受け取りました

この時点で私はS3 SDKのマニュアルにこれについて言及していないので驚いた。しかし、大丈夫、私は方法のsetEndpointを発見しにコードを調整する:

$client = \Aws\S3\S3Client::factory(array('key' => bla, 'secret' => bla)); 
    $client->setEndpoint('foo.ourdomain.com.s3.amazonaws.com'); 
    $client->upload('foo.ourdomain.com', 'test.txt', 'hello world', 'public-read'); 

私は仕事だろうとの仮定が、私は正確に同じエラーを取得しています。私は二重チェックして、例外のバイト・フォー・バイト例外に記載されているエンドポイントが、2行目で設定しているものと一致します。

私はまた、foo.ourdomain.com.s3-website-eu-west-1.amazonaws.comをエンドポイントとして使用しようとしました(これは、CNAMEがS3コンソールの指示に従ってポイントしているホストです)。どちらもうまくいきませんでした。

私は何かを逃しているに違いないが、どこにも見つからない。 「静的なウェブサイト」に設定されたバケットは、SDKで現在サポートされていない方法で動作が異なる可能性がありますか?もしそうなら、私はそれをdocsや管理コンソールで見つけることはできません。

答えて

19

その解決策は、クライアントの初期化を次のように変更することであった。

$client = \Aws\S3\S3Client::factory(array('key' => bla, 'secret' => bla, 'region' => 'eu-west-1')); 

e。エンドポイントを指定するのではなく、オプション配列内の領域を明示的に設定する必要がありました。私は、サンプルコードは、デフォルトの領域が何であれ使用すると思います。

+0

右のとおり、SDKのデフォルトはグローバルリージョン/エンドポイントです。特定の地域にバケットを作成した場合は、その地域を使用するためにS3Clientを送信する必要があります。 –

+2

奇妙なしかし、エラーでの発言は非常に具体的には、それを修正する方法に固有ですが、またかなり間違って:) – Nanne

5

あなたは、特定の領域にクライアントを初期化したくない場合、および/または次のように呼び出しのgetBucketLocation/setRegionセットを使用して、私は成功している様々な領域で作業する必要があります

// Bucket location is fetched 
$m_bucketLocation = $I_s3->getBucketLocation(array(
     'Bucket' => $s_backupBucket, 
)); 
// Bucket location is specified before operation is made 
$I_s3->setRegion($m_bucketLocation['Location']); 

私はもう1回電話しましたが、工場に介入することなく問題を解決しました。

関連する問題