Stsを使用して権限を作成しバケットの生成からファイルアップロードまでしてみた。
以下サンプルソース
※ちなみに、だだがきしてます。そのうち綺麗に書いて使う予定。
$config = array(
'key'=>XXXXXXXX
, 'secret'=>XXXXXXX
);
$stsClient = StsClient::factory($config);
$policy = '
{
"Id": "XXXXXXXXXXXXXXXX",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "XXXXXXXXXXXXXXX",
"Action": [
"s3:CreateBucket",
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::*"
}
]
}'
;
// JSON整形しとく。
$json = json_encode(json_decode($policy));
$result = $stsClient->getFederationToken(array(
'Name' => 'Statement'
, 'DurationSeconds' => 3600
, 'Policy' => $json
)
);
$credentials = $result->get('Credentials');
$config = array(
'key' => $credentials['AccessKeyId']
, 'secret' => $credentials['SecretAccessKey']
, 'token' => $credentials['SessionToken']
);
// トランコーダーのクライアントを作成する。
$bucket = 'bucketname';
$s3Client = S3Client::factory($config);
// 本当は$s3Client->headBucketして確認したいけどエラーが取れないのであきらめ
$s3Client->createBucket(array('Bucket' => $bucket));
$s3Client->waitUntil('BucketExists', array('Bucket' => $bucket));
$policy = '
{
"Id": "XXXXXXXXXXXXXXXX",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "XXXXXXXXXXXXXXXX",
"Action": [
"s3:GetObject"
, "s3:PutObject"
, "s3:DeleteObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::'.$bucket.'/*"
}
]
}';
// もう少し権限減らしたものを作成し、オブジェクトを上げる権限を与える
$json = json_encode(json_decode($policy));
$result = $stsClient->getFederationToken(array(
'Name' => 'Statement'
, 'DurationSeconds' => 3600
, 'Policy' => $json
)
);
$credentials = $result->get('Credentials');
$config = array(
'key' => $credentials['AccessKeyId']
, 'secret' => $credentials['SecretAccessKey']
, 'token' => $credentials['SessionToken']
);
$s3Client = S3Client::factory($config);
$inFile = 'アップロードするファイル';
$key = basename($inFile);
if($s3Client->doesObjectExist($bucket,$key)) { // 存在した場合は削除
$s3Client->deleteObject(array("Bucket" => $bucket,"Key" => $key));
}
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo,$inFile);
$rParams = array(
'Bucket' => $bucket
, 'Key' => $key
, 'ACL' => CannedAcl::PRIVATE_ACCESS
, 'ContentType' => $mime
, 'Body' => EntityBody::factory(fopen($inFile, 'r'))
);
$result = $s3Client->putObject($rParams);