【问题标题】:Error executing "PutObject" 400 bad request aws执行“PutObject”时出错 400 错误请求 aws
【发布时间】:2020-07-05 11:01:54
【问题描述】:

我对使用 AWS 非常陌生,我正在研究 AWS 提供的使用 putObject 的示例,在此处找到 https://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpPHP.html

此时我只想使用示例中的 AWS 开发工具包将任何对象上传到我的 S3 存储桶,但我收到一条错误消息,提示 400 Bad Request(完整输出如下)。我试图写入的存储桶故意不公开,因为我不希望整个存储桶都可以访问。我不确定这是否是问题,但如果是,我不确定如何授予我的代码访问权限以写入存储桶,并且文档没有相关示例。如果这不是问题,那么我不确定还有什么问题。

我已经编辑了我的 php 以包含我尝试访问的存储桶和我自己的键名,我的理解应该是上传对象后要使用的文件名。我不断收到此错误:

错误输出:

执行“PutObject”时出错 "https://frank-transcribe-mediaconvert.s3.amazonaws.com/032420-test-upload.txt"; AWS HTTP 错误:客户端错误:PUT https://frank-transcribe-mediaconvert.s3.amazonaws.com/032420-test-upload.txt 导致400 Bad Request 响应:InvalidTokenThe provided 令牌格式错误或其他(截断...) InvalidToken(客户端): 提供的令牌格式错误或无效。 - InvalidTokenThe 提供的令牌格式错误或无效。

这是我的 php 代码:

<?php

    require 'vendor/autoload.php';

    use Aws\Sts\StsClient;
    use Aws\S3\S3Client;
    use Aws\S3\Exception\S3Exception;

    $bucket = 'frank-transcribe-mediaconvert';
    $keyname = date('mdy') . '-test-upload.txt';

    $s3 = new S3Client([
        'version' => 'latest',
        'region'  => 'us-east-1'
    ]);

    try {
        // Upload data.
        $result = $s3->putObject([
            'Bucket' => $bucket,
            'Key'    => $keyname,
            'Body'   => 'Hello, world!',
            'ACL'    => 'public-read'
        ]);

        // Print the URL to the object.
        echo $result['ObjectURL'] . PHP_EOL;
    } catch (S3Exception $e) {
        echo $e->getMessage() . PHP_EOL;
    }

?>

【问题讨论】:

    标签: php amazon-s3 aws-sdk aws-cli aws-php-sdk


    【解决方案1】:

    您的上传代码看起来不错。让存储桶可写不是一个好习惯,从您的问题中我了解到您也没有将其设置为可公开写入。

    因此,只要您没有在可以通过其IAM role 对 API 进行身份验证的 AWS 实例上运行它,您就必须将凭据传递给 S3 客户端。

    这是the docs的摘录:

    $credentials = new Aws\Credentials\Credentials('key', 'secret');
    
    $s3 = new Aws\S3\S3Client([
        'version'     => 'latest',
        'region'      => 'us-west-2',
        'credentials' => $credentials
    ]);
    

    您的代码中的“键”是文件名是正确的(S3 将自己视为键值对象存储,其中目录和文件名是键,值是文件内容,这就是为什么它被称为键)。

    但是,凭证的“密钥”(连同密钥)是您可以使用 IAM 设置的 AWS 访问密钥。如果您不知道如何操作,我建议您阅读 AWS 文档中的 Managing Access Keys (Console)

    另请注意,您为其创建访问密钥(密钥和秘密)的 IAM 用户确实需要具有适当的权限才能通过 S3 执行您想要执行的操作。

    【讨论】:

    • 您好,感谢您的回复!这有助于解决我最初的问题。我不想用一个新问题来混淆这个问题/答案,但我认为值得一提的是,一旦我通过了这个问题,我就有另一个问题说 403 被禁止,这是很多其他的尝试事情,直到它工作。事实证明,'ACL' => 'public-read' 行是当时的问题,我认为这会导致一些问题,具体取决于存储桶和用户的访问类型。
    猜你喜欢
    • 2018-12-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2016-03-31
    • 2016-12-08
    • 1970-01-01
    相关资源
    最近更新 更多