执行错误 "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 执行您想要执行的操作。
我对使用 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 a400 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 执行您想要执行的操作。