2012-08-10 65 views
0

我正在運行Coldfusion8,並正在使用​​嘗試使用EU存儲桶進行設置。如何使用Coldfusion在Amazon S3上創建一個EU桶?

我可以使用cfc在美國設置桶,但每當我更改爲EU設置時,它都不起作用。

這裏是正在使用的功能:

<cffunction name="putBucket" access="public" output="false" returntype="boolean" description="Creates a bucket."> 
    <cfargument name="bucketName" type="string" required="true"> 
    <cfargument name="acl" type="string" required="false" default="public-read"> 
    <cfargument name="storageLocation" type="string" required="false" default=""> 

    <cfset var strXML = ""> 
    <cfset var dateTimeString = GetHTTPTimeString(Now())> 
    <cfset var destination = "http://s3.amazonaws.com/"> 

    <!--- Create a canonical string to send based on operation requested ---> 
    <cfset var cs = "PUT\n\ntext/html\n#dateTimeString#\nx-amz-acl:#arguments.acl#\n/#arguments.bucketName#"> 

    <cfset var signature = createSignature(cs)> 
    <!--- added switch to EU ---> 
    <cfif arguments.storageLocation EQ "EU"> 
     <cfset destination = "http://s3-eu-west-1.amazonaws.com/"> 
    </cfif> 

    <!--- Create a proper signature ---> 
    <cfif compare(arguments.storageLocation,'')> 
     <cfsavecontent variable="strXML"> 
      <CreateBucketConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><LocationConstraint>#arguments.storageLocation#</LocationConstraint></CreateBucketConfiguration> 
     </cfsavecontent> 
    <cfelse> 
     <cfset strXML = ""> 
    </cfif> 

    <!--- put the bucket via REST ---> 
    <cfhttp method="PUT" url="#destination##arguments.bucketName#" charset="utf-8"> 
     <cfhttpparam type="header" name="Content-Type" value="text/html"> 
     <cfhttpparam type="header" name="Date" value="#dateTimeString#"> 
     <cfhttpparam type="header" name="x-amz-acl" value="#arguments.acl#"> 
     <cfhttpparam type="header" name="Authorization" value="AWS #variables.accessKeyId#:#signature#"> 
     <cfhttpparam type="body" value="#trim(strXML)#"> 
    </cfhttp> 

    <cfreturn true> 
</cffunction> 

我已經加入了切換到歐盟地區的網址,但是這也不管用。

任何想法,我需要做什麼,才能在歐盟創建一個桶?

編輯
我有固定的區域值。它仍然無法正常工作艱難,因爲如果我通過比""以外的區域價值,這條線:

<cfif compare(arguments.storageLocation,'')> 
    <cfsavecontent variable="strXML"> 
     <CreateBucketConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><LocationConstraint>#arguments.storageLocation#</LocationConstraint></CreateBucketConfiguration> 
    </cfsavecontent> 
<cfelse> 
    <cfset strXML = ""> 
</cfif> 

會產生strXML像這樣:

<CreateBucketConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><LocationConstraint>#arguments.storageLocation#</LocationConstraint></CreateBucketConfiguration> 

,再次創造了bad request錯誤

+0

你說這是行不通的,但實際上發生了什麼?你的'PUT'請求的返回值是什麼? – 2012-08-10 13:25:03

+0

現在我正在發佈這個函數:bucketName = _my_bucket_&acl = public-read&storage = eu-west-1&createBucket = Create + Bucket。當表單發佈到自身時,頁面將重新加載,並且新的存儲桶不會顯示在頁面列表中(在AWS控制檯上都不會顯示)。我在哪裏可以找到來自放置請求的返回值? – frequent 2012-08-10 13:30:46

+1

在您發佈的方法中發出'cfhttp'請求後,添加''並查看來自Amazon的響應。這應該告訴你爲什麼亞馬遜決定不創建你的存儲桶。 – 2012-08-10 14:36:48

回答

1

您需要使用proper values for the storage location。從API文檔中,我相信這些值是:

存儲桶的首選地理位置。 [允許的值:AmazonS3 :: REGION_US_E1,AmazonS3 :: REGION_US_W1,AmazonS3 :: REGION_EU_W1,AmazonS3 :: REGION_APAC_SE1,AmazonS3 :: REGION_APAC_NE1]

+0

好的。嘗試這一點。必須是錯誤的值。 – frequent 2012-08-10 15:13:18

+0

你對這個地區是正確的,但我仍然無法實現它的工作。看到我上面的編輯 – frequent 2012-08-16 12:18:08

+0

你需要'#Arguments.storageLocation#'周圍的'',這就是爲什麼它只是把磅符號放在你的字符串中。 – 2012-08-16 14:25:39

0

如果你在Linux上運行這個,你可以使用S3CMD工具

sudo apt-get install s3cmd 

然後,您將需要運行配置過程,甚至更好,建立和源代碼管理維護的配置和部署,以使S3服務器命令

s3cmd --configure 

一般而言,配置包括的信息(尤其是關鍵)關於你的S3賬戶。確保如果你用你的文件正確設置權限的文件,這樣就不必執行s3cmd的爲根

,然後在你的應用程序

<cfexecute name="s3cmd" arguments="mb s3://my-new-bucket-name"> 
+0

感謝您的信息。儘管運行窗口。我沒有上傳文件,但是讀取它需要acl = public-read。這就是你所說的「......如果你使用的文件正確設置了文件的權限......」 – frequent 2012-08-10 12:54:16

+0

否 - 它更像是文件 – 2012-08-10 13:16:00

+0

hm上的chmod,chown用法。好。那麼我不明白:-) – frequent 2012-08-10 13:17:19

相關問題