【问题标题】:how to create a EU bucket on Amazon S3 using Coldfusion?如何使用 Coldfusion 在 Amazon S3 上创建 EU 存储桶?
【发布时间】:2012-08-10 11:53:22
【问题描述】:

我正在运行 Coldfusion8 并正在使用 Amazon S3 Rest Wrapper CFC 尝试使用欧盟存储桶进行设置。

我可以使用 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>

我已将开关添加到欧盟区域 URL,但这也不起作用。

知道我需要做什么才能在欧盟创建存储桶吗?

编辑
我已经确定了区域值。它仍然无法正常工作,因为如果我传递了"" 以外的区域值,则此行:

 <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 错误

【问题讨论】:

  • 您说它不起作用,但实际发生了什么?您的PUT 请求的返回值是多少?
  • 现在我将其发布到函数中:bucketName=_my_bucket_&acl=public-read&storage=eu-west-1&createBucket=Create+Bucket。当表单向自身发布时,页面只是重新加载,新存储桶不会显示在页面列表中(AWS 控制台上也不显示)。在哪里可以找到 put 请求的返回值?
  • 在您发布的方法中的cfhttp 请求之后,添加&lt;cfdump var="#cfhttp#" /&gt;&lt;cfabort /&gt; 并查看来自亚马逊的响应。这应该会告诉您为什么亚马逊决定不创建您的存储桶。
  • 啊。 400 错误请求 (InvalidLocationConstraint)

标签: coldfusion upload amazon-s3 amazon-web-services bucket


【解决方案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]

【讨论】:

  • 您对该地区的看法是正确的,但我仍然无法使其正常工作。见我上面的编辑
  • 你需要一个 &lt;cfoutput&gt; 在你的 #Arguments.storageLocation# 周围,这就是为什么它只是在你的字符串中加入井号。
  • 我试过了,还是不行。与此同时,我刚刚在我的 AWS 控制台上创建了一个 EU 存储桶。虽然这显示在我的 s3.cfc 测试页面上,但尝试访问存储桶或上传任何图像会产生错误(如果它告诉您任何信息:搜索 XML 文档时发生错误。前缀必须在名称范围内解析)到 s3.cfc 中的这一行: contents = xmlSearch(data, "//:Contents")
【解决方案2】:

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

sudo apt-get install s3cmd

然后您将需要运行配置过程,甚至更好,在源代码管理中构建和维护配置,然后部署到服务器以生成 S3 命令

s3cmd --configure

通常,配置包括有关您的 S3 帐户的信息(尤其是密钥)。确保您使用的文件正确设置了文件的权限,这样您就不必以 root 身份执行 s3cmd

然后在你的应用程序中

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

【讨论】:

  • 感谢您的信息。虽然运行窗口。我还没有上传文件,但读取它需要 acl = public-read。这就是你所说的“......如果你使用一个文件,你正确地设置了文件的权限......”的意思吗?
  • 嗯。好的。那我不明白:-)
猜你喜欢
  • 2011-12-23
  • 2011-01-17
  • 2017-07-18
  • 2019-07-14
  • 2017-11-13
  • 1970-01-01
  • 2015-09-14
  • 2012-09-04
  • 1970-01-01
相关资源
最近更新 更多