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

2012.01.27

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

Amazon S3 では、期限付きのURLを発行して、その期間だけ目的のコンテンツにアクセスさせる。という事ができます。
これを Amazon CloudFront 上から、高速かつ期限付きの配信が出来ないかなぁーと思って、いろいろ調べていたら出来ることを知りました。
今回は2回に渡って、サンプルを作って試していきたいと思います。

概要

おおざっくりと流れを説明します。
先ず、S3へのアクセスを許可する仮想IDとして、CloudFrontアクセスIDを作成します。
次に、この作成した仮想アクセスID専用のプライベートなCloudFront Distribtuionを作成します。
対象としたいオブジェクトについて、S3上でPublicな公開とはせず、上記のアクセスIDに対してのみ、読み取り権限を設定し、
作成したCloudFront Distributionの署名付きURLを利用することで、特定の期間のみアクセスが可能となります。

では、実際にやっていきます。

①CloudFront アクセスID の作成

まずは、CloudFront用のアクセスIDの作成です。
これはManagement Console上からは出来ないので、APIを使用して行います。
また、CloudFront用 APIとして、サードパーティ製のJets3tを使用します。
以下のリンクからダウンロードし、必要なライブラリをパスに通します。
http://jets3t.s3.amazonaws.com/index.html

以下が、アクセスIDを作成する部分のソースになります。

AWSCredentials AWS_CREDENTIALS = new AWSCredentials(
		"XXXXXXXXXXXXXXXXXXXXXXXXXX", // awsAccessKey
		"XXXXXXXXXXXXXXXXXXXXXXXXXX" // awsSecretAccessKey
		);

CloudFrontService cloudFrontService;
cloudFrontService = new CloudFrontService(AWS_CREDENTIALS);

// CloudFrontアクセスID の作成
OriginAccessIdentity originAccessIdentity;
originAccessIdentity = cloudFrontService
		.createOriginAccessIdentity(
				"" + System.currentTimeMillis(), // callerReference
				"test-yamato Private Distribution" // comment
		);

System.out.println("originAccessIdentity: " + originAccessIdentity);

以下が実行結果です。CloudFrontアクセスIDが作成されました。

 originAccessIdentity: CloudFrontOriginAccessIdentity: id=E2LZ0YGSOZYWC,
s3CanonicalUserId=2abeccca122e30e2086b681673f49950348bf3924b18c1d2b76dc0f231be1aa1c376071da0869e8c8a9d9e095d39, 
config=[CloudFrontOriginAccessIdentityConfig: callerReference=1327652472038, comment=test-yamato Private Distribution

②PrivateDistributionを作成

次に、Private Distributionの作成です。以下がソースです。
実行して、作成します。

// Privte Distribution の作成
String originAccessIdentityId = originAccessIdentity.getId();
String originBucket = "test-yamato.s3.amazonaws.com";
Distribution privateDistribution = cloudFrontService
		.createDistribution(new S3Origin(originBucket,
				originAccessIdentityId),
				"" + System.currentTimeMillis(), // Caller reference
													// unique string
													// value
				new String[] {}, // CNAME aliases for distribution
				"New private distribution", // Comment
				true, // Distribution is enabled?
				null, // Logging status of distribution (null means
						// disabled)
				true, // URLs self-signing disabled
				null, // No other AWS users can sign URLs
				null, // No required protocols
				null // No default root object
		);

③作成されたPrivate Distributionの確認

上記の手順を実行した後、Private Distributionが作成されています。
Management Console を確認しましょう。

 

 

 

暫くすると、deployedになりました。出来上がりです。

 

 

 

④ACLの設定

S3上の対象のオブジェクトのACLにて、CloudFrontアクセスIDにREAD権限をアサインします。

ここでは、CloudBerryを使用しています。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CloudFront Origin Access Identity が作成されているので、このユーザに対して、READ権限をアサインします。

 

 

 

 

 

 

 

 

 

上記の手順にて、CloudFront用ユーザにREAD権限が付与されました。

以上で準備が整いました。
次回は、実際に署名付きURLを発行して、アクセスを試してみたいと思います。

今回記載したソースの全体像は以下の通りです。

import org.jets3t.service.CloudFrontService;
import org.jets3t.service.CloudFrontServiceException;
import org.jets3t.service.model.cloudfront.Distribution;
import org.jets3t.service.model.cloudfront.OriginAccessIdentity;
import org.jets3t.service.model.cloudfront.S3Origin;
import org.jets3t.service.security.AWSCredentials;

/**
 * CloudFront上のPrivateDistributionを作成。
 */
public class DistributionCreator {

	public static void main(String[] args) {

		try {

			AWSCredentials AWS_CREDENTIALS = new AWSCredentials(
					"XXXXXXXXXXXXXXXXXXXXXXXXXX", // awsAccessKey
					"XXXXXXXXXXXXXXXXXXXXXXXXXX" // awsSecretAccessKey
			);

			CloudFrontService cloudFrontService;
			cloudFrontService = new CloudFrontService(AWS_CREDENTIALS);

			// CloudFrontアクセスID の作成
			OriginAccessIdentity originAccessIdentity;
			originAccessIdentity = cloudFrontService
					.createOriginAccessIdentity(
							"" + System.currentTimeMillis(), // callerReference
							"test-yamato Private Distribution" // comment
					);

			System.out.println("originAccessIdentity: " + originAccessIdentity);

			// Privte Distribution の作成
			String originAccessIdentityId = originAccessIdentity.getId();
			String originBucket = "test-yamato.s3.amazonaws.com";
			Distribution privateDistribution = cloudFrontService
					.createDistribution(new S3Origin(originBucket,
							originAccessIdentityId),
							"" + System.currentTimeMillis(), // Caller reference
																// unique string
																// value
							new String[] {}, // CNAME aliases for distribution
							"New private distribution", // Comment
							true, // Distribution is enabled?
							null, // Logging status of distribution (null means
									// disabled)
							true, // URLs self-signing disabled
							null, // No other AWS users can sign URLs
							null, // No required protocols
							null // No default root object
					);

			System.out.println("New Private Distribution: "
					+ privateDistribution);

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