0

我正在运行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错误

4

2 回答 2

1

您需要为存储位置使用正确的值。从 API 文档中,我相信这些值是:

存储桶的首选地理位置。[允许的值:AmazonS3::REGION_US_E1、AmazonS3::REGION_US_W1、AmazonS3::REGION_EU_W1、AmazonS3::REGION_APAC_SE1、AmazonS3::REGION_APAC_NE1]

于 2012-08-10T15:07:58.710 回答
0

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

sudo apt-get install s3cmd

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

s3cmd --configure

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

然后在你的应用程序中

<cfexecute name="s3cmd" arguments="mb s3://my-new-bucket-name">
于 2012-08-10T12:50:06.557 回答