执行“ PutObject” 400错误请求aws

时间:2020-03-24 21:35:07

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

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

的putObject

我现在要尝试的只是使用示例中的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响应:InvalidToken 令牌格式不正确或其他(被截断...)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;
    }

?>

1 个答案:

答案 0 :(得分: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进行您想做的事情。