2015-10-22 130 views
2

該應用程序正在使用carrierwave和carrierwave-aws寶石。當遷移rails版本(碰撞到4.2),ruby版本(2.2.3)並重新部署到相同的臨時服務器時,它遇到了困難。AWS存儲區和區域

AWS桶最初是在免費層創建的,因此俄勒岡州的us-west-2。但是,我發現所有的S3文件都有鏈接到eu-west-1的屬性。 不可否認,我一直在考慮使用歐盟西部地區。但是我不記得做任何配置的變化 - 甚至不知道它被允許在自由層...

所以,是的,我已經配置我上傳初始化有:

config.asset_host = 'https://s3-eu-west-1.amazonaws.com/theapp' 
config.aws_credentials = { 
    region:   'eu-west-1' 
} 

現在用於AWS的控制檯可通過包含以下URL的URL訪問:region=us-west-2

我不明白這是怎麼回事,我正在尋找建議。

+0

在控制檯中,切換到S3,單擊存儲桶並查看屬性。創建存儲桶時,您選擇了一個獨立於控制檯區域的區域。 –

+0

這證實了它。儘管如此,證書應該指向存儲區域,是的? (即不是帳戶的本地區域) – Jerome

+0

您能解釋一下這個部分:我發現所有的S3文件都有鏈接到eu-west-1的屬性嗎? – Mircea

回答

4

儘管出現,並且AWS賬戶沒有「本地」(本地)區域。

控制檯默認爲us-west-2(俄勒岡州),傳統觀點認爲這是AWS擁有最多可用/空閒資源,較低運營成本,較低客戶定價以及最少限制增長的地區,因此,如果用戶手頭沒有足夠的信息來主動選擇部署服務的地區,默認情況下會使用俄勒岡州。

但是對於每個帳戶,沒有特定的地區有任何特殊的地位。如果您在控制檯中切換區域,則控制檯將在下次打開到同一區域。

大多數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交互進行了編輯和重新格式化;一些不相​​關的標題和其他內容被刪除。