AWS桶和区域

Jer*_*ome 4 amazon-s3 amazon-web-services carrierwave

该应用程序正在将gemwave与carrierwave-awsgem 结合使用.在迁移rails版本(升级到4.2),ruby版本(2.2.3)并重新部署到同一个登台服务器时遇到了障碍.

AWS桶最初是在免费层创建的,因此俄勒冈州是us-west-2.但是,我发现所有S3文件都有链接到的属性eu-west-1. 不可否认,我一直在修补并考虑使用eu-west-1地区.但是我不记得进行任何配置更改 - 甚至不确定它是否允许在免费套餐中...

所以是的,我必须配置我的上传初始化程序:

config.asset_host = 'https://s3-eu-west-1.amazonaws.com/theapp'
config.aws_credentials = {
  region:            'eu-west-1'
}
Run Code Online (Sandbox Code Playgroud)

现在可以使用包含的URL访问AWS控制台 region=us-west-2

我不明白这是怎么回事,我正在寻找建议.

Mic*_*bot 6

尽管出现了,但AWS账户没有"主页"(本地)区域.

控制台默认为us-west-2(俄勒冈州),传统观点认为这是AWS拥有最多可用/备用资源,降低运营成本,降低客户定价以及增长限制最少的区域,因此如果用户手头没有足够的信息来主动选择他们部署服务的区域,则默认情况下将使用Oregon.

但对于每个帐户,没有特定的地区有任何特殊的地位.如果您在控制台中切换区域,控制台将在下次打开到同一区域.

大多数AWS服务 - EC2,SQS,SNS,RDS(仅举几例)都是严格区域性的:为了可靠性和生存性,这些区域是独立的并且没有连接在一起¹.当您在控制台中的给定区域中时,您只能看到该区域中的EC2资源,该区域中的SQS队列,该区域中的SNS主题等.要查看其他区域中的资源,请在控制台中切换区域.

在向这些服务发出API请求时,您在该区域使用端点,并且您的凭据也包含该区域.

其他服务是全球性的,具有集中管理 - 这里的示例是CloudFront,IAM和Route 53托管区域.当您向这些服务发出请求时,您始终使用"us-east-1"区域,因为这是这些服务的中央全局管理的归属位置.这些服务往往是一个分区事件(全局网络的一部分与另一部分隔离).行政变更在全球范围内被复制,但在复制供应之后,区域设施可以自主运行而不会对服务产生重大影响.在控制台中选择这些服务时,您会注意到该区域更改为"全局".

S3是一种混合体,与基本上所有其他的混合体不同.当您在控制台中选择S3时,您会注意到控制台区域也会更改为显示"全局",您可以像其他全局服务一样查看所有存储桶.S3具有独立的操作区域,但是具有全局命名空间.这些区域在逻辑上是相互连接的,可以在它们之间传递管理消息,并且可以跨区域传输数据(但仅在您故意这样做时 - 否则,数据仍保留在您存储它的区域中).

与其他全局服务不同,S3没有可以处理所有可能请求的单个全局端点.

每次创建存储桶时,都会选择要存储的区域.与该存储桶相关的后续请求必须提交到存储区的区域,并且必须具有正确区域的授权凭据.

如果您向该存储桶的另一个S3区域的端点提交请求,则会收到错误消息,告知您存储区的正确区域.

< HTTP/1.1 301 Moved Permanently
< x-amz-bucket-region: us-east-1
< Server: AmazonS3
<Error>
  <Code>PermanentRedirect</Code>
  <Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message>
  <Bucket>...</Bucket>
  <Endpoint>s3.amazonaws.com</Endpoint>
  <RequestId>...</RequestId>
  <HostId>...</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)

相反,如果您向正确的端点发送S3请求但在身份验证凭据中使用了错误的区域,则会因类似原因收到其他错误:

< HTTP/1.1 400 Bad Request
< x-amz-bucket-region: us-west-2
< Server: AmazonS3
<
<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AuthorizationQueryParametersError</Code>
  <Message>Error parsing the X-Amz-Credential parameter; the region 'eu-west-1' is wrong; expecting 'us-west-2'</Message>
  <Region>us-west-2</Region>
  <RequestId>...</RequestId>
  <HostId>...</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)

同样,该区域是您创建存储桶的区域,或默认的"美国标准"(us-east-1).创建存储桶后,无法将其移动到其他区域.在没有更改名称的情况下将存储桶"移动"到另一个区域的唯一方法是从存储桶中删除所有文件,删除存储桶(不能删除非空存储桶),等待几分钟,然后创建新区域的桶.在删除存储桶之后,在名称全局可用之前S3需要的几分钟内,总是有可能其他人可以自己获取存储桶名称...因此请仔细选择您的存储区域.

为了清楚起见,编辑并重新格式化了S3 API交互; 删除了一些不相关的标头和其他内容.


¹ 没有连接在一起似乎(乍一看)在某种意义上是矛盾的 - 例如 - 您可以将一个区域中的SQS队列订阅到另一个区域中的SNS主题,您可以将RDS从一个区域复制到另一个区域,并且您可以转移EBS快照和AMI从一个地区到另一个地区......但这些反向渠道在这里没有讨论.每个地区的服务控制平面是孤立和独立的.一个区域中的RDS基础结构的问题可能会破坏在另一个区域中向RDS的复制,但不会影响其他区域中的RDS操作.一个地区的SNS中断不会影响另一个地区的SNS.系统和服务有时具有跨区域通信功能,用于处理客户请求的服务,但每个区域的这些区域服务的核心操作是独立的.