执行错误 "PutObject" 400 错误请求 aws

Error executing "PutObject" 400 bad request aws

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

此时我尝试做的只是像示例中那样使用 AWS SDK 将任何对象上传到我的 S3 存储桶,但我收到一条错误消息 400 Bad Request(完整输出如下)。我试图写入的存储桶有意不是 public,因为我不希望整个存储桶都可以访问。我不确定这是否是问题所在,但如果是,我不确定如何授予我的代码访问存储桶的权限,并且文档中没有这方面的示例。如果这不是问题所在,那么我不确定还有什么问题。

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

错误输出:

Error executing "PutObject" on "https://frank-transcribe-mediaconvert.s3.amazonaws.com/032420-test-upload.txt"; AWS HTTP error: Client error: PUT https://frank-transcribe-mediaconvert.s3.amazonaws.com/032420-test-upload.txt resulted in a 400 Bad Request response: InvalidTokenThe provided token is malformed or other (truncated...) InvalidToken (client): The provided token is malformed or otherwise invalid. - InvalidTokenThe provided token is malformed or otherwise invalid.

这是我的 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;
    }

?>

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

因此,只要您不是 运行 可以通过其 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
]);

你是对的,你代码中的"Key"是文件名(S3把自己看成一个key-value对象存储,其中目录和文件名是key,value是文件内容,就是这样为什么叫钥匙)。

但是,凭证的 "key" - 连同秘密 - 是您可以使用 IAM 设置的 AWS 访问密钥。如果您不知道该怎么做,我建议您阅读 AWS 文档中的 Managing Access Keys (Console)

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