[AWS][Java] CloudFront+S3の署名付きURL発行手順のドキュメント

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

こんにちは。こむろです。すっかりサーバーサイドJavaに戻ってます。

今回は、CloudFront+S3の署名付きURLの発行をAWS SDK for Javaから行う方法を探してみました。
が、いまいち公式ドキュメントの更新が追いついていないようだったので、怒りととともにメモしておきます。

CloudFront + S3の署名付きURLのドキュメント

これらをどのように連携すればよいかは、弊社ブログでもいくつかエントリーが投稿されています。

この辺りを参考にしています。
しかし、AWS SDKからのコードを通してのアクセス方法など、開発寄りのものではなかったので公式のドキュメントを追ってみました。

Amazonが提供する公式ドキュメント

公式ドキュメントは、上記ブログの中でも紹介されていますが、こちらになります。とりあえず、おおよその概要をここで見ることができます

自分が必要なのはAWS SDK for JavaからURLを生成する方法です。ドキュメントはこちら。

検証環境

検証した環境は以下のとおりです。

  • OS : Mac OSX 10.9.5
  • Java : java version "1.8.0_11"
  • AWS SDK : "com.amazonaws" % "aws-java-sdk" % "1.8.9"

公式ドキュメントには存在しないクラスが記述してある

ドキュメントにそって記述してみると分かるのですが、AWS SDKの中にCloudFrontServiceというクラスが存在しません。

スクリーンショット 2014-11-18 20.30.07

公式のJavadocも探してみます。

スクリーンショット 2014-11-18 20.47.22

やっぱりどこにもいない。

どうもこのクラスを使って署名付きURLを作成することは今現在(2014.11.18)できないようです。

CloudFrontUrlSigner

AWS SDKのJavadocを探してみるとCloudFrontUrlSignerというクラス(というかenum)がありました。このクラスにいくつかのstaticメソッドが定義されています。名前からして署名付きURLを取得できそうなメソッドなので、こちらを利用すれば良いような気がします。
公式のドキュメントに記述されているCloudFrontServiceと比較してみてもインタフェースにあまり違いはないようです。何となくどんなメソッドかは想像がつきます。

CloudFrontUrlSigner.java

実際に署名付きURL発行のコードは以下のとおり。決まったオブジェクトへのアクセス制限のため、CannedPolicyを使ってます。

File privateKeyFile = new File("/path/to/privateKey.der");
String distributionDomain = "a1b2c3d4e5f6g7.cloudfront.net";
String path = "/hoge/sample/momonga.png";
String keyPairId = "AWsduf23oeigafsfaeswer3";

private static final int EXPIRE = 60 * 60 * 1000; // 1 hour

private Date getExpireTime() {
    Date time = new Date();
    long end = time.getTime() + EXPIRE;
    time.setTime(end);
    return time;
}

return CloudFrontUrlSigner
  .getSignedURLWithCannedPolicy(
        CloudFrontUrlSigner.Protocol.https,	// Protocol
        distributionDomain,			// CloudFrontのDomain. (例) "a1b2c3d4e5f6g7.cloudfront.net";
        privateKeyFile,				// SSLのPrivate Keyファイル(rsa-private-key.derみたいな)
        path,					// S3のbucket以下のPath
        keyPairId,				// 秘密鍵ファイルに対応するKey Pair ID
        getExpireTime());			// 署名が切れる時間(UTCのDate型で指定)

他にもbuildCustomPolicyForSignedUrlgetSignedURLWithCustomPolicyもありました。
CloudFrontServiceで記述されている公式ドキュメントは、CloudFrontの署名付きURL生成の箇所については、こちらのクラスで読み換えれば良いようです。

おまけ

ちなみにgetSignedURLWithCannedPolicyで検索してみたところ、世の中には5件しか検索結果がありませんでした(2014.11.18現在)。本当は公式のAWSドキュメントのリンクが古いだけで、実は新しいものが存在するんじゃないかと期待したのですが・・・。

スクリーンショット 2014-11-18 21.45.40

以上、AWS SDK for JavaでCloudFrontでS3のPrivateアクセスを有効にする署名付きURLの発行手順でした。

参照