当前位置: 首页 > 知识库问答 >
问题:

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

钱卓君
2023-03-14

我试图使用AWS SDK for PHP以编程方式将文件上传到一个bucket,该bucket在S3控制台中设置为静态网站。

这个桶名为foo。我们的域名。com并托管在欧盟西部。我正在使用以下代码尝试测试是否可以上载文件:

  $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错误消息:您尝试访问的存储桶必须使用指定的endpoint进行寻址。请将所有未来的请求发送到此endpoint:“foo.ourdomain.com.s3.amazonaws.com”。,用户代理:aws-sdk-php2/2.4.8古兹/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');

我认为这是可行的,但我得到了完全相同的错误。我已经进行了双重检查,异常逐字节中提到的endpoint与我在第二行中设置的endpoint相匹配。

我也试过使用foo。我们的域名。通用域名格式。s3-website-eu-west-1。amazonaws。com作为endpoint(根据S3控制台说明,这是CNAME指向的主机)。也不起作用。

我一定错过了什么,但我到处都找不到。也许设置为“静态网站”的bucket的行为与SDK当前不支持的不同?如果是这样的话,我在文档和管理控制台中都找不到提到它的地方。

共有2个答案

章威
2023-03-14

如果您不想将客户端初始化到特定区域和/或您需要使用不同的区域,我已经成功地使用了getBucketLoction/setArea调用集,如下所示:

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

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

穆鸿卓
2023-03-14

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

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

一、 e.我需要在选项数组中显式设置区域,而不是指定endpoint。我猜示例代码碰巧使用了默认区域。

 类似资料:
  • 自定义成菜单 说明: 1)启用该功能后,直播客户端可以通过自定义菜单的方式加载用户自定义的网页,方便结合自身业务进行交互操作(客户端5.0.0以上版本支持) 问卷设置 说明: 1)在直播管理页面点击 “问卷设置”,启用该功能后,直播客户端可以通过接口请求的方式将用户问卷库中的问卷导入到客户端中使用 2)关于问卷设置的具体功能及使用方法,请参考:问卷接口开发指南 菜单设置 说明: 1)支持对客户端的

  • 问题内容: 我正在尝试设置HTTP客户端,以便它使用代理,但是我不太明白该怎么做。该文档有多个对“代理”的引用,但是似乎没有一个功能允许定义代理。我需要的是这样的: 知道如何在Go中执行此操作吗? 问题答案: lukad是正确的,您可以设置环境变量,如果这样做,Go将默认使用它。 重击: 走: 您还可以构造自己的http.Client,无论环境如何配置,该客户端都必须使用代理: 如果您不能依赖环境

  • WebSocketClient 结构体指针上只有如下两个可设置的字段: Header 字段 用来设置自定义的 HTTP 头信息。 MaxConcurrentRequests 方法 该方法返回最大并发请求数。 SetMaxConcurrentRequests 方法 该方法用于设置最大并发请求数,当并发请求超过该设置之后,后面的请求将会排队等待。该设置默认值为 10。

  • TCPClient 除了包含上面的继承自 SocketClient 的设置以外,还有以下几个可以设置的字段: Linger 字段 用于设置当连接中仍有数据等待发送或接受时的 Close 方法的行为。 如果其值小于 0(默认),Close 方法立即返回,操作系统停止后台数据发送;如果其值等于 0,Close 立刻返回,操作系统丢弃任何未发送或未接收的数据;如果其值大于 0,Close 方法阻塞最多

  • TCPClient 和 UnixClient 这两个结构体包含 SocketClient 这个匿名字段,因此,SocketClient 上的字段和方法都会被继承。 ReadBuffer 字段 设置与连接相关的操作系统接收缓冲区的大小。当为 0 时,表示不进行设置,使用系统默认值。 WriteBuffer 字段 设置与连接相关的操作系统发送缓冲区的大小。当为 0 时,表示不进行设置,使用系统默认值。

  • FastHTTPClient 结构体指针上还定义了如下特殊字段: Client 字段 该字段是一个匿名字段,类型为 fasthttp.Client,你可以通过对它上面的字段进行设置来改变 FastHTTP 客户端的一些特殊设置。