Amazon S3のワンタイムURLを作成
Amazon S3のワンタイムURLを作成するPHPコードです。
生成された時間から一定の期間が経つとリンクは無効になります。
<?php class S3Download { public function generateOnetimeURL($bucketName, $objectName) { if (empty($bucketName)) { die("バケット名が空です"); } if (empty($objectName)) { die("ダウンロードするファイル名が空です"); } // AWSのACCESSKEY $keyId = 'AWS_ACCESS_KEY'; // AWSのSECRETKEY $secretKey = 'AWS_SECRET_KEY'; $request = $this->_makeRequestHeader($bucketName, "/".$bucketName."/".$objectName, $keyId, $secretKey); $qs = http_build_query($request["header"]); $url = sprintf('https://%s.s3.amazonaws.com/%s', $bucketName, $objectName); return $url."?".$qs; } private function _makeRequestHeader($bucketName, $resource, $accessKey="", $secretKey="") { $httpVerb = 'GET' . "\n"; $contentMd5 = "\n"; $contentType = "\n"; // Expireする分設定 // 5分を設定した $expires = time() + intval(5) * 60; $expires_str = $expires . "\n"; $canonicalizedAmzHeaders = ''; $canonicalizedResource = $resource; $stringToSign = $httpVerb . $contentMd5 . $contentType . $expires_str . $canonicalizedAmzHeaders . $canonicalizedResource; $hash = hash_hmac('sha1', $stringToSign, $secretKey, true); $signature = base64_encode($hash); $request = array("header" => array( "Expires" => $expires, "AWSAccessKeyId" => $accessKey, "Signature" => $signature, ), ); return $request; } } $s3obj = new S3Download(); // s3testhogeバケット直下のhoge.zipをダウンロードするURL生成 $s3obj->generateOnetimeURL('s3testhoge','hoge.zip'); // ファイルがサブディレクトリ(正確には違うが…)に入ってる場合 $s3obj->generateOnetimeURL('s3testhoge','hoge/fuga/foobar.zip');