执行错误" PutObject"在AWS上,上传失败

时间:2015-12-24 16:21:06

标签: php amazon-web-services amazon-s3

我已经建立了AWS帐户。我正在尝试将我的第一个程序化PUT转换为S3。我用控制台创建了一个桶并把东西放在那里。我还创建了一个子目录(myFolder)并将其公之于众。我创建了我的.aws / credentials文件并尝试使用示例代码,但是我收到以下错误:

  

执行错误" PutObject" on" https://s3.amazonaws.com/gps-photo.org/mykey.txt&#34 ;; AWS HTTP错误:客户端错误:PUT https://s3.amazonaws.com/gps-photo.org/mykey.txt导致403 Forbidden响应:              AccessDenied访问DeniedFC49CD(截断...)       AccessDenied(客户端):访问被拒绝 -       AccessDenied访问DeniedFC49CD15567FB9CD1GTYxjzzzhcL + YyYsuYRx4UgV9wzTCQJX6N4jMWwA39PFaDkK2B9R + FZf8GVM6VvMXfLyI / 4abo =

我的代码是

<?php

// Include the AWS SDK using the Composer autoloader.
require '/home/berman/vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
$bucket = 'gps-photo.org';
$keyname = 'my-object-key';
// Instantiate the client.
$s3 = S3Client::factory(array(
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2006-03-01'
));
try {
    // Upload data.
    $result = $s3->putObject(array(
        'Bucket' => $bucket,
        'Key'    => "myFolder/$keyname",
        'Body'   => 'Hello, world!',
        'ACL'    => 'public-read'
    ));
    // Print the URL to the object.
    echo $result['ObjectURL'] . "\n";
} catch (S3Exception $e) {
    echo $e->getMessage() . "\n";
}

如果有人能帮助我,那就太好了。谢谢。 --Len

7 个答案:

答案 0 :(得分:12)

看起来我遇到了同样的问题。将AmazonS3FullAccess策略添加到您的AWS账户。

  • 登录AWS。
  • 在服务下选择IAM。
  • 选择用户&gt; [您的用户]
  • 打开Permissoins标签
  • 将AmazonS3FullAccess策略附加到帐户

答案 1 :(得分:7)

布拉登的方法会起作用,但这很危险。用户可以完全访问所有S3存储桶并能够登录控制台。如果站点中使用的凭据受到损害,那么......

更安全的方法是:

  1. AWS控制台 - &gt; IAM - &gt;政策 - &gt;制定政策
  2. 服务= S3
  3. 操作=(仅限最低要求,例如列表和阅读)
  4. 资源 - &gt;具体 - &gt;桶 - &gt;添加ARN(仅使用所需的桶的ARN)
  5. 资源 - &gt;具体 - &gt;对象 - &gt;选中任意或放置特定对象的ARN
  6. 查看并保存以创建政策
  7. AWS控制台 - &gt; IAM - &gt;用户 - &gt;添加用户
  8. 访问类型 - &gt;检查&#34;程序化访问&#34;仅
  9. 下一篇:权限 - &gt;直接附加现有政策
  10. 搜索并选择新创建的政策
  11. 查看并保存以创建用户
  12. 通过这种方式,您将拥有仅具有所需访问权限的用户。

答案 2 :(得分:5)

我遇到了同样的问题,并找到了以下解决方案。

删除行

  

'ACL'=>'公开读取'

具有列表,读取和写入的默认权限,但没有更改对象特定的权限(AWS策略中的PutObjectAcl)。

答案 3 :(得分:2)

403表示您的密钥不正确,或密钥路径不正确。您是否确认该软件包正在/myFolder/$keyname中加载正确的密钥?

可能有助于尝试更简单的方法(而不是担心上传文件类型,路径,权限等)来进行调试。

$result = $client->listBuckets();
foreach ($result['Buckets'] as $bucket) {
    // Each Bucket value will contain a Name and CreationDate
    echo "{$bucket['Name']} - {$bucket['CreationDate']}\n";
}

取自http://docs.aws.amazon.com/aws-sdk-php/v2/guide/service-s3.html同时查看那里的服务构建者。

答案 4 :(得分:2)

问题是,一旦我添加了一切正常工作,就会对存储桶本身缺乏权限。

答案 5 :(得分:1)

假设您拥有所有必需的权限,如果遇到此错误,但仍然能够上载,请检查存储桶下的存储桶权限部分,然后尝试禁用(取消选中)“阻止所有公共访问权限”,然后查看如果仍然出现错误。您可以根据需要再次启用此选项。

这是AWS为防止更改对象权限而添加的一项额外的安全设置/策略。enter image description here如果您的应用给您带来了问题或生成了警告,请首先查看代码,看看是否尝试更改任何权限(您可能不需要)。您还可以自定义这些设置,以更好地满足您的需求。

同样,您可以通过单击S3存储桶,权限/编辑来自定义此设置。

答案 6 :(得分:0)

我遇到了同样的错误问题。项目是laravel vue,我正在使用axios将文件上传到s3。

我正在使用无家可归的宅基地作为服务器。原来虚拟盒服务器上的时间不正确。我必须用正确的UTC时间进行更新。更新以纠正我从s3错误中获取的时间后,它工作正常。

错误:我已删除敏感信息

message: "Error executing "PutObject" on "https://url"; AWS HTTP error: Client error: `PUT https://url` resulted in a `403 Forbidden` response:↵<?xml version="1.0" encoding="UTF-8"?>↵<Error><Code>RequestTimeTooSkewed</Code><Message>The difference between the reque (truncated...)↵ RequestTimeTooSkewed (client): The difference between the request time and the current time is too large. - <?xml version="1.0" encoding="UTF-8"?>↵<Error><Code>RequestTimeTooSkewed</Code><Message>The difference between the request time and the current time is too large.</Message><RequestTime>20190225T234631Z</RequestTime><ServerTime>2019-02-25T15:47:39Z</ServerTime><MaxAllowedSkewMilliseconds>900000</MaxAllowedSkewMilliseconds><RequestId>-----</RequestId><HostId>----</HostId></Error>"

之前:

vagrant@homestead:~$ date
Wed Feb 20 19:13:34 UTC 2019

之后:

vagrant@homestead:~$ date
Mon Feb 25 15:47:01 UTC 2019