AWSでオートスケーリングする際のインスタンス自己構成の実現方式案

オートスケールする際に各インスタンスをどうやって構成するのがよいかなっていうのを考えたのでメモ。

まず、起動速度が求められるケースではAMIを自分で作るというのがあるのだけれど、AMI作るのに時間が掛かるし、AMI管理するのも面倒だし、大元のAMIのアップデートも気にしないといけないしというのがあるので、AMIはAWSが提供するありのままのAmazonLinuxをいじらずに使いたい。もしいじらないといけないならPacker+Ansibleでたぶん頑張るけど。

で、やはり個人的には(起動速度がそれほど求められないケースでは)各インスタンスが起動時に自己構成するBootstrap Patternがよいんじゃないかなと。

で、考えたのが以下のような流れ。
利用プロダクトとしては「ansible」「S3」「git(gitlab)」。

  • EC2インスタンスの役割を決める。
  • 役割別にIAMロールを作る。
  • S3にIAMロール別に参照権限を分けた秘密鍵置き場を作る。
  • 秘密鍵置き場にgitの秘密鍵を置く。
  • 秘密鍵置き場にansible-vaultの秘密鍵を置く(playbookに機密情報がないなら不要)。
  • gitに役割別のplaybookを置く(プロジェクトやパス名に役割名を入れるなどして分離)。
  • EC2のオートスケールを構成する際に役割を示すタグとIAMロールを付与する。
  • EC2のオートスケールを構成する際に以下の処理をUserDataに入れる。
    • pip install ansible (yumのepelでも入るがその後うまくいかないみたい)
    • S3から秘密鍵を取得して自身のよきところに格納する(~/.ssh/confの設定とかも)。
    • gitの秘密鍵を使ってgitからplaybookを取得する。
    • ansible-playbookを実行する(ansible-vaultを使ってる場合は引数に「--vault-password-file」指定)。

playbookに機密情報がなければansible-vaultの秘密鍵は不要。
gitの秘密鍵も場合によっては不要なので本当にシンプルな構成ならS3自体不要。
playbookの構成管理しないぜというケースでは逆にgitをなくしてS3にplaybookを置くでも可。

この機構のミソは「機密情報にアクセスするための秘密鍵自体をどう守るか」という芋づる式に現れる機密情報の連鎖のなかで「インスタンスに付与されたIAMロールとそれに基づくS3の参照権限」が最終的にそれらの秘密を担保するところ。