我们的AWS语句出现了,我们注意到我们为请求数量加倍收费。
第一次充电是为Asia Pacific (Tokyo)
( ap-northeast-1 )进行的,这很简单,因为它是我们存储桶所在的位置。但是,对US East (N. Virginia)
( us-east-1 )的另一个要求是类似的要求。
长话短说,这似乎是因为我们正在使用aws s3
command而没有通过--region
选项或any of the fallback methods指定区域。
键入aws configure list
会显示region: Value=<not set> Type=None Location=None
。
尽管有这种看似隐藏的指控,但我们的aws s3
命令还是成功的。假设是,我们的请求首先到达 us-east-1 ,但是由于那里没有我们指定的名称的存储桶,因此它会转回并返回 ap-northeast -1 ,它最终会成功,但要获得两次记帐。
运行aws
命令的ec2实例本身就在 ap-northeast-1 中。
因此,问题是,上述假设是否合理地说明了正在发生的事情? (即,这是否是预期的行为。)而且,这对我来说似乎有点阴险,但是否有适当的理由?
答案 0 :(得分:2)
您所看到的是正确的。 aws s3
命令需要知道区域才能访问S3存储桶。
由于未提供此请求,它将向us-east-1
发出请求,这实际上是默认请求-请参见AWS S3 region chart以了解us-east-1
不需要位置限制。
如果S3收到对不在该区域中的存储桶的请求,则它将返回PermanentRedirect响应,其中包含该存储桶的正确区域。 AWS CLI透明地处理此问题,并使用包含该区域的正确端点重复该请求。
查看此操作最简单的方法是在调试模式下运行命令:
aws s3 ls ap-northeast-1-bucket --debug
输出将包括:
DEBUG - Response body:
<?xml version="1.0" encoding="UTF-8"?>
<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>
<Endpoint>ap-northeast-1-bucket.s3.ap-northeast-1.amazonaws.com</Endpoint>
<Bucket>ap-northeast-1</Bucket>
<RequestId>3C4FED2EFFF915E9</RequestId><HostId>...</HostId></Error>
AWS CLI不假定Region与调用EC2实例相同,而是long running confusion/feature request。
其他说明:并非所有的AWS服务都将以此方式自动发现区域,如果未设置“区域”,则将失败。 S3之所以起作用,是因为它使用了固有需要某种形式的发现服务的全局命名空间。