2012-08-10 64 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

相关问题