Amazon CloudFront でプライベートコンテンツにアクセス その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(); } } }