Amazon CloudFront の URL への署名AWSSDK for PHP バージョン 3 - AWSSDK for PHP

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon CloudFront の URL への署名AWSSDK for PHP バージョン 3

署名付き URL によりプライベートコンテンツへのアクセス権をユーザーに付与できます。署名付き URL には有効期限などの追加情報が含まれており、これによってコンテンツへのアクセスに対する管理が許可されます。この追加情報は、既定ポリシーまたはカスタムポリシーに基づくポリシーステートメントに含まれます。プライベートディストリビューションをセットアップする方法および URL の署名が必要な理由の詳細については、「」を参照してください。Amazon CloudFront を使用してプライベートコンテンツを供給するAmazon CloudFront 開発者ガイドを参照してください。

  • getSignedURL を使用して、署名付きの Amazon CloudFront を作成します。

  • getSignedCookie を使用して、署名付きの Amazon CloudFront Cookie を作成します。

すべてのサンプルコードはAWSSDK for PHP バージョン 3GitHub で

Credentials

サンプルコードを実行する前に、AWSの認証情報については、」の認証情報AWSSDK for PHP バージョン 3。次にAWSSDK for PHP(の基本的な使用パターンAWSSDK for PHP バージョン 3

Amazon CloudFront の使用の詳細については、「」を参照してください。Amazon CloudFront 開発者ガイド

プライベートディストリビューションの CloudFront URL の署名

SDK の CloudFront クライアントを使用して URL に署名できます。最初に、CloudFrontClient オブジェクトを作成する必要があります。既定またはカスタムポリシーを使用して、ビデオリソースの CloudFront URL に署名することができます。

インポート

require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;

サンプルコード

function signPrivateDistribution($cloudFrontClient, $resourceKey, $expires, $privateKey, $keyPairId) { try { $result = $cloudFrontClient->getSignedUrl([ 'url' => $resourceKey, 'expires' => $expires, 'private_key' => $privateKey, 'key_pair_id' => $keyPairId ]); return $result; } catch (AwsException $e) { return 'Error: ' . $e->getAwsErrorMessage(); } } function signAPrivateDistribution() { $resourceKey = 'https://d13l49jEXAMPLE.cloudfront.net/my-file.txt'; $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now. $privateKey = dirname(__DIR__) . '/cloudfront/my-private-key.pem'; $keyPairId = 'AAPKAJIKZATYYYEXAMPLE'; $cloudFrontClient = new CloudFrontClient([ 'profile' => 'default', 'version' => '2014-11-06', 'region' => 'us-east-1' ]); echo signPrivateDistribution($cloudFrontClient, $resourceKey, $expires, $privateKey, $keyPairId); } // Uncomment the following line to run this code in an AWS account. // signAPrivateDistribution();

CloudFront URL 作成時のカスタムポリシーの使用

カスタムポリシーを使用するには、policy キーを expires の代わりに指定します。

インポート

require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;

サンプルコード

function signPrivateDistributionPolicy($cloudFrontClient, $resourceKey, $customPolicy, $privateKey, $keyPairId) { try { $result = $cloudFrontClient->getSignedUrl([ 'url' => $resourceKey, 'policy' => $customPolicy, 'private_key' => $privateKey, 'key_pair_id' => $keyPairId ]); return $result; } catch (AwsException $e) { return 'Error: ' . $e->getAwsErrorMessage(); } } function signAPrivateDistributionPolicy() { $resourceKey = 'https://d13l49jEXAMPLE.cloudfront.net/my-file.txt'; $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now. $customPolicy = <<<POLICY { "Statement": [ { "Resource": "{$resourceKey}", "Condition": { "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"}, "DateLessThan": {"AWS:EpochTime": {$expires}} } } ] } POLICY; $privateKey = dirname(__DIR__) . '/cloudfront/my-private-key.pem'; $keyPairId = 'AAPKAJIKZATYYYEXAMPLE'; $cloudFrontClient = new CloudFrontClient([ 'profile' => 'default', 'version' => '2014-11-06', 'region' => 'us-east-1' ]); echo signPrivateDistributionPolicy($cloudFrontClient, $resourceKey, $customPolicy, $privateKey, $keyPairId); } // Uncomment the following line to run this code in an AWS account. // signAPrivateDistributionPolicy();

CloudFront の URL の使用

署名付き URL の形式は、署名する URL で使用されているのが「HTTP」スキームであるか「RTMP」スキームであるかによって異なります。「HTTP」の場合は、完全な、絶対 URL が返されます。「RTMP」の場合は、わかりやすいように相対 URL だけが返されます。これは、一部のプレイヤーでホストとパスを個別パラメーターとして指定することが、必要となるからです。

次の例では、JWPlayer を使用してビデオを表示するウェブページを構築するために署名付き URL を使用する方法を示します。同様の手法が FlowPlayer などの他のプレイヤーに適用されますが、異なるクライアント側コードが必要になります。

<html> <head> <title>|CFlong| Streaming Example</title> <script type="text/javascript" src="https://example.com/jwplayer.js"></script> </head> <body> <div id="video">The canned policy video will be here.</div> <script type="text/javascript"> jwplayer('video').setup({ file: "<?= $streamHostUrl ?>/cfx/st/<?= $signedUrlCannedPolicy ?>", width: "720", height: "480" }); </script> </body> </html>

