macOSのスリープ時にEC2を落とそう

記事タイトルとURLをコピーする

CI部の千葉です、随分前に開発環境をEC2に移行しました。 参考: エンジニアブログ - 開発環境をAmazonEC2に移した結果、僕のVimはもうしゃべらない それから6年も経っていることに驚きましたが、いまでも快適にEC2で開発をしています。

さて、Amazon EC2 は利用時間に対する課金なので『開発をしている時間 = 利用料』 となります。 特別な理由がない限りは t3.small インスタンスを利用しているので 約20USD/月 の利用料がかか る計算になります。 以下のメリットを考えると、高くない金額だと感じています。

  1. ローカル環境にソースコードを置かない
  2. スケールアップ・ダウンができる
  3. Amazon Elastic Block Store (EBS) を利用している
  4. ローカル環境が故障しても他端末から開発が継続できる
  5. Cloud Automator で毎日AMIを取得しているので7日前までの開発環 境を復元可能

とはいえ、自分しか利用しない環境なので不要な時間は停止しておくことでコストの最適化が可能です 。 8時間/日で、月に20日間の稼働とすると 約4.5USD/月 まで最適化することが可能です。(すごい!) ってことで、先日まで Cloud Automator の EC2-インスタンスを停止 機能をつかって、毎日20時になるとインスタンスを自動停止する運用をしていました。

利用料の最適化はできたのですが、時間を忘れて開発に集中したまま20時を迎えた際に悲鳴をあげていま した。 なんてったって、時間を忘れるくらい集中している途中でマシンが停止するワケですからね。 RPGでセーブする前にブレーカーが落ちたときの心です。

こんな状況を6年もガマンしていたのですが、昨晩の20時に堪忍袋の緒が切れました。 わたし怒ってます。 なんとかコストを最適化をしつつ、20時強制シャットダウンの呪いから開放されたい。

そこで、みつけたのが sleepwatcher です。 macOS の Sleep / WakeUp をトリガーにスクリプトを仕込むことが可能なツールです。 これをつかって、MacBookを閉じた際に Cloud Automator の HTTPトリガー を経由でインスタンスを停止することにしました。

1. インストール

HomeBrew コマンドからインストールします。

$ brew install sleepwatcher

2. 手動起動、自動起動設定

インストール後は $ brew info sleepwatcher の内容に従って、設定していきます。

2-1. 手動起動

$ brew services start sleepwatcher

2-2. 自動起動の設定

$ cp /usr/local/opt/sleepwatcher/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist ~/Library/LaunchAgents/sleepwatcher.plis

4. スクリプトの作成

今回は Sleep 時の設定なので ~/.sleep ファイルを作成します。 もし、WakeUp 時に何かを仕込みたい場合は ~/.wakeup ファイルを作成してください。

4-1. ファイルの作成

$ touch ~/.sleep
$ chmod +x ~/.sleep

4-2. 作成した ~/.sleep ファイルの編集

以下のスクリプトでは『土日』もしくは『19時以降』にスリープした際に Cloud Automator の HTTPト リガーを実行してインスタンスを停止させます。 平日の19時前は会議等で頻繁に移動するので、そこでは反応しないようにしました。

#!/bin/bash

if [ 5 -lt `date +%u` -o 18 -lt `date +%H` ]; then
  curl https://manager.cloudautomator.com/trigger/******************************** \
    -X POST \
    -H "Authorization: CAAuth ********************************" \
    -H "Content-Length: 0"
fi

exit 0

5. 動作確認

現在、こちらは土曜日の15時です。 この状態で、MacBookを閉じればスクリプトが実行されて Cloud Automator のジョブ経由でインスタン スが停止ます。

ってことで、↓動作確認した結果がこちらです。

バッチリ『成功』でございます。

まとめ

これで、20時にオフィスで悲鳴をあげずに済みそうです。 お試しの際は自己責任でお願いします。