如何用PHP通过AWS兼容方式在Oracle Cloud创建公共读权限Bucket
在Oracle Cloud中用PHP创建带公共读权限的Bucket
方法一:使用AWS兼容接口创建后添加Bucket策略
你当前用AWS S3兼容方式创建的私有Bucket,可以通过添加Bucket策略设置公共读权限,无需切换SDK:
- 先按原代码创建Bucket:
require dirname( __DIR__ ).'/composer/vendor/autoload.php'; use Aws\S3\S3Client; $s3 = new Aws\S3Client(array( 'credentials' => [ 'key' => 'access key', 'secret' => 'secret key', ], 'version' => 'latest', 'region' => 'us-ashburn-1', 'bucket_endpoint' => true, 'endpoint' => 'https://namespace.compat.objectstorage.us-ashburn-1.oraclecloud.com/test-bucket', )); // 创建私有Bucket $s3->createBucket(['Bucket' => 'test-bucket']);
- 添加公共读Bucket策略:
// 定义允许所有用户读取Bucket内对象的策略 $policy = json_encode([ "Version" => "2012-10-17", "Statement" => [ [ "Effect" => "Allow", "Principal" => "*", "Action" => ["s3:GetObject"], "Resource" => ["arn:aws:s3:::test-bucket/*"] ] ] ]); // 应用策略到Bucket $s3->putBucketPolicy([ 'Bucket' => 'test-bucket', 'Policy' => $policy ]);
方法二:使用OCI原生PHP SDK直接创建带公共读权限的Bucket
如果希望创建时直接设置权限,可以使用Oracle官方的OCI PHP SDK调用原生CreateBucket接口:
- 首先通过Composer安装OCI SDK:
composer require oracle/oci-sdk
- 编写创建Bucket的代码:
require dirname(__DIR__) . '/composer/vendor/autoload.php'; use Oracle\CloudInfrastructure\ObjectStorage\ObjectStorageClient; use Oracle\CloudInfrastructure\Common\Auth\ConfigFileAuthenticationDetailsProvider; use Oracle\CloudInfrastructure\ObjectStorage\Model\CreateBucketDetails; // 加载本地OCI配置文件(默认路径为~/.oci/config,需提前配置API密钥等信息) $authProvider = new ConfigFileAuthenticationDetailsProvider(); $objectStorageClient = new ObjectStorageClient($authProvider, 'us-ashburn-1'); // 构造Bucket创建参数 $createBucketDetails = new CreateBucketDetails(); $createBucketDetails->setName('test-bucket'); $createBucketDetails->setCompartmentId('你的Compartment OCID'); // 替换为你的 compartment ID $createBucketDetails->setPublicAccessType(CreateBucketDetails::PUBLICACCESSTYPE_OBJECTREAD); // 执行创建,替换为你的Object Storage Namespace $objectStorageClient->createBucket('你的Namespace', $createBucketDetails);
说明
- AWS兼容的PUT Bucket接口本身不支持在创建时指定公共访问类型,因此无法通过该接口直接创建带权限的Bucket;
- 方法一基于现有AWS兼容代码扩展,无需额外依赖;方法二使用原生接口,创建流程更直接,但需要配置OCI认证并引入官方SDK。
内容的提问来源于stack exchange,提问作者BlueZero
相关产品推荐
相关产品推荐

