Hubot を使って CloudFront の Distribution 一覧・Invalidation 作成を行う hubot-cloudfront

 English

Hubot を使って Amazon CloudFront の Distribution (配信) 一覧取得 と、Invalidation (無効化) 作成 を行うスクリプトを公開しました。

ngs/hubot-cloudfront

npm install --save hubot-cloudfront

Distribution (配信) 一覧取得

Distribution の ID、ドメイン、ステータス、コメント、進行中の Invalidation バッチの件数 (あれば) が取得できます。

me > hubot cloudfront list distributions
hubot > - 0: E2SO336F6AMQ08 --------------------
          domain: d1ood20dgya2ll.cloudfront.net
          status: InProgress
          comment: Distribution for static.liap.us

        - 1: E29XRZTZN1VOAV --------------------
          domain: d290rn73xc4vfg.cloudfront.net
          status: Deployed
          invalidation batches in progress: 10

ショートカットにも対応しています

me > hubot cf ls dist

Invalidation (無効化) 作成

me > hubot cloudfront invalidate E2SO336F6AMQ08 /index.html /atom.xml /javascripts/*.js
hubot > Invalidation I14NJQR76VVQAT on distribution E29XRZTZN1VOAV created.
        It might take 10 to 15 minutes until all files are invalidated.

Distribution の指定は ID のほか、Distribution 一覧の連番インデックス (ID の前の 0 起点の整数) でも指定できます。

me > hubot cloudfront invalidate 0 /index.html /atom.xml /javascripts/*.js

ショートカット

me > hubot cf inv 0 /index.html /atom.xml /javascripts/*.js

Invalidation の進捗を1分ごとに確認して、完了していたら教えてくれます。

hubot > @ngs Invalidation I14NJQR76VVQAT on distribution E29XRZTZN1VOAV completed.

Invalidation (無効化) 一覧

Distribution ID またはインデックスを指定して Invalidation の一覧を取得します。

me > hubot cloudfront list invalidates E2SO336F6AMQ08
hubot > I14NJQR76VVQAT - InProgress
        I3MAZE9OBGZ05X - Completed

ショートカット

me > hubot cf ls inv 0

なぜ作ろうと思ったのか

我ながら、普通に便利なスクリプトなのですが、もともとは CI プロセスの中から行おうとして、ライブラリが期待通りに動かなかったので、このスクリプトを作成しました。

KAIZEN platform で開発している GUI エディターは、以前発表したとおりMiddleman で開発しています。

資材は Amazon S3 にホスティングされており、一部のファイルは Amazon CloudFront で CDN 配信されています。

Origin となる Amazon S3 バケットへのアップロードは middleman-sync を使用しており、その次に middleman-cloudfront を使って Invalidation を作成しようとしました。

# config.rb
activate :cloudfront do |cf|
  cf.access_key_id     = ENV['AWS_ACCESS_KEY_ID']
  cf.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
  cf.distribution_id   = ENV['CLOUDFRONT_DISTRIBUTION_ID']
  cf.filter = %r{editor\-inner\.js$}i
  cf.after_build = false
end

この設定で、普通に filter にマッチする /javascripts/editor-inner.js の Invalidation を作成してほしいのですが、なぜか /editor-inner.js の Invalidation を作成します。

また、Invalidation の進捗は、AWS のダッシュボードに入って、都度確認 & 配信ファイルの中に含まれる Git のコミットハッシュをリロードして確認しており、とても面倒でした。

そこで HipChat にメッセージを飛ばす、簡単なシェルスクリプト を作成し、以下の様に circle.yml に設定しました。

deployment:
  default:
    branch: /deployment\/.*/
    commands:
      - bundle exec middleman sync
      - >
        ./script/hipchat-notify.sh \
          $HIPCHAT_DEPLOYEMNT_ROOM_ID \
          "hubot cloudfront invalidate $CLOUDFRONT_DISTRIBUTION_ID /javascripts/editor-inner.js"

この設定で、シェルスクリプトにより発言された命令をハンドリングし、Hubot が Invalidation を作成する様になりました。

デプロイの進捗も HipChat から Hubot と会話しながら確認できるので、とても便利です。

comments powered by Disqus