在Amazon AWS PHP SDK中为S3 Client设置适当的端点

Mar*_*ies 10 php amazon-s3 amazon-web-services

我正在尝试使用AWS SDK for PHP以编程方式将文件上传到设置为S3控制台中的静态网站的存储桶.

该桶名为foo.ourdomain.com,托管在欧洲西部.我正在使用以下代码尝试测试是否可以上传文件:

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

这与示例中的非常相似,但是,我收到以下异常:

PHP致命错误:未捕获的Aws\S3\Exception\PermanentRedirectException:AWS错误代码:PermanentRedirect,状态代码:301,AWS请求ID: - ,AWS错误类型:客户端,AWS错误消息:您尝试访问的存储桶必须得到解决使用指定的端点.请将以后的所有请求发送到此端点:"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

此时我感到很惊讶,因为在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');
Run Code Online (Sandbox Code Playgroud)

我认为这有用,但我得到了完全相同的错误.我已经进行了双重检查,并且在byte-for-byte异常中提到的端点与我在第二行中设置的端点匹配.

我也尝试使用foo.ourdomain.com.s3-website-eu-west-1.amazonaws.com作为端点(这是我们的CNAME根据S3控制台指令指向的主机).也没用.

我必须遗漏一些东西,但我无法在任何地方找到它.也许设置为"静态网站"的存储桶的行为方式与SDK当前不支持的方式不同?如果是这样,我在文档和管理控制台中都找不到它.

Mar*_*ies 19

得到它了.解决方案是将客户端的初始化更改为:

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

即不是指定我需要在options数组中显式设置区域的端点.我猜示示例代码恰好使用默认区域.

  • 奇怪的是,错误中的注释非常具体,如何解决它,但也很错:) (2认同)

mar*_*pin 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']);
Run Code Online (Sandbox Code Playgroud)

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