既存CloudFrontの設定をコピーして新規作成する

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

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や各種ツールをつかって自動化しておくことは非常に重要です。そうなっていない環境でも、このようなスクリプトを使えば部分的に複製をすることは可能です。お試しください。

脚注

  1. CloudFormationなどで設定が再現可能な状態であれば、話は別ですが...