Amazon CloudFrontでプライベートコンテンツにアクセス その2

2012.01.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回は、Private Distributionの作成と、CloudFrontユーザにREAD権限をアサインするところまで行いました。
今回は、実際にURLを発行してアクセスを試してみたいと思います。

最初に作成されたCloudFrontのURLにアクセスできないことを確認しておきます。
以下のURLにブラウザからアクセスします。

http://d3c647ktcg1tdv.cloudfront.net/AWS.png

キーペアIDが見つからないと怒られました。

署名付きURLの発行

CloudFrontキーペアIDと秘密鍵を指定して、署名付きURLを作成します。 以下がソースです。
今回は、現在日付から60秒間だけ有効なURLを発行してみます。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;

import org.jets3t.service.CloudFrontService;
import org.jets3t.service.CloudFrontServiceException;
import org.jets3t.service.security.EncryptionUtil;

public class SignedUrlGenerator {

	public static void main(String[] args) {

		try {

			// CloudFront キーペアID
			String keyPairId = "XXXXXXXXXXXXXXXXXXXX";
			// 秘密鍵のパス
			String privateKeyFilePath = "C:/XXXXXXXXXXXXXXXXXXXX.pem";

			// 作成したCloudFrontのDistribution Domain
			String distributionDomain = "d3c647ktcg1tdv.cloudfront.net";
			
			// S3上のオブジェクトのパス
			String s3ObjectKey = "AWS.png";
			
			String policyResourcePath = "http://" + distributionDomain + "/"
					+ s3ObjectKey;

			// 秘密鍵をDER形式に変換します
			byte[] derPrivateKey = EncryptionUtil
					.convertRsaPemToDer(new FileInputStream(privateKeyFilePath));

			// policyを作成します
			// 現在日時 + 60秒 まで有効にします
			String policy = CloudFrontService.buildPolicyForSignedUrl(
					policyResourcePath, new Date(
							System.currentTimeMillis() + 60000), null, null);
			// 署名付きURLを発行します
			String signedUrl = CloudFrontService.signUrl(policyResourcePath,
					keyPairId, derPrivateKey, policy);

			System.out.println("signedUrl=" + signedUrl);

		} catch (CloudFrontServiceException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

生成されたURLを見てみましょう。

signedUrl=http://d3c647ktcg1tdv.cloudfront.net/AWS.png?Policy=eyJTdGF0ZW1lbnQiOiBbeyJSZXNvdXJjZSI6Imh0dHA6Ly9kM2M2NDdrdGNnMXRkdi5jbG91ZGZyb250Lm5ldC9BV1MucG5nIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhh
biI6eyJBV1M6RXBvY2hUaW1lIjoxMzI3OTE5OTk5fSwiSXBBZGRyZXNzIjp7IkFXUzpTb3VyY2VJcCI6IjAuMC4wLjAvMCJ9fX1dfQ__&Signature=T702HOnpiUmql952UHVA14mjWpPbyIYGYWNEOO2M7TCVQ34CBO2KN7rhxU1r-g8g0TgVEgDiLhWOWKd
qnnfobZqdveY67E3uYRd2rbv7C0sQrStb0-W8-98C6cJmBXrH-ZAus23T-8BagF6sPiAiiqYXf~~-3csVYCEtccC~HA_Key-Pair-Id=XXXXXXXXXXXXXXXXXXXX

やたら長いですね。これで1分間だけ有効なURLが発行されたことになります。

署名付きURLへアクセス

生成されたURLをブラウザで開きます。

画像が表示されました。
では、1分後に再度アクセスしてみます。

確かに見れませんね。無事成功しました!

まとめ

Amazon CloudFrontで、署名付きURLを使うことで、高速かつセキュリティにもかなったアクセスが実現できます。
以前紹介した、Amazon CloudFrontからRTMPストリーミングでもこの署名付きURLが発行出来るようですし、とても実用性があると感じました。