AWS桶和区域

时间:2015-10-22 11:09:42

标签: amazon-web-services amazon-s3 carrierwave

该应用程序正在将carrierwave与carrierwave-aws gem结合使用。它在迁移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'
}

现在可以使用包含region=us-west-2

的URL访问AWS控制台

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

1 个答案:

答案 0 :(得分:7)

尽管有出现,但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>

相反,如果您向正确的端点发送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>

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

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

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