AutoScalingのライフサイクルフックをAnsibleと連携させて使ってみた

# これを使うに至った経緯
ほぼ毎日日報書いてましたが、要はそこに書いてる↓これ！

>## Try :triumph:
cloud-init使ってのインスタンス起動時初期設定させたい。

### 【理由１】
**実は、ここ最近の担当プロダクト利用者の増加により、本番バッチサーバの負荷増大で、ある程度定期的にSQSにメッセージが蓄積する状態が発生し、その度にSQSからメッセージを取得して動作するワーカーを再起動してました**
　→メッセージ蓄積したときだけ、AutoScaleでスケールアウトさせて、メッセージ減ったらスケールインやるべきっしょ :exclamation: 

### 【理由２】
**AutoScaleの動作でメッセージの蓄積は回避できましたが、次はスケールアウトしてスケールインを繰り返すために、毎回起動されるインスタンスのIPアドレスが変わります:exclamation:
そのため、バッチサーバのワーカー起動状況を確認や操作できるWEB管理画面が開かなくんなるんですなー :sweat_smile:**
　→インスタンスが起動したタイミングでローカルとAutoScaleで紐づいてるサーバのIPアドレスとって、Config自動設定したいなー

ということで調査していくと、解決策として考えたのが、cloud-initということです。
しかし、調査を進めていくと、結局はローカルでシェルスクリプトが動作しているような状態でした。。。 :cry: 

これはちょっと・・・(インスタンスにUser-data書いてるのと同じだし、インスタンス別で持ってるからその差分がどうとかではまりたくないしなー)ということで、シェルスクリプトっぽい処理が一括管理できる方法を調べていくと、、、
参考サイトでやってる手段が見つかったというわけです。

他にも、下記のようなLamdaでやる方法もありましたが、「社内でAnsible使い始めてる」ということもあり、今回はこれを選びました

- [AWS Lambdaでスポットインスタンスを作成して、UserDataで環境構築や長い処理を自動で実行させる - Qiita](https://qiita.com/pyr_revs/items/c7f33d1cdee3118590e3)

# どうやったの？
- [AutoScaling時にAnsibleで環境構築を行う ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/using-ansible-at-autoscaling-launching/)

上記、参考サイトと同じです。(ありがとうございます　:bow:)構成は↓こんな感じです。
![6851caf3-ba51-03e1-358b-5803537a177c.png](https://qiita-image-store.s3.amazonaws.com/0/14268/9523719f-7699-8c38-3351-f02992f672f7.png)


# 感想とか
使ってるWEB管理ツールが悪いんじゃん？とか、もっと違うやり方もあるじゃんとかツッコミもあるかとは思いますが、
Ansible使う勉強という意味でも今回はこんな形で実装してみました。
ちょっとはまった？対応したところは、参考サイトのスクリプトが**「EC2が起動してるけど、SSHができない場合」に対応していない(SSHできちゃう前提になっていた)**ので、そこを自分の環境へ反映する際に修正したのと、**「AutoScaleでスケールアウトではなく、最初起動したときもライフサイクルフックが動作してSQSにメッセージが飛ぶ考慮がされてない」** ので、それに対応しないと常に起動時のメッセージを受信して失敗していたところです。
本番反映はこれからだけど、ひとまず、こんなことができたので、共有がてら記事書いてみました。

# 参考サイト
- [CloudInit を使って Amazon EC2 のホスト名を自動的に設定する](https://blog.manabusakai.com/2014/03/cloudinit-set-hostname/)
- [CloudInit を使って Amazon EC2 をスマートに立ち上げる](https://blog.manabusakai.com/2013/02/amazon-ec2-cloudinit/)
- [jqとAWS CLIでautoscaling groupのprivate ip addressを取得するワンライナー - notebook](http://swfz.hatenablog.com/entry/2015/12/31/231253)
- [Auto Scaling(lifecyclehook)を使ってみる - notebook](http://swfz.hatenablog.com/entry/2016/05/25/101359)
- [AutoScaling時にAnsibleで環境構築を行う ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/using-ansible-at-autoscaling-launching/)
- [【新機能】Auto Scalingのインスタンス起動/破棄時に初期処理/終了処理を追加 – LifeCycleHook機能のご紹介 ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/autoscaling-lifecyclehook/)
- [Ansibleチュートリアル 2017 ｜ Developers.IO](https://dev.classmethod.jp/server-side/ansible/ansible-tutorial-2017/)
- [ansible.cnfでssh\_configを設定する ｜ Developers.IO](https://dev.classmethod.jp/server-side/ansible/enable_ssh_conf_using_via_ansible-cnf/)
- [AWSチーム社内勉強会「Ansible」レポート ｜ Developers.IO](https://dev.classmethod.jp/event/cmstudy-ansible/)
- [【AWS】EC2のインスタンス情報からssh/configを作成するRubyスクリプト ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/ruby-ec2-create-ssh-config/)
- [Ansibleで複数行を追加する(blockinfile) - Enjoy\*Study](http://blog.enjoyxstudy.com/entry/2016/02/24/000000)
- [\[随時更新\]ansibleでよく使うコマンド・モジュールまとめ - Qiita](https://qiita.com/uzresk/items/1aa391eef232766bf817#%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E4%BB%98%E4%B8%8E%E3%81%99%E3%82%8B)
- [Ansible ～serviceモジュール～ - Qiita](https://qiita.com/moiwasaki/items/c320c7073a7ef086c5c9)