この記事は公開されてから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();
}
}
}