【问题标题】:Error executing "PutObject" on AWS, upload fails在 AWS 上执行“PutObject”时出错,上传失败
【发布时间】:2016-03-31 01:16:39
【问题描述】:

我已建立 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 响应: AccessDeniedAccess DeniedFC49CD(截断...) AccessDenied(客户端):拒绝访问 - AccessDeniedAccess 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";
}

如果有人可以帮助我,那就太好了。谢谢。 --伦

【问题讨论】:

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


    【解决方案1】:

    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 还可以查看那里的服务构建器。

    【讨论】:

    • 我检查了 aws_access_key_id 并且它是正确的。我尝试了您在上面给出的简化请求并得到了同样的错误。我不知道如何检查密钥是否正确,但由于它是通过剪切和粘贴完成的,我认为没有理由怀疑它不正确。对我来说似乎是一个配置问题。
    • 您是否尝试过简单地使用file_get_contentsecho 密钥?您目前正在从myFolder/my-object-key 加载它。那是正确的路径吗?您应该可以print_r(file_get_contents('myFolder/my-object-key')) 问题不一定是密钥不正确(但是,如果您不安全,复制和粘贴通常会产生不正确的字符,您会感到惊讶),而是密钥的路径是可能不正确。
    【解决方案2】:

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

    【讨论】:

    • 同样的错误,这无法澄清。桶可读,是S3FullAccess不够吗?
    【解决方案3】:

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

    • 登录 AWS。
    • 在服务下选择 IAM。
    • 选择用户 > [您的用户]
    • 打开权限选项卡
    • 将 AmazonS3FullAccess 策略附加到帐户

    【讨论】:

    • 我不建议授予 S3FullAccess,从安全角度和人为错误错误的角度来看,这是一种不好的做法。您应该将政策限制在您正在使用的特定存储桶中。
    【解决方案4】:

    Braden 的方法会奏效,但很危险。用户将拥有对所有 S3 存储桶的完全访问权限以及登录控制台的能力。如果站点中使用的凭据被泄露,那么...

    更安全的方法是:

    1. AWS 控制台 -> IAM -> 策略 -> 创建策略
    2. 服务 = S3
    3. Actions =(仅要求的最低要求,例如 List 和 Read)
    4. 资源 -> 特定 -> 存储桶 -> 添加 ARN(仅放置所需存储桶的 ARN)
    5. 资源 -> 特定 -> 对象 -> 勾选任何或放置特定对象的 ARN
    6. 查看并保存以创建策略
    7. AWS 控制台 -> IAM -> 用户 -> 添加用户
    8. 访问类型 -> 仅选中“程序访问”
    9. Next:Permissions -> 直接附加现有策略
    10. 搜索并选择您新创建的策略
    11. 查看并保存以创建用户

    通过这种方式,您将拥有一个只有所需访问权限的用户。

    【讨论】:

    【解决方案5】:

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

    删除线

    'ACL' => '公开阅读'

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

    【讨论】:

    • 非常感谢。我在过去的两天里一直在挣扎。当我的代码出现错误时,我怀疑我的政策。
    【解决方案6】:

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

    我正在使用 vagrant homestead 作为我的服务器。原来虚拟盒子服务器上的时间不正确。我必须用正确的 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
    

    【讨论】:

      【解决方案7】:

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

      这是 AWS 添加的额外安全设置/策略,以防止更改对象权限。 如果您的应用程序出现问题或生成警告,请先查看代码,看看您是否尝试更改任何权限(您可能不想这样做)。您还可以自定义这些设置以更好地满足您的需求。

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

      【讨论】:

        猜你喜欢
        • 2018-12-01
        • 2020-07-05
        • 2016-10-08
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 2017-04-12
        • 2014-11-15
        • 1970-01-01
        相关资源
        最近更新 更多