我对使用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;
}
?>
答案 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进行您想做的事情。