プライベートディストリビューションの CloudFront cookie の署名

署名付き URL の代わりに、署名付き Cookie を使用してプライベートディストリビューションにクライアントアクセスを許可することもできます。署名付き cookie により複数の制限されたファイル (HLS 形式の動画ファイルすべてやウェブサイトの購読者領域にあるすべてのファイルなど) へのアクセスを提供できます。署名付き URL の代わりに、署名付き Cookie が必要になる (またはその逆の) 理由の詳細については、「」を参照してください。署名付き URL と署名付き Cookie の選択Amazon CloudFront 開発者ガイドを参照してください。

署名付き Cookie の作成は、署名付き URL の作成に似ています。唯一の違いは、呼び出すメソッドです (getSignedCookiegetSignedUrl の代わりに呼び出される)。

インポート

require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;

サンプルコード

function signCookie($cloudFrontClient, $resourceKey, $expires, $privateKey, $keyPairId) { try { $result = $cloudFrontClient->getSignedCookie([ 'url' => $resourceKey, 'expires' => $expires, 'private_key' => $privateKey, 'key_pair_id' => $keyPairId ]); return $result; } catch (AwsException $e) { return [ 'Error' => $e->getAwsErrorMessage() ]; } } function signACookie() { $resourceKey = 'https://d13l49jEXAMPLE.cloudfront.net/my-file.txt'; $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now. $privateKey = dirname(__DIR__) . '/cloudfront/my-private-key.pem'; $keyPairId = 'AAPKAJIKZATYYYEXAMPLE'; $cloudFrontClient = new CloudFrontClient([ 'profile' => 'default', 'version' => '2014-11-06', 'region' => 'us-east-1' ]); $result = signCookie($cloudFrontClient, $resourceKey, $expires, $privateKey, $keyPairId); /* If successful, returns something like: CloudFront-Expires = 1589926678 CloudFront-Signature = Lv1DyC2q...2HPXaQ__ CloudFront-Key-Pair-Id = AAPKAJIKZATYYYEXAMPLE */ foreach($result as $key => $value) { echo $key . ' = ' . $value . "\n"; } } // Uncomment the following line to run this code in an AWS account. // signACookie();

CloudFront Cookie 作成時のカスタムポリシーの使用

getSignedUrl パラメーターの場合と同様に 'policy' パラメーターを、expires パラメーターと url パラメーターの代わりに指定して、カスタムポリシーで Cookie に署名できます。カスタムポリシーを使用すると、リソースキーにワイルドカードを含めることができます。これにより、複数のファイルに対する単一の署名付き Cookie を作成できます。

getSignedCookie はキーと値のペアの配列を返します。それらのすべてを、プライベートディストリビューションへのアクセスを許可する Cookie として設定する必要があります。

インポート

require 'vendor/autoload.php'; use Aws\CloudFront\CloudFrontClient; use Aws\Exception\AwsException;

サンプルコード

function signCookiePolicy($cloudFrontClient, $customPolicy, $privateKey, $keyPairId) { try { $result = $cloudFrontClient->getSignedCookie([ 'policy' => $customPolicy, 'private_key' => $privateKey, 'key_pair_id' => $keyPairId ]); return $result; } catch (AwsException $e) { return [ 'Error' => $e->getAwsErrorMessage() ]; } } function signACookiePolicy() { $resourceKey = 'https://d13l49jEXAMPLE.cloudfront.net/my-file.txt'; $expires = time() + 300; // 5 minutes (5 * 60 seconds) from now. $customPolicy = <<<POLICY { "Statement": [ { "Resource": "{$resourceKey}", "Condition": { "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"}, "DateLessThan": {"AWS:EpochTime": {$expires}} } } ] } POLICY; $privateKey = dirname(__DIR__) . '/cloudfront/my-private-key.pem'; $keyPairId = 'AAPKAJIKZATYYYEXAMPLE'; $cloudFrontClient = new CloudFrontClient([ 'profile' => 'default', 'version' => '2014-11-06', 'region' => 'us-east-1' ]); $result = signCookiePolicy($cloudFrontClient, $customPolicy, $privateKey, $keyPairId); /* If successful, returns something like: CloudFront-Policy = eyJTdGF0...fX19XX0_ CloudFront-Signature = RowqEQWZ...N8vetw__ CloudFront-Key-Pair-Id = AAPKAJIKZATYYYEXAMPLE */ foreach ($result as $key => $value) { echo $key . ' = ' . $value . "\n"; } } // Uncomment the following line to run this code in an AWS account. // signACookiePolicy();

CloudFront の Cookie を Guzzle クライアントに送信する

Guzzle クライアント使用するために、これらの Cookie を GuzzleHttp\Cookie\CookieJar に渡すこともできます。

use GuzzleHttp\Client; use GuzzleHttp\Cookie\CookieJar; $distribution = "example-distribution.cloudfront.net"; $client = new \GuzzleHttp\Client([ 'base_uri' => "https://$distribution", 'cookies' => CookieJar::fromArray($signedCookieCustomPolicy, $distribution), ]); $client->get('video.mp4');

詳細については、「」を参照してください。署名付き Cookie の使用Amazon CloudFront 開発者ガイドを参照してください。