cloud-initを使ってEC2のLaunchが完了したらYoする

前置き

この記事は以下スライドに対するアンサーです。

そして、タイトルで既に出オチなのは覚悟の上です。

はじめに

Amazon Linuxのcloud-initの動きについて調べてみたで、cloud-initの最後に実行されるのはcloud_final_modulesであると書きました。そしてcloud_final_modulesには以下のモジュールが含まれています。

# The modules that run in the 'final' stage
cloud_final_modules:
  - scripts-per-once
  - scripts-per-boot
  - scripts-per-instance
  - scripts-user
  - ssh-authkey-fingerprints
  - keys-to-console
  - phone-home
  - final-message
  - power-state-change

このscripts-per-*モジュールのソースを見ると、以下のような動きになっています。

  • scripts-per-once ... /var/lib/cloud/scripts/per-once配下のスクリプトファイルが一度だけ実行。
  • scripts-per-boot ... /var/lib/cloud/scripts/per-boot配下のスクリプトファイルが起動するたびに実行。
  • scripts-per-instance ... /var/lib/cloud/scripts/per-instance配下のスクリプトファイルが、特定のインスタンスIDに対して一度だけ実行。

それでは、scripts-per-onceを使えば、EC2がLaunchされた時に通知することが出来るだろう、じゃあYo使えば良くね?というのが今回のスタート地点です。なんか無理がある気はしてるんですが気にしないで下さい。

やってみる

Amazon Linux AMIでEC2をLaunchするときに、以下のようにUser-Dataを設定します。

#cloud-config
write_files:
 - content: |
      #!/bin/sh
      curl --data "api_token=YOUR_API_TOKEN" http://api.justyo.co/yoall/
   owner: root:root
   path: /var/lib/cloud/scripts/per-once/yo.sh
   permissions: '0755'

EC2のLaunchが完了すると、api_tokenで指定したYOアカウントがyoallをしてくれるので、そのYoアカウントをFollowしているアカウント全員にYoが飛んできます。

cloud-init.logを確認すると、こんな感じでログが残っています。

Aug 22 06:56:20 cloud-init[1451]: util.py[DEBUG]: Writing to /var/lib/cloud/scripts/per-once/yo.sh - wb: [493] 99 bytes
Aug 22 06:56:20 cloud-init[1451]: util.py[DEBUG]: Changing the ownership of /var/lib/cloud/scripts/per-once/yo.sh to 0:0
Aug 22 06:56:49 cloud-init[1647]: util.py[DEBUG]: Running command ['/var/lib/cloud/scripts/per-once/yo.sh'] with allowed return codes [0] (shell=True, capture=False)

はい、出来ました!

さいごに

以上をせーのに捧げます。