簡體   English   中英

在 Amazon AWS PHP SDK 中為 S3 客戶端設置適當的端點

[英]Set proper endpoint in for S3 Client in Amazon AWS PHP SDK

我正在嘗試使用適用於 PHP 的 AWS 開發工具包以編程方式將文件上傳到在 S3 控制台中設置為靜態網站的存儲桶。

該存儲桶名為 foo.ourdomain.com,托管在 eu-west。 我正在使用以下代碼來嘗試測試我是否可以上傳文件:

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

這與示例中的情況非常相似,但是,我收到了以下異常:

PHP 致命錯誤:未捕獲的 Aws\\S3\\Exception\\PermanentRedirectException:AWS 錯誤代碼:PermanentRedirect,狀態代碼:301,AWS 請求 ID:-,AWS 錯誤類型:客戶端,AWS 錯誤消息:必須解決您嘗試訪問的存儲桶使用指定的端點。 請將所有未來的請求發送到此端點:“foo.ourdomain.com.s3.amazonaws.com”。,用戶代理:aws-sdk-php2/2.4.8 Guzzle/3.7.4 curl/7.22.0 PHP/5.3 .10-1ubuntu3.8

在這一點上我很驚訝,因為 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');

我認為那行得通,但我得到了完全相同的錯誤。 我已經仔細檢查過,異常字節對字節中提到的端點與我在第二行中設置的端點相匹配。

我還嘗試使用 foo.ourdomain.com.s3-website-eu-west-1.amazonaws.com 作為端點(這是我們的 CNAME 根據 S3 控制台說明指向的主機)。 也沒有用。

我一定是遺漏了什么,但我在任何地方都找不到。 也許設置為“靜態網站”的存儲桶以 SDK 當前不支持的方式表現不同? 如果是這樣,我在文檔和管理控制台中都找不到提及它。

知道了。 解決方案是將客戶端的初始化更改為:

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

即,我不需要指定一個端點,而是在選項數組中顯式設置區域。 我猜示例代碼碰巧使用了默認區域。

如果您不想將客戶端初始化到特定區域和/或您需要使用不同的區域,我已經成功地使用了 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']);

我有一個額外的電話,但無需干預工廠即可解決我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM