なぜ、コンテナを使うのか?
ECS/ECRはコンテナに関するサービスですが、
なぜ、コンテナを使うのか?
コンテナを使うメリットをしっかり認識しましょう。
コンテナを使うメリットは、
開発環境と本番環境で同じ環境を使えることにあります。
また、その環境の構築がコンテナ仮想化は迅速にできます。
VM仮想化であればVMの起動に数分かかるところ、
コンテナの起動であれば数秒です。
Amazon ECSの基礎知識
Amazon ECSでできること
ECSはElastic Container Serviceの略称です。
その名の通り、dockerコンテナをAWS上で起動できるサービスです。
コンテナ起動の方法には、
EC2にdockerをインストールしてコンテナ起動という方法もありますが、
ECSはコンテナオーケストレーターであり、
何のコンテナをどう動かすか命令を出すミドルウェアです。
kubernatesのAWS版と考えてください。
ECSはコンテナオーケストレーター=ミドルウェアであり、
コンテナ実行環境は、EC2やFargateという仮想サーバーになります。
つまり、ECSがEC2やFargateにコンテナをデプロイする。
ということになります。
EC2で動かすか?Fargateで動かすか?
EC2はコンテナを仮想サーバー上で動作させます。
Fargateはコンテナをサーバーレスに動作させることができます。
EC2では、
・ホストのスケーリング
・コンテナエージェントの設定
・ホストOS/ライブラリの設定
これらは手動で管理する必要がありますが、
Fargateではその必要はありません。
そのため、Fargateをまず選択することを推奨しますが、
Fargateの方が楽な分、費用は大きくなります。
Amazon ECSのコンソール
Amazon ECSのコンソールはシンプルです。
主にクラスターとタスク定義の2つの機能があります。
httpdの単一コンテナを起動するだけでも、タスクとクラスター両方の定義が必要です。
タスク定義で設定したコンテナ群を、クラスター定義で設定した環境でデプロイ(起動)することになります。
Amazon ECSの仕組み
ECSでコンテナを実行するには、
・コンテナを作成する
・タスクを定義する
・サービスを定義する
・クラスターを定義する
必要があります。
コンテナを作成するとは、ECRに動かしたいコンテナをPUSHすることです。
タスクを定義するとは、docker-compose.ymlを書いていくイメージです。
つまりタスクとは、1つのアプリのコンテナ群のことです。
ECSのサービスとは、タスクのまとまりを指します。
サービスでは主に、タスク=コンテナ群をいくつ動かすか?を指定します。
また、複数のタスクを起動する場合は、ロードバランサを指定することができます。
Amazon ECSのクラスター
クラスターとは、タスクの実行環境です。
つまり、コンテナの実行環境です。
実行環境は主に
・EC2
・Fargate
の2つです。
さらに、ネットワークやロードバランサーの有無も環境設定を行います。
Amazon ECSのタスク定義
タスク定義とは、タスクを構成するコンテナ群の定義です。
- コンテナ定義(イメージの場所=ECRリポジトリ)
- 使用するCPU&メモリ
- タスクのIAMロール
- ネットワークモード
などを指定します。
Amazon ECSのサービス
サービスとは、タスク定義を元に作成されたタスクの論理グループです。
- タスクの起動数
- ELBとの連携
- アプリケーションタイプ(常時起動 or バッチ)
- 起動タイプ(EC2 or Fargate)
などを指定します。
Amazon ECSのタスク
タスクとは、タスク定義を元に作成された実際に起動しているコンテナ群のことです。
ECSにコンテナをデプロイする手順
ECSでnginxのみの簡単なDockerコンテナを動かしてみましょう。
次の手順です。
- ECRにコンテナをプッシュする
- ECSでクラスターを作成する
- ECSでコンテナ定義を作成する
- ECSでクラスターに対してサービスを作成する
- VPCのセキュリティグループでHTTP通信を許可する
- ブラウザからアクセスして動作確認する
Amazon ECRの基礎知識
Amazon ECRはAWS謹製のDockerイメージレジストリです。
レジストリ≒リポジトリと考えてください。
Dockerfileを書いて、docker buildによってDockerイメージを作成する。
作成したイメージをECRにプッシュする。
ECSではECRからイメージをプルして起動する。
という流れになります。
Amazon ECRにイメージをプッシュするには?
ECRにプッシュする方法はいくつかありますが、2つ紹介します。
1つは、ローカルのターミナルからAWS CLIを使用してECRにプッシュする方法。
もう1つは、CodeDeployでイメージをビルドして、アウトプットとしてECRにプッシュする方法です。
AWS CLIを使用してECRにプッシュする
ECR/ECSのエラー
Create TaskDefinition: Fargate requires task definition to have execution role ARN to support ECR images
ECRのタスク定義でECRのイメージを指定したときに発生する可能性があるエラーです。
原因:タスク実行IAMロールにECRへのアクセス権限がない。
対策:タスク実行IAMロールにECRへのアクセス権限を付与する。