CloudFrontの署名付きURLをためす(with PHP)
はじめに
CloudFrontの署名付きURLを試す機会があったのでやってみました。
環境:PHP7, Laravel5.8, AWS Service Provider for Laravel 5
(AWS SDK for PHP バージョン3)
AWS環境:S3,CloudFront
手順
composerでAWS SDKを導入する
"require": { "php": "^7.1.3", "fideloper/proxy": "^4.0", "laravel/framework": "5.8.*", "laravel/tinker": "^1.0", "aws/aws-sdk-php-laravel": "~3.0" },インストール
composer install
公式サイトの手順に沿ってサービスプロバイダーとエイリアスを設定します。
In Laravel find the providers key in your config/app.php and register the AWS Service Provider.'providers' => array( // ... Aws\Laravel\AwsServiceProvider::class, )Find the aliases key in your config/app.php and add the AWS facade alias.'aliases' => array( // ... 'AWS' => Aws\Laravel\AwsFacade::class, )
とりあえず公式のドキュメントのコードを使ってAWSにつながっているか確認。
<?php namespace App\Http\Controllers; use App; class HelloController extends Controller { public function get() { $s3 = App::make('aws')->createClient('s3'); $s3->putObject(array( 'Bucket' => 'YOUR_BUCKET', 'Key' => 'YOUR_OBJECT_KEY', 'SourceFile' => public_path() . '\robots.txt', )); return view('welcome'); } }
良さそう

CloudFront接続用のキーペアを作成します。AWSルートアカウントでAWSマネジメントコンソールにログインして、毎セキュリティ資格情報を表示します。

CloudFrontのキーペアを作成します。プライベートキーはなくさないように。

CloudFront環境をつくります。
オリジンの設定と、Restrict Bucket Access(制限付きアクセス)を「YES」 に指定。
オリジンの設定と、Restrict Bucket Access(制限付きアクセス)を「YES」 に指定。

画面下の方の、Restrict Viewer Access (Use Signed URLs or Signed Cookies)をYesにします。

CloudFrontのURLにアクセスしてもエラー。キーがない

では認証用のURLを生成します。
<?php namespace App\Http\Controllers; use App; use Aws\Sdk; class HelloController extends Controller { public function get() { $config = [ 'region' => 'ap-northeast-1', 'version' => 'latest', 'credentials' => [ 'key' => 'ACCESSKEY_INPUT_HERE', 'secret' => 'SECRETKEY_INPUT_HERE' ] ]; $sdk = new Sdk($config); $client = $sdk->createCloudFront(); $expires = time() + 60; // 1分 $result = $client->getSignedUrl([ 'url' => STREAM_HOST_URL . '/' . RESOURCE_KEY, 'expires' => $expires, 'private_key' => '/path/to/privatekey', 'key_pair_id' => 'KEY_PAIR_ID_HERE' ]); print($result); die(); } }
できました!

コンテンツが無事に表示されました

有効期限をすぎると見ることができなくなります。
