S3存储桶命名问题

时间:2014-06-07 13:01:49

标签: amazon-web-services amazon-s3

尝试将文件上传到S3时,我遇到了一些奇怪的行为。我使用的是Symfony2 Bundle,它只是AWS SDK第1版的包装器。

首先,如果我运行以下代码,它会在S3中创建一个存储桶并成功上传一个文件。

$s3 = $this->container->get('aws_s3');
    $s3->createBucket('my.first.test.bucket', 's3-eu-west-1.amazonaws.com');
    $response = $s3->createObject('my.first.test.bucket', 'test1.txt', array(
        'body' => 'This is my body text.'
    ));
    var_dump($response);

如果我然后将文件名更改为' test2.txt'并重新运行此操作也会成功将文件上载到存储桶,而无需创建具有相同名称的新存储桶。但是,如果我尝试注释掉createBucket行,我会在响应中收到以下消息;

"The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint."

它在响应中为我提供的端点为my.first.test.bucket.s3.amazonaws.com,但如果我尝试这样做,则会出现The specified bucket does not exist错误。在创建存储桶时,我尝试使用特定区域,因此我将端点更改为my.first.test.bucket.s3-eu-west-1.amazonaws.com但是我得到了相同的错误,表明存储桶不存在。我不相信它是一个命名问题,因为它们符合AWS命名约定,这是AWS的建议惯例。

这几乎就像我的用户有权创建存储桶一样,但是我没有为用户提供适当的权限而创建存储桶。虽然因为我的IAM用户可以通过以下个人资料政策完全访问S3,但我无法看到我的错误在哪里

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}

我甚至尝试在S3中手动创建了一个存储桶,并添加了一个存储桶策略来授予访问权限,但我尝试的每个端点都会导致找不到相同的存储桶错误。

有一次,我真的希望我犯了一个愚蠢的错误。有什么想法吗?

编辑:我没有为静态网站托管设置存储桶,所以我不需要端点s3-website-eu-west-1.amazonaws.com,但以防万一我也尝试过相同的结果。

1 个答案:

答案 0 :(得分:0)

总是这样吗?在你提出自己找到答案的问题后,你会挣扎一天,然后一小时。

如果在经过一番挖掘之后它对其他人有帮助,我意识到createBucket方法正在设置服务中的区域,这就是为什么后续方法仅在同时创建存储桶时才起作用的原因。解决方案是设置区域,然后端点自己正确映射。

$s3 = $this->container->get('aws_s3');
$s3->setRegion('s3-eu-west-1.amazonaws.com');
$response = $s3->createObject('my.pre.existing.bucket', 'test2.txt', array(
    'body' => 'This is my body text.'
));