AWS 存储桶和区域

AWS buckets and regions

该应用程序将载波与 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 控制台

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

尽管出现,AWS 账户没有 "home"(本地)区域。

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

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

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

向这些服务发出 API 请求时,您使用的是该地区的端点,您的凭据也包括该地区。

其他服务是全球性的,具有集中管理——这里的例子是 CloudFront、IAM 和 Route 53 托管区域。当您向这些服务发出请求时,您总是使用区域 "us-east-1",因为这是这些服务的中央全球管理的所在地。这些往往是服务是一个分区事件(全球网络的一部分与另一部分隔离)。管理更改被复制到世界各地,但在复制配置后,区域安装可以自主运行而不会对服务产生重大影响。当您在控制台中 select 这些服务时,您会注意到区域更改为 "Global."

S3 是一种混合体,本质上与其他所有不同。当您在控制台中 select S3 时,您会注意到控制台区域也更改为显示 "Global" 并且您可以看到所有存储桶,就像其他全局服务一样。 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 Standard" (us-east-1)。一旦创建了一个存储桶,它就不能移动到不同的区域。在不更改名称的情况下将存储桶 "move" 转移到不同区域的唯一方法是从存储桶中删除所有文件,删除存储桶(您不能删除 non-empty 存储桶),等待一段时间分钟,并在新区域创建存储桶。在删除存储桶后名称在全局可用之前 S3 需要的几分钟内,其他人总是有可能为自己取用该存储桶名称...因此请谨慎选择您的存储桶区域。

S3 API 为清晰起见,对交互进行了编辑和重新格式化;删除了一些不相关的 headers 和其他内容。


¹ 未连接在一起 似乎(乍一看)在某种意义上是矛盾的——例如——你可以订阅一个 SQS queue区域到另一个 SNS 主题,您可以将 RDS 从一个区域复制到另一个区域,并且可以将 EBS 快照和 AMI 从一个区域传输到另一个区域……但是这些 back-channels 不在此处讨论。每个区域的服务的控制平面是隔离和独​​立的。一个区域中的 RDS 基础设施出现问题可能会中断到另一个区域中的 RDS 的复制,但不会影响另一个区域中的 RDS 操作。一个地区的 SNS 中断不会影响另一个地区的 SNS。系统和服务有时具有 cross-region 通信能力来处理客户请求的服务,但每个区域针对这些区域服务的核心操作是独立的。