【发布时间】:2022-01-14 14:42:46
【问题描述】:
我尝试制作一个完全公开的 S3 存储桶并使用 PHP SDK 进行访问。当我从本地机器运行下面的访问代码时,这有效:
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
$s3 = new S3Client([
'version' => 'latest',
'region' => 'eu-west-2',
'credentials' => [
'key' => "my correct key",
'secret' => "my correct secret"
]
]);
// //publictest2
$bucket = 'mybucketname';
$keyname = 'test_file.txt';
// Upload an object
try {
// Upload data.
$result = $s3->putObject([
'Bucket' => $bucket,
'Key' => $keyname,
'Body' => 'Hello',
'ACL' => 'public-read'
]);
// Print the URL to the object.
echo $result['ObjectURL'] . PHP_EOL;
} catch (S3Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
但是,一旦我从测试服务器(AWS EC2)运行它,我就会收到以下错误:
Error executing "PutObject" on "mybucketname"; AWS HTTP error: Client error: `PUT https://mybucketname/test_file.txt` resulted in a `403 Forbidden` response: AccessDeniedAccess DeniedVTJX7V (truncated...) AccessDenied (client): Access Denied - AccessDeniedAccess DeniedVTJX7V4CCKZYG7CRTz+dPA7fsZQnFxTERKxxbP+IpTtMIIsS1uu23fvTruHH3w8KxwGIduCntRBM5u6tIfHdusbCoPw=
我已经实现了以下内容来公开存储桶:
- 关闭所有阻止公共访问设置,包括帐户和存储桶级别:block public access settings at bucket level
- 编辑对象所有权: edit object ownership section
- 我这样编辑了 ACL 列表:acl settings
- 我什至创建了一个存储桶策略,允许任何人对存储桶执行任何操作:
{
"Version": "2012-10-17",
"Id": "S3BukcetPolicyIPAccess",
"Statement": [
{
"Sid": "DenyIfNotFromAllowedVPC",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"mybucketarn",
"mybucketarn/*"
]
}
]
}
为什么从我的 EC2 服务器运行时这仍然不起作用?
【问题讨论】:
-
在本地和 Ec2 实例中运行时是否使用相同的 Access Key 和 Secret Access Key?
-
您不需要 ACL 来处理这些。一般来说,您不应该使用 ACL。此外,向任何人授予
s3:*权限的存储桶策略几乎可以肯定是一个非常糟糕的主意(除非您临时这样做是为了测试某些东西,在这种情况下它仍然是一个坏主意)。 -
在您的 EC2 实例上运行此命令:
aws sts get-caller-identity。这将使您深入了解 AWS 委托人,AWS CLI 代表 AWS API 对 AWS API 进行身份验证。
标签: php amazon-web-services amazon-s3 amazon-ec2