既存CloudFrontの設定をコピーして新規作成する
CloudFrontはAWSで使えるCDNサービスです。CDNの設定項目は多岐に渡り、細やかな設定が可能です。 が、それは同時に同じ設定のCloudFrontディストリビューションを複製することが難しい(=手間がかかる)ということになります。 *1
そこで、既存のCloudFrontの設定をコピーして新規CloudFrontディストリビューションを作成するスクリプトをAWS CLI + bashで書きました。
実装
AWS CLIのCloudFront用サブコマンドは2015/05/16現在、まだpreview modeという扱いらしく、少し設定を加えないと利用することができません。
This service is only available as a preview service. However, if you'd like to use a basic set of cloudfront commands with the AWS CLI, you can enable this service by adding the following to your CLI config file: [preview] cloudfront=true or by running: aws configure set preview.cloudfront true
~/.aws/configに以下の記述を追加することで利用することができるようになります。
[preview] cloudfront=true
以下にスクリプト全体を貼ります。短いです。
#!/bin/bash source_dist_id=<ディストリビューションID> unixtime=$(date +%s) source_dist_setting=$(aws cloudfront \ get-distribution \ --id ${source_dist_id} \ | jq -r '.Distribution | .DistributionConfig.CallerReference = "'${unixtime}'" | del(.Status, .DomainName, .InProgressInvalidationBatches, .ActiveTrustedSigners, .LastModifiedTime, .Id)') aws cloudfront create-distribution --cli-input-json "${source_dist_setting}"
はい、jqで頑張りました。
まず、コピー元のCloudFrontのDistribution IDをスクリプトに与えて、その設定を取得します。 source_dist_settingには、ディストリビューションの設定を取得するget-distributionのレスポンス(json)が入ります。それをcreate-distributionするために必要な形にjqで整形するのがこのスクリプトのキモです。
リクエストのパラメータとして含めるCallerReferenceという値は、リクエスト時に発行するIDで、ディストリビューション内でユニークになっている必要があります。Management Consoleから作成したディストリビューションには13桁の数列が設定されていました。このスクリプトでは簡易的にするためにunixtimeを利用していますが、別の精製方法でも良いと思います。 最後に--cli-input-jsonで整形したJSONをそのままパラメータとして流し込みます。
注意点
CloudFrontに設定するAliases(CloudFrontにアクセスするときの別名)は、全CloudFrontディストリビューション内でユニークになっている必要があります。そのため、既存CloudFrontディストリビューションでAliasesの設定をしている場合はそのままではcreate-distribution時にエラーになります。CallerReferenceと同様、jqで書き換えてあげましょう。
まとめ
開発環境と本番環境など、同じ設定の環境を作りたい要望はよく発生します。その時のためにAWS環境の構築をCloudFormationや各種ツールをつかって自動化しておくことは非常に重要です。そうなっていない環境でも、このようなスクリプトを使えば部分的に複製をすることは可能です。お試しください。
脚注
- CloudFormationなどで設定が再現可能な状態であれば、話は別ですが... ↩