如何使用Coldfusion在AmazonS3上创建EU存储桶?

如何使用Coldfusion在AmazonS3上创建EU存储桶?,coldfusion,upload,amazon-s3,amazon-web-services,bucket,Coldfusion,Upload,Amazon S3,Amazon Web Services,Bucket,我正在运行Coldfusion8,并且正在尝试使用EU bucket设置它 我可以使用cfc在美国设置水桶,但每当我改变到欧盟设置时,它都不起作用 下面是正在使用的函数: <cffunction name="putBucket" access="public" output="false" returntype="boolean" description="Creates a bucket."> <cfargument name="bucketName" type="s

我正在运行
Coldfusion8
,并且正在尝试使用EU bucket设置它

我可以使用cfc在美国设置水桶,但每当我改变到欧盟设置时,它都不起作用

下面是正在使用的函数:

<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>
将生成一个strXML,如下所示:

 <CreateBucketConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><LocationConstraint>#arguments.storageLocation#</LocationConstraint></CreateBucketConfiguration> 
#参数.存储位置#

这会再次创建
错误请求
错误

如果您在Linux上运行此操作,您也可以使用S3CMD工具

sudo apt-get install s3cmd
然后,您将需要运行配置过程,或者更好,在源代码管理中构建和维护配置,并部署到执行S3命令的服务器

s3cmd --configure
通常,配置包括有关S3帐户的信息(特别是密钥)。确保如果您使用的是一个文件,那么您就正确地设置了该文件的权限,这样您就不必以root用户身份执行s3cmd

然后在你的申请中

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

您需要使用。根据API文档,我认为这些值是:

铲斗的首选地理位置。[允许值:AmazonS3::REGION_US_E1,AmazonS3::REGION_US_W1,AmazonS3::REGION_EU_W1,AmazonS3::REGION_APAC_SE1,AmazonS3::REGION_APAC_NE1]


谢谢你的信息。运行windows。我还没有上传文件,但读取需要是acl=public read。这就是你所说的“…如果你使用一个文件,你就正确地设置了文件的权限…”嗯。好的。然后我不明白:-)你说它不起作用,但实际发生了什么?您的
PUT
请求的返回值是多少?现在我正在将其发布到函数:bucketName=\u my\u bucket\u&acl=public read&storage=eu-west-1&createBucket=Create+bucket。当表单发布到自身时,页面被重新加载,新的bucket不会显示在页面列表中(AWS控制台上也不会显示)。在哪里可以找到put请求的返回值?在您发布的方法中的
cfhttp
请求之后,添加
,然后查看来自Amazon的响应。这应该告诉你为什么亚马逊决定不创建你的bucket.Ah。400错误请求(InvalidLocationConstraint)您对该地区的看法是正确的,但我仍然无法让它工作。请参见上面的我的编辑您需要在
#参数周围添加
。storageLocation#
,这就是为什么它只是在字符串中添加磅符号。我尝试过,但仍然不起作用。与此同时,我刚刚在AWS控制台上创建了一个EU存储桶。在我的s3.cfc测试页面上显示此消息时,尝试访问存储桶或上载任何图像会产生错误(如果它告诉您:搜索XML文档时发生错误。前缀必须在名称范围中解析)在s3.cfc:contents=xmlSearch(data,“/:contents”)中引用此行
<cfexecute name="s3cmd" arguments="mb s3://my-new-bucket-name">