re:Invent 2017 で発表されたアップデートの中で,比較的地味ながら,個人的に嬉しかった機能が「Launch Templates」だった.簡単に言うと「インスタンスの起動オプションをテンプレート化して管理することができる機能」と表現できる.対象はオンデマンドインスタンスだけではなく,オートスケーリングでも使えるらしく,さっそく試してみた!
なぜ嬉しいか
正直言って,インスタンスの作成で管理コンソールをポチポチする場面がまだあって,CloudFormation / AWS CLI などに移行できないような環境もある.そういうときに,管理コンソールをポチポチする手順書を作ったり,CLI のオプションを Wiki にまとめたりするんだけど,属人化する感覚があるし,オペレーションミスが起きる可能性もあるので,そのリスクを軽減できる「Launch Templates」は非常に助かるなーと思っている.そういう需要が多いってことなのかも.
公式ドキュメントを読んだ
試す前に公式ドキュメントをザッと読んで,ポイントを洗い出した.
- 起動テンプレートにバージョンを付与することができる
- 自動的にバージョンが割り当てられる
- デフォルトバージョンという概念がある
- 起動テンプレートに制限がある
- リージョンごとに最大1000個まで作れる
- 起動テンプレートあたり,作れるバージョンは10000個まで
- 起動テンプレートに設定するオプションは任意で,設定しても良いし,起動時に設定しても良いし,起動時に上書きしても良い
- ただし,起動時に起動オプションを無効化することはできないため,その場合は起動テンプレートで設定しないでおく
- 起動テンプレートを保存するときにバリデーションは行わないため,起動時にエラーになる場合がある
- IAM ポリシーで,操作できる起動テンプレートを詳細に制限することもできる
テンプレートを作る
管理コンソールから「EC2 → Launch Templates」で,設定画面を開くことができる.設定画面としては,あまり凝った感じではなく,項目がズラリと並んでいる感じだった.テンプレートとして設定できる項目はドキュメントに載っている通りでかなり多く,例えば以下などがある.重要なのは「テンプレート名以外は必須ではない」という点で,共通化が必要な部分だけを設定しておくことができる.
- Launch template contents
- AMI ID
- Instance type
- Network interfaces
- Storage (Volumes)
- Tags
- Security groups
- Advanced Details
- IAM instance profile
- User data
ただし,設定画面がシンプルすぎて,入力補完などもなかったため,このあたりは改善できそうな気がする.例えば「Key pair name」や「セキュリティグループ」は,存在する候補の中から選べるようになっていないと間違える可能性があるけど,ドキュメントにも以下のように書いてあるので,間違えないように,意識的に正しく設定をする必要がある.とは言え,最低限のバリデーションはして欲しいかなー.
Launch template parameters are not validated when you create the launch template. Ensure that you specify the correct values for the parameters and that you use supported parameter combinations.
テンプレートから起動する
あとは,インスタンスを作成するときに「テンプレートからインスタンスを起動する」ボタンを押して,テンプレートを修正しながら最終的な項目を決めていく.なお,ここでテンプレートを修正しても,テンプレートには反映されないため,注意すること.このままインスタンスを起動することができるため,ポチポチする量が圧倒的に減った!
ただし,インスタンスを起動しようとしたら,以下のようなエラーが出ることがあったので,テンプレートの修正と,インスタンスの起動を何度も繰り返す必要があった.
- The parameter iops is not supported for gp2 volumes.
- Parameter encrypted is invalid. You cannot specify the encrypted flag if specifying a snapshot id in a block device mapping.
AWS CLI からテンプレートを使って起動する
起動テンプレートがあれば,CLI で簡単にインスタンスを起動することができる.CLI を最新版にすると --launch-template
オプションが使えるようになるため,ここに LaunchTemplateId
を指定するだけで良い.もしデフォルトバージョン以外で起動する場合は Version
も指定する.圧倒的に簡単になった!
$ aws --version aws-cli/1.14.5 Python/2.7.13 Darwin/15.6.0 botocore/1.8.9 $ aws ec2 run-instances --launch-template '{ "LaunchTemplateId": "lt-11111111111111111" }'
http://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html
バージョンを消す
起動テンプレートを実際に作ってみるとわかるけど,バリデーションが行われないため,インスタンスを起動しようとしてテンプレートがエラーになることが非常に多かった.なので,エラーになるバージョンが大量にできることになり,これは消さないと事故に繋がってしまう.管理コンソールからバージョンを選んで消すことができる.
また,珍しく便利だなと思ったのは「AWS CLI ならこうやって実行すれば良いよ」という「コマンドサンプル」が管理コンソールに表示されている点だった.今までこんな画面あったっけ?実際に試してみたら,問題なく表示されているコマンドでバージョンを消すことができた.
オートスケーリングで使う
起動テンプレートは,オートスケーリングでも使えるとのことだったので,Auto Scaling Group の作成時に起動テンプレートを指定してみたけど,うまく動かなかった.詳しくはドキュメントに載っているけど,オートスケーリングで起動テンプレートを使う場合は「テンプレートを完全に作っておく」必要がある.設定を上書きする自由度がないとも言える.
You must ensure that your template includes all parameters required to launch an EC2 instance.
それは仕様として良いとは思うけど,Auto Scaling Group の保存時に出るエラーが完全に固定で,起動テンプレートのどこにミスがあるのか判断できず,かなり厳しかった.エラー内容を詳細に表示するようになると嬉しい.
まとめ
- re:Invent 2017 で「起動テンプレート (Launch Templates)」が発表された
- 起動テンプレートを使うと,インスタンスの起動オプションをテンプレート化して管理することができる
- 管理コンソールでも,CLI でも,簡単にインスタンスを起動できるため,オペレーションの負荷軽減だけではなく,ミスの削減にも繋がる
- 起動テンプレートを保存するときに設定のバリデーションが行われないため,起動時にエラーになる場合がある
- 実際に試してみて,かなりエラーが出たので,最初の試行錯誤はそこそこハマりそう
参考「re:Invent 2017 速報」
re:Invent 2017 で発表されたアップデートをキャッチアップするなら Black Belt の資料が1番良いと思う.12/1 の Black Belt にも参加したけど,その後も何度も見直してるし,非常にまとまっていて素晴らしかった.Launch Templates も P.64 に載っている.
www.slideshare.net