通过 PHP 上传到 s3 失败访问被拒绝
Upload to s3 via PHP fails access denied
我觉得问这个有点傻,但是通过当前的 PHP SDK 上传东西到 S3 有什么特别的要求吗?我可以使用相同的凭据通过 cli 上传,但是当我尝试 SDK 时它失败了。
这里是代码:
<?php
require "awssdk_v3/aws-autoloader.php";
use Aws\S3\S3Client;
function s3_upload($file, $name) {
$s3 = S3Client::factory(
array(
'key' => getenv('AWS_ACCESS_KEY_ID'),
'secret' => getenv('AWS_SECRET_ACCESS_KEY'),
'version' => "2006-03-01",
'region' => getenv('AWS_REGION')
)
);
$result = $s3->putObject(
array(
'Bucket' => getenv('AWS_BUCKET'),
'Key' => $name,
'SourceFile' => $file,
'ContentType' => mime_content_type($file),
'ACL' => 'public-read'
)
);
return true;
}
我这样称呼它
s3_upload($_FILES['avatarfile']['tmp_name'], "avatar_2.jpg");
我使用的用户附加了此政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1480066717000",
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::my-bucket/*"
]
},
{
"Sid": "Stmt1480066765000",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket"
]
}
]
}
如前所述,我能够使用该用户凭据从 CLI 上传文件。该地区是法兰克福,所以我指定了 eu-central-1
,对吗?
我得到的错误是这样开始的:
Fatal error: Uncaught exception 'Aws\S3\Exception\S3Exception' with message 'Error executing "PutObject" on "https://my-bucket.s3.eu-central-1.amazonaws.com/avatar_2.jpg"; AWS HTTP error: Client error: `PUT https://my-bucket.s3.eu-central-1.amazonaws.com/avatar_2.jpg` resulted in a `403 Forbidden` response
我找到了问题,谢谢 。我正在尝试设置 ACL 'public-read'
,但还没有授予自己 s3:PutObjectAcl
,只是 s3:PutObject
。更改其中任何一个都可以解决问题。
谢谢你的帮助。
在 IAM 策略下,如果您设置 S3:PutObject 操作,请在权限中添加 S3:PutObjectAcl。
我 运行 进入了同样的错误消息,结果发现我的 S3 存储桶是在错误的区域创建的。
我觉得问这个有点傻,但是通过当前的 PHP SDK 上传东西到 S3 有什么特别的要求吗?我可以使用相同的凭据通过 cli 上传,但是当我尝试 SDK 时它失败了。
这里是代码:
<?php
require "awssdk_v3/aws-autoloader.php";
use Aws\S3\S3Client;
function s3_upload($file, $name) {
$s3 = S3Client::factory(
array(
'key' => getenv('AWS_ACCESS_KEY_ID'),
'secret' => getenv('AWS_SECRET_ACCESS_KEY'),
'version' => "2006-03-01",
'region' => getenv('AWS_REGION')
)
);
$result = $s3->putObject(
array(
'Bucket' => getenv('AWS_BUCKET'),
'Key' => $name,
'SourceFile' => $file,
'ContentType' => mime_content_type($file),
'ACL' => 'public-read'
)
);
return true;
}
我这样称呼它
s3_upload($_FILES['avatarfile']['tmp_name'], "avatar_2.jpg");
我使用的用户附加了此政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1480066717000",
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::my-bucket/*"
]
},
{
"Sid": "Stmt1480066765000",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket"
]
}
]
}
如前所述,我能够使用该用户凭据从 CLI 上传文件。该地区是法兰克福,所以我指定了 eu-central-1
,对吗?
我得到的错误是这样开始的:
Fatal error: Uncaught exception 'Aws\S3\Exception\S3Exception' with message 'Error executing "PutObject" on "https://my-bucket.s3.eu-central-1.amazonaws.com/avatar_2.jpg"; AWS HTTP error: Client error: `PUT https://my-bucket.s3.eu-central-1.amazonaws.com/avatar_2.jpg` resulted in a `403 Forbidden` response
我找到了问题,谢谢 'public-read'
,但还没有授予自己 s3:PutObjectAcl
,只是 s3:PutObject
。更改其中任何一个都可以解决问题。
谢谢你的帮助。
在 IAM 策略下,如果您设置 S3:PutObject 操作,请在权限中添加 S3:PutObjectAcl。
我 运行 进入了同样的错误消息,结果发现我的 S3 存储桶是在错误的区域创建的。