[AWS][Java] CloudFront+S3の署名付きURL発行手順のドキュメント
こんにちは。こむろです。すっかりサーバーサイド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というクラスが存在しません。
公式のJavadocも探してみます。
やっぱりどこにもいない。
どうもこのクラスを使って署名付きURLを作成することは今現在(2014.11.18)できないようです。
CloudFrontUrlSigner
AWS SDKのJavadocを探してみるとCloudFrontUrlSignerというクラス(というかenum)がありました。このクラスにいくつかのstaticメソッドが定義されています。名前からして署名付きURLを取得できそうなメソッドなので、こちらを利用すれば良いような気がします。 公式のドキュメントに記述されているCloudFrontServiceと比較してみてもインタフェースにあまり違いはないようです。何となくどんなメソッドかは想像がつきます。
実際に署名付き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型で指定)
他にもbuildCustomPolicyForSignedUrlやgetSignedURLWithCustomPolicyもありました。 CloudFrontServiceで記述されている公式ドキュメントは、CloudFrontの署名付きURL生成の箇所については、こちらのクラスで読み換えれば良いようです。
おまけ
ちなみにgetSignedURLWithCannedPolicyで検索してみたところ、世の中には5件しか検索結果がありませんでした(2014.11.18現在)。本当は公式のAWSドキュメントのリンクが古いだけで、実は新しいものが存在するんじゃないかと期待したのですが・・・。
以上、AWS SDK for JavaでCloudFrontでS3のPrivateアクセスを有効にする署名付きURLの発行手順でした。