How to use AWS SDK for PHP with MinIO Server
aws-sdk-php
is the official AWS SDK for the PHP programming language. In this recipe we will learn how to use aws-sdk-php
with MinIO server.
1. Prerequisites
Install MinIO Server from here.
2. Installation
Install aws-sdk-php
from AWS SDK for PHP official docs here.
3. Use GetObject and PutObject
Example below shows putObject and getObject operations on MinIO server using aws-sdk-php. Please replace endpoint
,key
, secret
, Bucket
with your local setup in this example.php
file. Note that we set use_path_style_endpoint
to true
to use MinIO with AWS SDK for PHP. Read more in the AWS SDK for PHP docs here.
<?php
// Include the SDK using the Composer autoloader
date_default_timezone_set('America/Los_Angeles');
require 'vendor/autoload.php';
$s3 = new Aws\S3\S3Client([
'version' => 'latest',
'region' => 'us-east-1',
'endpoint' => 'http://localhost:9000',
'use_path_style_endpoint' => true,
'credentials' => [
'key' => 'YOUR-ACCESSKEYID',
'secret' => 'YOUR-SECRETACCESSKEY',
],
]);
// Send a PutObject request and get the result object.
$insert = $s3->putObject([
'Bucket' => 'testbucket',
'Key' => 'testkey',
'Body' => 'Hello from MinIO!!'
]);
// Download the contents of the object.
$retrive = $s3->getObject([
'Bucket' => 'testbucket',
'Key' => 'testkey',
'SaveAs' => 'testkey_local'
]);
// Print the body of the result by indexing into the result object.
echo $retrive['Body'];
After the file is updated, run the program
php example.php
Hello from MinIO!!
4. Create a pre-signed URL
<?php
// Get a command object from the client
$command = $s3->getCommand('GetObject', [
'Bucket' => 'testbucket',
'Key' => 'testkey'
]);
// Create a pre-signed URL for a request with duration of 10 miniutes
$presignedRequest = $s3->createPresignedRequest($command, '+10 minutes');
// Get the actual presigned-url
$presignedUrl = (string) $presignedRequest->getUri();
5. Get a plain URL
To get a plain URL, you'll need to make your object/bucket accessible with public permission. Also, note that you'll not get the URL with X-Amz-Algorithm=[...]&X-Amz-Credential=[...]&X-Amz-Date=[...]&X-Amz-Expires=[...]&X-Amz-SignedHeaders=[...]&X-Amz-Signature=[...]
<?php
$plainUrl = $s3->getObjectUrl('testbucket', 'testkey');
6. Set a Bucket Policy
<?php
$bucket = 'testbucket';
// This policy sets the bucket to read only
$policyReadOnly = '{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Resource": [
"arn:aws:s3:::%s"
],
"Sid": ""
},
{
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Resource": [
"arn:aws:s3:::%s/*"
],
"Sid": ""
}
]
}
';
// If you want to put it on a specific folder you just change 'arn:aws:s3:::%s/*' to 'arn:aws:s3:::%s/folder/*'
// Create a bucket
$result = $s3->createBucket([
'Bucket' => $bucket,
]);
// Configure the policy
$s3->putBucketPolicy([
'Bucket' => $bucket,
'Policy' => sprintf($policyReadOnly, $bucket, $bucket),
]);