在 Amazon AWS PHP SDK 中为 S3 客户端设置适当的终端节点


Set proper endpoint in for S3 Client in Amazon AWS PHP SDK

我正在尝试使用适用于 PHP 的 AWS 开发工具包以编程方式将文件上传到 S3 控制台中设置为静态网站的存储桶。

存储桶名为 foo.ourdomain.com,托管在 eur-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''异常''永久重定向异常:AWS 错误代码:永久重定向,状态代码: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 控制台说明指向的主机)。也没用。

我一定错过了什么,但我在任何地方都找不到它。也许设置为"静态网站"的存储桶以开发工具包当前不支持的方式表现不同?如果是这样,我在文档和管理控制台中都找不到提及它的内容。

知道了。解决方案是将客户端的初始化更改为:

$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']);

有一个额外的电话,但解决了我的问题,而无需干预工厂。