AWSを使い始めて早1ヶ月。AWSをコマンドで操りたいお年頃になりました。
Amazon CloudFront CDNの複製(取得情報を基に新規作成)と更新をAWS CLIで行う方法をまとめます。
尚、2015年8月現在、プレビュー版ということで使えなくなるかもしれません。
This service is only available as a preview service.
プレビュー機能の有効化
公式ドキュメント通りに有効化を行います。有効化するとconfigファイルに追加されるようです。
$ aws configure set preview.cloudfront true $ cat ~/.aws/config ・・・ [preview] cloudfront = true
list-distributions でDistributionIdの一覧取得
まずはDistributionIdの取得を行います。
$ aws cloudfront list-distributions --output text --query 'DistributionList.Items[*].[Id]'
- 出力例
E2VBJHQABXXXXX E2PNP4A17XXXXX
get-distribution で設定取得
取得したDistributionIdを指定して設定情報を取得します。
$ aws cloudfront get-distribution --output=json --id E2PNP4A17XXXXX
- 出力例
{ "Distribution": { "Status": "Deployed", "DomainName": "d29nqdfzdxxxxx.cloudfront.net", ・・・略・・・ "Id": "E2PNP4A17XXXXX" }, "ETag": "E1F0IKRDXXXXXX" }
設定取得用のコマンドはget-distribusion、get-distribution-configがありますが、いずれもその出力内容そのままでは後述する作成・更新のコマンドには利用できません。
get-distribution のみ出力される項目
get-distributionではget-distribution-configで出力される内容にプラスして、下記項目が出力されます。
"Distribution": { "Status": "", "DomainName": "", "InProgressInvalidationBatches": 0, "ActiveTrustedSigners": { "Enabled": false, "Quantity": 0 }, "LastModifiedTime": "", "Id": ""
複製用jsonファイルを作成して create-distribution
複製用jsonファイル作成
複製(取得情報を基に新規作成)するコマンド用のjsonファイルを作成します。
設定取得(get-distribution)の結果をリダイレクトするなりファイル出力するなりしてjqで書き換えます。
ディストリビューション内でCallerReferenceとAliasesが重複すると作成に失敗するため、例では下記のようにしています。一意にできれば何でも良いと思います。
- CallerReferenceにUNIXTIMESTAMP設定
- ALIAS末尾に".clone"を付与
rewrite_for_create.sh
#!/bin/sh # CallerReference生成 _TIMESTAMP=`date +%s` # ALIAS末尾に文字列付与 for _ALIAS in `jq -r '.Distribution.DistributionConfig.Aliases.Items[]' get-distribution.out.json` ; do [ -z "${_ALIASES}" ] && _ALIASES="\"${_ALIAS}.clone\"" || _ALIASES="${_ALIASES},\"${_ALIAS}.clone\"" done # jsonファイル作成 jq -r '.Distribution | .DistributionConfig.Aliases.Items = ['${_ALIASES}'] | .DistributionConfig.CallerReference = "'${_TIMESTAMP}'" | {DistributionConfig: .DistributionConfig}' \ get-distribution.out.json > create-distribution.input.json
create-distribution で複製
作成したjsonファイルを --cli-input-json オプションで指定します。 (file://を指定するのを忘れずに)
$ aws cloudfront create-distribution --cli-input-json file://create-distribution.input.json
成功すると結果がjsonで出力されます。
{ "Distribution": { "Status": "InProgress", "DomainName": "d2wiqwscqxxxxx.cloudfront.net", "InProgressInvalidationBatches": 0, "DistributionConfig": { "Id": "E3UN1D6ADXXXXX" }, ・・・略・・・ "ETag": "EA21MJ4YHXZXM", "Location": "https://cloudfront.amazonaws.com/yyyy-mm-dd/distribution/E3UN1D6ADXXXXX" }
更新用jsonファイルを作成して update-distribution
更新用jsonファイル作成
更新用のjsonファイルを作成します。
設定取得(get-distribution)の結果をリダイレクトするなりファイル出力するなりしてjqで書き換えます。
IfMatchに指定したETagにより更新先を識別するようですので、取得したEtagをIfMatchに設定します。
rewrite_for_update.sh
#!/bin/sh # ETag取得 _ETAG=`jq -r '.ETag' get-distribution.out.json` # IfMatchとして追加 jq -r '.Distribution | { DistributionConfig: .DistributionConfig ,Id: .Id ,IfMatch: "'${_ETAG}'" }' \ get-distribution.out.json > update-distribution.input.json
作成したjsonファイルを適宜書き換えます。
update-distribution 更新
作成後、更新箇所を変更したjsonファイルを --cli-input-json オプションで指定します。 (file://を指定するのを忘れずに)
$ aws cloudfront update-distribution --cli-input-json file://update-distribution.input.json
成功すると結果がjsonで出力されます。
{ "Distribution": { "Status": "InProgress", "DomainName": "d2wiqwscqxxxxx.cloudfront.net", "InProgressInvalidationBatches": 0, "DistributionConfig": { ・・・略・・・ "Id": "E3UN1D6ADXXXXX" }, "ETag": "E1Z529J5HXXXXX" }
おまけ
--generate-cli-skeleton でjsonファイルのひな形が取得できます
# create-distribution $ aws cloudfront create-distribution --generate-cli-skeleton # update-distribution $ aws cloudfront update-distribution --generate-cli-skeleton