AQ Tech Blog

コンテナの基礎からはじめるECS ☓ CDK

作成者: tsuyoshi.watanabe|2024年05月31日

はじめに

クラウドインテグレーション部の渡邊です。
コンテナ、ECS、CDKに関連する登壇を先日行ったため、記事にまとめました。
各内容の基礎から、部分的ではありますがベストプラクティスまで説明しているため、ぜひご覧ください。

まとめ

  • コンテナとは、OS内で仮想化されたアプリケーションの実行環境
  • コンテナの特徴は軽量性、再現性、隔離性、拡張性
  • ECSとはコンテナ用オーケストレーションサービスで、クラスタ、タスク定義、サービス、タスクで構成される
  • CDKとは、プログラミング言語を用いてクラウドインフラをコードで定義し、CloudFormationによってデプロイできる開発フレームワーク
  • CDKはApp、Stack、Constructで構成される

ECS

コンテナについて

コンテナとは、OS内で仮想化されたアプリケーションの実行環境で、コンテナエンジンを用いて動かす仮想化技術のひとつです。
OSの上にあるコンテナ管理ソフト(コンテナエンジン)でコンテナを管理します。
コンテナの特徴は主に以下4つです。

  • 軽量性・・・ホストOSのカーネルを共有するため、仮想マシンよりも素早い起動や効率的なリソース利用が可能。コンテナはプロセスであるため仮想マシンと比べ起動時間が短い
  • 再現性・・・コンテナにはアプリケーションとその依存関係がパッケージ化されているため、異なる環境(開発環境、テスト環境、本番環境)で一貫した動作が可能。ローカルから実環境への適用においても優れている
  • 隔離性・・・異なるコンテナが独立して動作し、互いに影響をあたえることなく動作するため、ユーザーは異なるアプリケーションやサービスを同一ホスト上でセキュアに実行可能である
  • 拡張性・・・動的なスケーリングでスケーラビリティが向上。オーケストレーションツール(Amazon ECS、Kubernetes)の使用で効率的に管理可能である


Dockerについて

Dockerとは、軽量で高速に動作するコンテナ型仮想環境用プラットフォームのことで、コンテナを動かすためのコンテナエンジンです。
Dockerコンテナが完成するまでに以下の過程を経ます。

①DockerイメージのオンラインレジストリであるDockerHubからベースイメージを取得する(DockerFileにベースイメージの情報を記載する)
②コンテナの設計書にあたるDockerfileの情報をもとに、Dockerイメージを作成する
③Dockerレジストリへイメージをプッシュ、またはローカルにコンテナを起動する
④Dockerレジストリへイメージをプッシュした場合、イメージに基づいて任意のプラットフォームでコンテナを起動する
Dockerイメージ(コンテナイメージ)は変更差分のあるイメージレイヤーの集合のことです。
ベースイメージの指定に加え、ファイル追加やパッケージのインストールなど実行したい内容をDockerfileに記載し、Dockerイメージを構成します。

Amazon ECSについて

ECSとはコンテナ化されたアプリケーションのデプロイ、管理、スケーリングを簡素化するためのオーケストレーションサービスです。
機能として、デプロイ、スケーリング、ネットワークロードバランシングなどが挙げられます。
複数のコンテナに対して、コマンドを実行する必要がなく、運用管理が楽になります。

ECSの構成要素は主に4つです。

①クラスタ

  • コンテナを動かすための論理的なグループ
  • 複数のタスクが配置され、それぞれ独自のコンテナを実行

②タスク定義

  • ECSタスクの実行に必要な情報を定義(コンテナイメージ、CPUおよびメモリのリソース制約、ネットワーク設定など)
  • タスク定義は複数のコンテナを含むことができる
  • 障害などでタスクが停止してもサービスで指定した数に基づいて再作成される
  • 編集できないのでリビジョンでバージョン更新する

③サービス

  • 一連のタスクを実行およびスケールする方法を定義
  • サービスは特定のタスク定義を使用し、指定された数のタスクを起動および維持
  • ELBと連携可能
  • 起動タイプ(EC2、Fargate)を設定

④タスク

  • タスク定義に基づいて起動されるコンテナ群
  • タスクは1つ以上のコンテナから構成される
  • タスク内コンテナは同一ホスト上で実行される

ECSと関連の深いサービスとしてECRが挙げられる。
ECRはDockerイメージの保存場所で、タスク定義でイメージレジストリを参照する。
ECRは脆弱性のスキャン、イメージの暗号化機能を提供している。

ECSの実行環境として、EC2またはAWS Fargateを選択できる。
これらを使用してコンテナをホストするクラスタを管理する。

ECS on Fargateは、ECS on EC2と比べると利用者の責任範囲が小さい分、リソースの詳細な設定ができない。
しかし、サーバレスであるためシンプルな運用が可能。

CDK

CDKとは、プログラミング言語を用いてクラウドインフラをコードで定義し、CloudFormationによってデプロイできる開発フレームワークのことです。 メリットとしては、手順書の省力化、テストの自動化による開発スピードの向上、手動による操作ミス防止などが挙げられます。

CDKはApp、Stack、Constructで構成されてます。
App > Stack > Construct という包含関係があるため、1つのAppに複数のStack、1つのStackに複数のConstructが含まれます。

App・・・構成のエントリポイント
Stack・・・Cloudformationスタックを表現する入れ物
Construct・・・具体的なAWSリソースを作成

CDKのベストプラクティス

AWS CDKでクラウドアプリケーションを開発するためのベストプラクティスをベースにCDKのベストプラクティスを記載しております。

  • コードを管理するためのベストプラクティス
    • すべてのアプリケーションは、1つのリポジトリにある1つのパッケージから始める
      • デプロイ時の影響範囲が小さくなるため
    • コードのライフサイクルやチームの所有権に応じてリポジトリに分割する
    • インフラストラクチャコードとアプリケーションコードを同じパッケージにする
      • テストやプロジェクト間共有などが容易になるため
  • Construct ライブラリ
    • StackではなくConstructでアプリをモデル化する
    • 環境変数ではなく、API (プロパティ、メソッド) で設定する
    • インフラストラクチャのユニットテスト
    • ステートフルリソースのスコープとIDを変更しない
    • コンプライアンスのためにConstructを使わない
  • CDKアプリ
    • デプロイ時ではなく、合成時に決定する
    • 自動で生成されるリソース名を使用し、物理的な名前を使用しない
    • デプロイ要件に応じて、アプリケーションのStageを複数のStackに分割する
    • AWS CDKでロールとセキュリティグループを管理できるようにする
    • 全てのStageをコードでモデル化する
    • 全てを測定する

【参考】
Boost your infrastructure with the AWS CDK
Container technology terminology
Docker入門(第四回)~Dockerfileについて~