

# Amazon ECS 用のアプリケーションの構築
<a name="application_architecture"></a>

アプリケーションのタスク定義を作成して、アプリケーションを構築します。タスク定義には、次のようなアプリケーションに関する情報を定義するパラメータが含まれます。
+ タスクをホストするインフラストラクチャを決定するキャパシティ。

  EC2 キャパシティプロバイダーを使用する場合は、インスタンスタイプも選択します。Amazon ECS マネージドインスタンスのキャパシティプロバイダーを使用すると、Amazon ECS がコンピューティングキャパシティを管理するためのインスタンス要件を提供できます。GPU などの一部のインスタンスタイプでは、特定のパラメータを設定する必要があります。詳細については、「[Amazon ECS タスク定義のユースケース](use-cases.md)」を参照してください。
+ コンテナイメージには、アプリケーションコードと、アプリケーションコードの実行に必要なすべての依存関係が保持されます。
+ タスク内のコンテナで使用するネットワーキングモード。

  ネットワークモードにより、タスクがネットワーク上で通信する方法が決定します。

  EC2 インスタンスおよび Amazon ECS マネージドインスタンスで実行するタスクには、オプションが複数存在します。その中でも `awsvpc` ネットワークモードの使用を推奨します。`awsvpc` ネットワークモードでは、VPC 内でのアプリケーション同士や他のサービスとの通信方法に対してより詳細な制御を可能にすることで、コンテナネットワークが簡素化されます。

  Fargate で実行されるタスクについては、`awsvpc` ネットワークモードを使用する必要があります。
+ タスクで使用するログ記録設定。
+ タスク内のコンテナで使用するデータボリューム。

タスク定義パラメータの完全なリストについては、「[Fargate での Amazon ECS タスク定義パラメータ](task_definition_parameters.md)」を参照してください。

タスク定義を作成する際には、次のガイドラインに従ってください。
+ 各タスク定義ファミリーは 1 つのビジネス目的にのみ使用してください。

  複数の種類のアプリケーションコンテナをまとめて同じタスク定義にグループ化する場合、これらのコンテナを個別にスケールすることはできません。たとえば、ウェブサイトと API では通常、異なるスケーリングパターンが必要となります。トラフィックが増加すると、API コンテナとは異なる数のウェブコンテナが必要になる場合があります。これらの 2 つのコンテナが同じタスク定義にデプロイされる場合、各タスクは同じ数のウェブコンテナと API コンテナを実行します。
+ 各アプリケーションのバージョンを、タスク定義ファミリー内のタスク定義リビジョンと一致させます。

  タスク定義ファミリー内では、各タスク定義のリビジョンは、特定のコンテナイメージのその時点での設定のスナップショットを表します。これは、コンテナがアプリケーションコードの特定のバージョンを実行するために必要なすべての構成要素のスナップショットであることと似ています。

  アプリケーションコードのバージョン、コンテナイメージタグ、およびタスク定義のリビジョンの間に、1 対 1 のマッピングを作成します。一般的なリリースプロセスには、git commit SHA でタグ付けされたコンテナイメージに変換される git commit が含まれます。その後、そのコンテナイメージタグは、独自の Amazon ECS タスク定義リビジョンを取得します。最後に、Amazon ECS サービスを更新し、新しいタスク定義のリビジョンをデプロイします。
+ タスク定義ファミリーごとに異なる IAM ロールを使用します。

  各タスク定義を独自の IAM ロールで定義します。このプラクティスを実装するのに併せて、各ビジネスコンポーネントにそれ独自のタスク定義ファミリーを提供します。これらのベストプラクティスを両方実装することで、各サービスが AWS アカウント内のリソースにどの程度アクセスできるかを制限できます。例えば、パスワードデータベースに接続するためのアクセス権を認証サービスに付与できます。同時に、注文サービスのみがクレジットカードの支払情報にアクセスできることを確認できます。