EC2 Image Builderの使いどころを考える

こんにちは。証券企画室の佐藤です。

企画室という名前ですが、エンジニアが何人か在籍していて、スマホにデザインが最適化された株アプリ、ferciを開発しています。

f:id:monex_engineer:20191212093533p:plain

AWSのre:Invent

さて、今年もラスベガスではAWSのre:Inventにて色々なアップデートが発表されています。
EC2 Image Builderはその中でも、多くの方が利用するであろう追加機能ではないでしょうか。
基本的な機能や操作は触ってみればわかるので割愛し、実際の運用上どうなのかを評価してみたいと思います。



UserGuideを読んで

いきなりですがGUIコンソールを触り、UserGuideを一通り読んだ感想です。

  • AMIとそれを作る元になったコンポーネントを紐付けて残せるのは素晴らしい。
  •  コンポーネントとレシピを修正して実行するときにパイプラインを最初から作り直さなければならず大変。

 APIでパイプラインの取得と作成ができるので、最新のレシピを使うようにパイプラインの新バージョンの作成を自動化すれば良さそうです。

 こちらもAPIを使えば解決できます。

  •  パイプライン実行のトリガーがマニュアルか、定期実行しかない。

 セキュリティ面のアップデートを最新にする目的で設計されているからだと思うのですが、コンポーネントのコードをバージョン管理し、コミットした時点でテストのために走らせたいところです。

IaCを徹底しようとするならば、APIでの作り込みが必要になるかなと感じました。
しかし、2,3ヶ月後くらいにはCloudFormationでリソースを記述できるようになると思うので、そうなると上記のほとんどの問題は解決されるかと思います。
今後のさらなるアップデートに期待したいです!

Image Builder考察

ここで記事を終えても良いのですが、何よりもSaaSの醍醐味は、公式が想定している以外にどう使えるかを考えることです。
Image Builderは事例紹介などでよく”ゴールデンAMI”と呼ばれるAMIの作成を支援するツールとして実装されているように見えますが、サーバの種類別や環境固有の設定もできないだろうか、ということについて考えてみます。

とはいえ皆様色々なAMI作成プロセスをお持ちだと思うので、今回は我々ferciチームの実装を元に考えてみます。
私たちのチームでは典型的ではありますが、下記のようにAMIを作成しています。これらをPythonスクリプトで自動化することで、作業ミスを無くしています。

  1. 開発環境で、ベースとなるAMIからEC2を起動。
  2. 起動したEC2内でAnsibleのPlayBookを実行し、OSの設定、ミドルウェアのインストールと設定、環境固有の設定を行う。
  3. EC2を停止してAMIを作成。
  4. AMIをステージング環境、本番環境のAWSアカウントに共有。

Packer使えばいいのではという意見が返って来そうですが、これだけのためにOSSやコミュニティ版のツールを増やしたくなく、Packerは利用していません。
代わりにPythonを書けるメンバーが何人かいるので、上記をPythonスクリプトで自動化して省力化しています。

 

f:id:monex_engineer:20191206161833p:plain

ferciシステムのAMI作成プロセス

これらをEC2 Image Builderで自動実行できれば、開発環境でスクリプト実行コマンドを打つ必要がなくなります。
すぐに思いつくのは、今あるAnsibleのPlayBookをそのままコンポーネント内で実行することです。

必要な要件をいくつか書き出してみます。

  •  PlayBookの実行結果を得たい。

 ActionModulesのドキュメントを読むと、Bashコマンド実行時のstdoutを返してくれるようなので、何もせずとも結果を知ることができます。

 セキュリティの観点から、gitリポジトリはアクセス元IPアドレスでの制限をかけています。パイプラインを実行するVPCとサブネットを指定できるため、NAT Gatewayを通すことでソースIPを限定することができ、要件は満たせそうです。

  •  GitHubへのアクセス用クレデンシャルを安全な場所に格納したい。

 CodeBuildだとGitHubのクレデンシャルを設定できますが、Image Builderだと設定できなさそうです。

  •  AnsibleVaultのパスワードを暗号化して安全な場所に保管しておき、コンポーネントから参照したい。

 SSMパラメータストアに格納できれば良いのですが、今の所SSMにアクセスすることはできなさそうです。

  •  Ansibleコードをコミットした時点で、AMIのビルドを走らせたい。

 現状はマニュアル実行と定期実行しか無いようです。

まとめ

まとめると、Image Builderに下記の機能追加があると、我々ferciチームのAMI作成プロセスを改善するために利用できそうです。

  •  CloudFormationでのEC2 Image Builderサポート
  •  コンポーネント実行時のSSMパラメータストア参照
  •  パイプライン実行時のSCMトリガー追加



これらは他社さんでもニーズがあると思うので、今後のアップデートに期待したいです!

佐藤 俊介 証券企画室