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

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

    目次

      はじめに

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

      まとめ

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

      ECS

      コンテナについて

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

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


      Dockerについて

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

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

      Amazon ECSについて

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

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

      ①クラスタ

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

      ②タスク定義

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

      ③サービス

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

      ④タスク

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

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

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

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

      CDK

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

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

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

      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について~