Amazon CloudFront

このガイドは、 Amazon CloudFront のためのニフティクラウド SDK for PHP クライアントにフォーカスしています。 このガイドでは、 ニフティクラウド SDK for PHPをダウンロードしインストールが既に終わっていると想定しています。 はじめる場合のより詳細な情報は インストール を参照して下さい。

クライアントの作成

まず以下のような方法のいずれかで、クライアントオブジェクトを作成しなければなりません。

Factory method

Aws\CloudFront\CloudFrontClient::factory() メソッドを利用することで、最も簡単に立ち上げ速やかに動かすことができます。その際にクレデンシャル (key and secret) を提供して下さい。

use Aws\CloudFront\CloudFrontClient;

$client = CloudFrontClient::factory(array(
    'key'    => '<aws access key>',
    'secret' => '<aws secret key>'
));

先の例のようにしてアクセスキーをセットすることができます。また、もし、 AWS Identity and Access Management (IAM) roles for EC2 instances を利用しているか、環境変数 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY からクレデンシャル情報を利用できるのであれば、これらの設定を省略することも可能です。

サービスロケータ

より確実に Amazon CloudFront に接続する方法はサービスロケータを通す方法です。 設定ファイルの中でクレデンシャルと設定値を指定することができます。 これらの設定はすべてのクライアントで共有されるので一度だけ設定を行えばよくなります。

use Aws\Common\Aws;

// Create a service builder using a configuration file
$aws = Aws::factory('/path/to/my_config.json');

// Get the client from the builder by namespace
$client = $aws->get('CloudFront');

Signing CloudFront URLs for Private Distributions

Signed URLs allow you to provide users access to your private content. A signed URL includes additional information (e.g., expiration time) that gives you more control over access to your content. This additional information appears in a policy statement, which is based on either a canned policy or a custom policy. For information about how to set up private distributions and why you need to sign URLs, please read the Serving Private Content through CloudFront section of the CloudFront Developer Guide.

You can sign a URL using the CloudFront client in the SDK. First you must make sure to provide your CloudFront Private Key and Key Pair ID to the CloudFront client.

<?php

$cloudFront = CloudFrontClient::factory(array(
    'private_key' => '/path/to/your/cloudfront-private-key.pem',
    'key_pair_id' => '<cloudfront key pair id>',
));

You can alternatively specify the Private Key and Key Pair ID in your AWS config file and use the service builder to instantiate the CloudFront client. The following is an example config file that specifies the CloudFront key information.

<?php return array(
    'includes' => array('_aws'),
    'services' => array(
        'default_settings' => array(
            'params' => array(
                'key'    => '<aws access key>',
                'secret' => '<aws secret key>',
                'region' => 'us-west-2'
            )
        ),
        'cloudfront' => array(
            'extends' => 'cloudfront',
            'params'  => array(
                'private_key' => '/path/to/your/cloudfront-private-key.pem',
                'key_pair_id' => '<cloudfront key pair id>'
            )
        )
    )
);

You can sign a CloudFront URL for a video resource using either a canned or custom policy.

// Setup parameter values for the resource
$streamHostUrl = 'rtmp://example-distribution.cloudfront.net';
$resourceKey = 'videos/example.mp4';
$expires = time() + 300;

// Create a signed URL for the resource using the canned policy
$signedUrlCannedPolicy = $cloudFront->getSignedUrl(array(
    'url'     => $streamHostUrl . '/' . $resourceKey,
    'expires' => $expires,
));

For versions of the SDK later than 2.3.1, instead of providing your private key information when you instantiate the client, you can provide it at the time when you sign the URL.

$signedUrlCannedPolicy = $cloudFront->getSignedUrl(array(
    'url'         => $streamHostUrl . '/' . $resourceKey,
    'expires'     => $expires,
    'private_key' => '/path/to/your/cloudfront-private-key.pem',
    'key_pair_id' => '<cloudfront key pair id>'
));

To use a custom policy, provide the policy key instead of expires.

$customPolicy = <<<POLICY
{
    "Statement": [
        {
            "Resource": "{$resourceKey}",
            "Condition": {
                "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"},
                "DateLessThan": {"AWS:EpochTime": {$expires}}
            }
        }
    ]
}
POLICY;

// Create a signed URL for the resource using a custom policy
$signedUrlCustomPolicy = $cloudFront->getSignedUrl(array(
    'url'    => $streamHostUrl . '/' . $resourceKey,
    'policy' => $customPolicy,
));

The form of the signed URL is actually different depending on if the URL you are signing is using the "http" or "rtmp" scheme. In the case of "http", the full, absolute URL is returned. For "rtmp", only the relative URL is returned for your convenience, because some players require the host and path to be provided as separate parameters.

The following is an example of how you could use the signed URL to construct a web page displaying a video using JWPlayer. The same type of technique would apply to other players like FlowPlayer, but will require different client-side code.

<html>
<head>
    <title>Amazon CloudFront 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>

このガイドは不完全です

このガイドは、完成しておりません。もし、 SDK や AWS PHP コミュニティのへのよい貢献方法を探しているならば、 手始めにドキュメントを書く手助けをすることはとてもよい方法です。 ガイドは ReStructuredText で記述され、 Sphinx を用いて生成されています。 気兼ねなくドキュメントにコンテンツを追加し、 https://github.com/aws/aws-sdk-php まで pull request を 送って下さい。 ドキュメントのソースは https://github.com/aws/aws-sdk-php/tree/master/docs で見ることが可能です。