読者です 読者をやめる 読者になる 読者になる

vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

AWS CLI コマンドラインでCloudFront

AWS CLI

CloudFront.jpg

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-skeletonjsonファイルのひな形が取得できます

# create-distribution
$ aws cloudfront create-distribution --generate-cli-skeleton
# update-distribution
$ aws cloudfront update-distribution --generate-cli-skeleton

まとめ