本記事では、2022年5月25〜26日に行われた AWS Summit JAPAN のセッション「クラウドにリフトしたアプリケーションをコンテナ化するためのアプローチ(AWS-48)」をレポートします。
セッションについて
概要
アプリケーションをオンプレからそのままリフトしたお客様が、その次にコンテナ化するためのアプローチについてご紹介します。
スピーカー
AWS 技術統括本部 ソリューションアーキテクト 竹本 将気 氏
アジェンダ
- なぜコンテナなのか? - コンテナ化のアプローチ - まとめ
レポート
なぜコンテナなのか?
昨今、企業のアプリケーションに求められているもの
- 敏捷性 => アプリケーションを迅速に市場へリリースする
- 拡張性 => 数百万人規模のユーザへの拡張を可能にする
- 可用性 => 障害が起きてもアプリケーションを継続させ続ける
- etc…
上記を実現するには、アプリケーション基盤(プラットフォーム)が重要になってくる。
コンテナの特性として可搬性の高さ
がある。(= アプリケーションの依存物を1つのパッケージにまとめることで、異なるプラットフォーム上でも同一の動きを実現できる)
この特性を生かすことで
- オペレーションの効率化 - スケーラビリティ - 高速な開発サイクル
を実現することができる。
コンテナ化のアプローチ
アプローチの一例
1. コンテナ化の目的を整理する 2. 移行方法を検討する 3. コンテナを設計する 4. コンテナイメージを作成する 5. AWS のコンテナサービスを検討する
コンテナ化の目的を整理する
- オペレーションの効率化
- スケーラビリティの向上
- 開発サイクルを高速に
- etc…
手段が目的にならないように、目的を明確にしなくてはいけない。
移行方法を検討する
マイグレーションの7つパターン
https://aws.amazon.com/jp/builders-flash/202011/migration-to-cloud-2/?awsf.filter-name=*all
コンテナ化の場合は以下パターンが該当する。
- Replatform(プラットフォーム変更) => モノシリックなアプリケーションをそのままコンテナ化 - Refactor(リファクタリング) => アプリケーションをマイクロサービスアーキテクチャにして、マイクロサービスごとにコンテナ化
Refactorパターンの移行戦略としてストラングラーパターンがある。
コンテナを設計する
以下は、コンテナの最大のメリットでもある可搬性を高めるために大切なこと。
- エフェメラルコンテナを作成する
- コンテナをステートレスに
- ホストマシンへ依存しない
- サイドカーコンテナの利用
- コンテナに設定情報を含まない
- ParameteStoreなどの利用
- コンテナごとに1つのプロセスを実行
- 1つのコンテナに複数の役割を持たせない
- シグナルハンドリングによる安全な停止
- コンテナは頻繁に開始/終了するので、アプリケーションに影響を与えない停止にする
- ログは標準出力・標準エラーへ
- ログはファイルに書き込まず、Cloudwatch logsなどへストリーミングさせる
コンテナイメージ作成方法
- Dockerfile を自作
- AWS App2Container(A2C)を使用
- Cloud Native Buildpacks(CNB)を使用
Dockerfile を自作する際は、hadolintが便利!
A2Cは Java と.NET のみ対応しているため、それ以外の言語はCNBを利用する。
AWS のコンテナサービスを検討する
いざコンテナ化するとなると考えなくてはいけないことがたくさん。。
=> AWS のコンテナサービスでコンテナ化を楽に!
App Runner を使えば開発者はインフラをほぼ全く意識しなくて良いが制約もあるため、App Runner が要件にフィットしない場合はECS/EKSなどを選択する。
まとめ
- なぜコンテナなのか
- 可搬性の高さから、効率的なオペレーション/スケーラビリティ/高速な開発サイクルという効果を期待できる
- コンテナ化のアプローチ
- コンテナ化の目的を整理する
- コンテナ化で何がしたいのかを考える
- 移行方法を検討する
- Replatform or Refactor
- コンテナを設計する
- 可搬性を高める設計を意識する
- コンテナイメージを作成する
- Dockerfile or A2C or CNB
- AWS のコンテナサービスを検討する
- App Runner or ECS/EKS
- コンテナ化の目的を整理する
所感
- コンテナ化することが目的といった手段が目的化するということがないように、目的を設定/整理することが一番重要だと感じた
- コンテナ化するということはアプリケーションの理解が必須、「インフラエンジニアだからアプリケーションは知らない」という考えではコンテナ化にうまく対応できないと思う
- アプリケーションの勉強(特にフレームワークなどのアプリケーションアーキテクチャに大きく関連するもの)しなければ!