在AWS上执行"PutObject"时出错,上载失败

Len*_*enB 8 php amazon-s3 amazon-web-services

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

在" https://s3.amazonaws.com/gps-photo.org/mykey.txt " 上执行"PutObject"时出错; AWS HTTP错误:客户端错误:PUT https://s3.amazonaws.com/gps-photo.org/mykey.txt导致403 Forbidden响应: PUT https://s3.amazonaws.com/gps-photo.org/mykey.txt访问DeniedFC49CD(截断...)AccessDenied(客户端):访问被拒绝 - 403 Forbidden访问被拒绝 FC49CD15567FB9CD1GTYxjzzzhcL + 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";
}
Run Code Online (Sandbox Code Playgroud)

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

小智 14

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

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

  • 我不建议授予S3FullAccess,从安全角度和人为错误错误来看,这是一种不好的做法.您应该将策略限制为您正在使用的特定存储桶. (3认同)

MrG*_*MrG 7

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

更安全的方法是:

  1. AWS控制台 - > IAM - >策略 - >创建策略
  2. 服务= S3
  3. 动作=(仅限所需的最小值,例如列表和读取)
  4. 资源 - >特定 - >桶 - >添加ARN(只需要所需的桶的ARN)
  5. 资源 - >特定 - >对象 - >检查任何或放置特定对象的ARN
  6. 查看并保存以创建策略
  7. AWS控制台 - > IAM - >用户 - >添加用户
  8. 访问类型 - >仅检查"程序访问"
  9. 下一页:权限 - >直接附加现有策略
  10. 搜索并选择新创建的策略
  11. 查看并保存以创建用户

通过这种方式,您将拥有仅具有所需访问权限的用户.


小智 7

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

删除线

'ACL'=>'公共读取'

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


JPa*_*ino 5

假设您拥有所有必需的权限,如果您收到此错误,但仍然可以上传,请检查您的存储桶下的存储桶权限部分,并尝试禁用(取消选中)“阻止所有公共访问”,看看您是否仍然得到错误。如果需要,您可以再次启用此选项。

这是 AWS 添加的一项额外安全设置/策略,以防止更改对象权限。在此处输入图片说明如果您的应用程序给您带来问题或产生警告,请首先查看代码并查看您是否正在尝试更改任何权限(您可能不希望这样做)。您还可以自定义这些设置以更好地满足您的需求。

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


小智 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";
}
Run Code Online (Sandbox Code Playgroud)

摘自http://docs.aws.amazon.com/aws-sdk-php/v2/guide/service-s3.html另请查看那里的服务构建器。