

# Amazon ECS 用の EC2 キャパシティのアーキテクト
<a name="launch-type-ec2"></a>

料金を最適化する必要がある大規模なワークロードには EC2 キャパシティを使用します。

EC2 を使用してタスク定義とサービスをモデル化する方法を検討する際には、一緒に実行する必要があるプロセスはどれか、また、各コンポーネントをどのようにスケールするかについて検討することをお勧めします。

例えば、以下のコンポーネントで構成されるアプリケーションがあるとします。
+ ウェブページに情報を表示するフロントエンドサービス
+ フロントエンドサービスに API を提供するバックエンドサービス
+ データストア

この例では、共通の目的で使用されるコンテナをまとめてグループ化するタスク定義を作成します。異なるコンポーネントは、複数のタスク定義に分割します。以下の例のクラスターでは、3 つのコンテナインスタンスにより、3 つのフロントエンドサービスコンテナ、2 つのバックエンドサービスコンテナ、さらに 1 つのデータストアサービスコンテナを実行しています。

一緒に実行する必要のあるリンクされたコンテナなど、関連するコンテナをタスク定義にグループ化できます。例えば、フロントエンドサービスに追加するログストリーミングコンテナは、同じタスク定義に含めることができます。

タスク定義を作成したら、それらの定義からサービスを作成して、使用可能なタスクの必要数を維持できます。詳細については、「[Amazon ECS のローリング更新デプロイの作成](create-service-console-v2.md)」を参照してください。サービスでは、コンテナを Elastic Load Balancing ロードバランサーに関連付けることができます。詳細については、「[ロードバランサーを使用して Amazon ECS サービストラフィックを分散する](service-load-balancing.md)」を参照してください。アプリケーションの要件が変更された際には、サービスを更新してタスクの必要数を増減できます。あるいは、サービスを更新して、タスクに新しいバージョンのコンテナをデプロイすることも可能です。詳細については、「[Amazon ECS サービスを更新する](update-service-console-v2.md)」を参照してください。

![\[3 つのインスタンスを使用するアプリケーションアーキテクチャの例。インスタンス 1 には、フロントエンドサービスコンテナとデータベースサービスコンテナが含まれています。インスタンス 2 とインスタンス 3 には、フロントエンドサービスコンテナとバックエンドサービスコンテナが含まれています。\]](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/images/application.png)


# EC2 と Amazon ECS の外部インスタンスでのコンテナイメージのプル動作
<a name="pull-behavior"></a>

コンテナーの起動にかかる時間は、基礎となるコンテナイメージによって異なります。たとえば、太いイメージ (Debian、Ubuntu、Amazon 1/2 のフルバージョン) は、それぞれのスリムバージョン (Debian-Slim、Ubuntu-Slim、Amazon-Slim) や小さいベースイメージ (Alpine) と比較して、コンテナ内で実行されるサービスの数が多いため、起動に時間がかかる場合があります。

Amazon ECS エージェントはタスクを開始すると、リモートレジストリから Docker イメージを取得し、ローカルコピーをキャッシュします。アプリケーションのリリースごとに新しいイメージタグを使用する場合、この動作は不要です。

`ECS_IMAGE_PULL_BEHAVIOR` エージェントパラメータはイメージのプル動作を決定します。以下のオプションが利用できます。
+ `ECS_IMAGE_PULL_BEHAVIOR`: `default`

  イメージはリモートでプルされます。プルが失敗した場合、インスタンスにキャッシュされたイメージが使用されます。
+ `ECS_IMAGE_PULL_BEHAVIOR`: `always`

  イメージはリモートでプルされます。プルに失敗した場合、そのタスクは失敗します。

デプロイをスピードアップするには、Amazon ECS エージェントパラメータを次のいずれかの値に設定します。
+ `ECS_IMAGE_PULL_BEHAVIOR`: `once`

  同じコンテナインスタンスの以前のタスクによりイメージがプルされていないか、自動クリーンアッププロセスによってキャッシュされたイメージが削除された場合にのみ、イメージがリモートでプルされます。それ以外の場合は、インスタンスにキャッシュされたイメージが使用されます。これにより、不要なイメージのプルがなくなります。
+ `ECS_IMAGE_PULL_BEHAVIOR`: `prefer-cached`

  キャッシュされたイメージがない場合に、リモートでイメージがプルされます。それ以外の場合は、インスタンスにキャッシュされたイメージが使用されます。キャッシュされたイメージが削除されないように、そのコンテナの自動イメージクリーンアップはオフになっています。

`ECS_IMAGE_PULL_BEHAVIOR` パラメータを前述の値のいずれかに設定すると、Amazon ECS エージェントはダウンロードされた既存のイメージを使用するため、時間を節約できます。Docker イメージのサイズが大きい場合、ダウンロード時間がネットワーク経由で取得されるまでに 10 ～ 20 秒かかることがあります。