ECRにイメージを保存したら、そのイメージからコンテナを作成するためのタスク定義(task definition)を行う。
タスク定義(task definition)はAWSのECS(Elastic Container Service)のサービスの一つ。
ECSはDockerのこと。ローカルではなくAWS上でDockerを使う(運用する)ためのサービス。
開発環境ではなく、本番環境(またはステージング環境)を作成する場合に使う。
AWSのタスク定義とは何か?(Dockerでいう何のことか)
タスク定義はDcokerでいうところ、
- Dockerのインストールサーバーの設定
- コンテナ起動のためのイメージの取得
- コンテナ起動のための要件定義
になる。
なので、docker-compose.ymlがタスク定義にあたる。
docker-composeで複数のコンテナを定義できるのと同様に、ECSでも1つのタスクの中に複数のコンテナを定義できる。
docker-compose.ymlの例
コンテナを起動するためのイメージを指定し、起動要件を定義している。
services:
web:
build: .
image: test:latest
container_name: web_app
ports:
- "8000:80"
env_file:
- .env.local
environment:
- APP_ENV=local
- APP_DEBUG=true
volumes:
- .:/code
networks:
- front-tier
- back-tier
これを、ECSのタスク定義で行う。
タスク定義の手順
まずは、AWSにログインしてECSのサービスからタスク定義を行う。
「新しいタスク定義の作成」をクリック。
起動タイプの互換性の選択
起動タイプは、Dockerを展開するためのインフラとなる仮想サーバーのこと。
基本的にはFargateを選ぶ。選択したら右下の「次へ」をクリック。
FargateはECS専用のサーバーで、AWSが保守管理をしてくれる手間いらずなサーバー。
(参考)FargateとEC2の違い。タスク定義ではどちらを選べばいいのか?
タスクとコンテナ定義の設定
次にタスクとコンテナの定義の設定を行う。やることは、
- タスク定義名とタスクロールの選択
- タスク実行のロールの選択
- タスクサイズの選択
- コンテナの定義
となる。他にも設定できるオプションはあるが、ここでは主要どころのみ設定。
タスク定義名とタスクロールの選択
タスク定義名の設定
任意で好きなタスク名を設定可能。
後ほどクラスターを作成するときに必要になるので、わかりやすい名前にしておく。
タスクロールの選択
コンテナを起動したときに、コンテナからAWSのサービスに接続したい場合に設定する。
どのAWSサービスへの接続を許可するかは、AWSのIAM(Identity and Access Management)で設定する。
IAMのロール名を作成し、そこにAWSのサービスを付与する。
▼ECS用のタスクロール
ECSでの選択はプルダウンから行う。
ここで表示されるのは、「AWS サービス: ecs-tasks」となっているロールのみ。
ECS専用のロールとして、デフォルトでecsTaskExecutionRoleが用意されている。
▼IAMのタスクロールの例
S3やEC2、CouldFontへのアクセスを許可している。
ネットワークモード awsvpc
Fargateではawsvpcとなる。
awsvpcはAWS VPCのことで、Amazon Virtual Private Cloudの略。
AWS上のサービスを一つのまとまり(ネットワーク)として定義できる。
一つのvpcの中に定義したサービス同士はもちろん接続される。他のaws vpcとも接続することができる。
今回タスク定義する Fargate用に専用のAWS vpcが作成される。
タスク実行のロールの選択
コンテナ起動時にECR(Elastic Container Registry)からイメージの取得を許可するIAMロールを設定する。
ecsTaskExecutionRoleを選択すればOK。
ecsTaskExecutionRoleはAWSがデフォルトで用意しているタスクロール。
このAmazonECSTaskExecutionRolePolicyがメインで、この中で、①ECRの読み込み許可と②CloudWatch Logs(AWSのログ管理機能)へのデータ送信を許可している。
タスクサイズの選択
1つのタスクに割り当てるCPUとメモリのサイズを設定する。
1つのタスクの中には複数のコンテナが設定できるが、各コンテナに毎に設定するCPUとメモリの合計は、ここで指定したタスクサイズ以内となる。
FargateはCPUとメモリの使用上限の設定が必須。AWSがその決められた範囲内で各コンテナにいい感じに割り振ってくれる。(コンテナ毎のメモリとCPUユニットを定義しない場合)
EC2の場合はタスクサイズの設定はオプションなので設定しなくてもいい。必要な量に応じて自動的に調整される。
・タスクメモリ[GB]
0.5GB ~ 30GB
・タスクCPU[vCPU]
0.25, 0.5, 1, 2, 4vCPU
vCPUとは何か?
Virtual CPUの略で、仮想サーバー毎に割り当てられたCPUのサイズを表す。
適用可能なCPUとメモリサイズ
タスクCPUとメモリサイズには適用可能な組み合わせがある。範囲外は設定できない。
タスクCPU | CPUユニット数 | タスクメモリ |
---|---|---|
0.25vCPU | 256 | 512MB, 1 ~ 2GB |
0.5vCPU | 512 | 1 ~ 4GB |
2vCPU | 2048 | 4 ~ 16GB |
4vCPU | 4096 | 8 ~ 30GB |
適用するタスクCPUやタスクメモリのサイズが大きいほど、ヘビーな処理もできるようになるが、その分料金も増す。
▼適用範囲外の例
今回は、1つのコンテナしか使用しないため、タスクメモリ:2GB(2MiB)、タスクCPU:1024(1vCPU)を選択する。
コンテナの数が増える場合は、CPUやメモリを増やす。
コンテナの定義
「コンテナの追加」をクリックして、タスクの中に起動するコンテナを定義していく。
コンテナ名
任意のコンテナ名を設定。
docker-compose.ymlのcontainer_nameディレクティブ。
イメージ
コンテナの起動に使用するイメージを記載する。
・<ホスト名>/<レポジトリ名>
ECRのイメージを使用する場合は以下のようになる。
111111111111.dkr.ecr.ap-northeast-1.amazonaws.com/test-app
プライベートレジストリの認証
ECR以外のイメージを使用する場合に設定する。
メモリ制限
メモリ制限にはソフト制限とハード制限がある。
Fargateの場合はAWSが自動で割り振るため設定しなくてもいい。設定した場合は各コンテナのメモリ使用上限値となる。(EC2の場合は必須)
ソフト制限とハード制限の違い
ハード制限はmemory
、ソフト制限はmemoryReservation
という。
・ハード制限の場合
設定したメモリを超えるとコンテナを強制終了する。
・ソフト制限の場合
設定したメモリを維持しようとする。ただし、一時的に設定したメモリを超える場合などは余っているメモリを自動で割り当てる。
ソフト制限とハード制限の併用する場合
ソフト制限で維持して欲しいメモリを割り当て、仮にそのメモリをオーバーしたとき、ここのメモリを超えたら強制終了したい!という場合に、ハード制限も設定することができる。
このため、ハード制限はソフト制限よりも大きくする必要がある。
例えば、ソフト制限128MiBに対してハード制限256MiBを設定すると、一時的に128MiBを超えても256MiB以内であればコンテナは処理を続行する。
256MiBを超えてしまった場合はコンテナを強制終了する。
▼タスク定義の設定
今回は使用するコンテナは1つのため、タスクに割り当てたメモリをソフト制限としてコンテナにも割り当てる。(Fagateなので設定しなくてもいい)
ポートマッピング
コンテナ側で開放するポートを設定する。
例えば、docker-composeやターミナル起動中のコンテナを確認したときに、port
に表示される右側のポート番号が入る。
docker-compose.yml
ports:
- "8000:80"
terminalの例
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc84c2ca4e97 test-app:latest "/docker/local/webse…" 3 weeks ago Up 12 days 9000/tcp, 0.0.0.0:8000->80/tcp test-app
タスク定義の設定
ヘルスチェック
サービスが問題なく運用しているかを確認するためのチェック項目。
確認として実行するコマンドを作成し登録しておく。最終的にコンテナが異常と判定してアラートを出すまでに実行するヘルスチェックの回数などを設定できる。
- interval(間隔): ヘルスチェックの実行間隔
- timeout: ヘルスチェックでfalseと判断するまでに待機する時間
- startPeriod(開始期間): 再試行でfalseと判断するまでに待機する猶予期間
- retries(再試行): コンテナ異常と判断するまでに実行するヘルスチェックの回数
▼タスク定義の設定
今回は設定しない。
環境設定
コンテナ起動時の環境を設定する。
・CPUユニット数
タスクに割り当てたCPU数の中から、割り当てたい量を指定する。(タスクCPU以下であること)
今回は、このコンテナのみのため、すべてのCPUである1024を割り当て。
・GPUユニット数
GPUを使用する場合に割り当てる。
Fargateの場合は割り当てられない。
・エントリポイント
コンテナに渡すエントリポイント。指定したshファイル(またはコマンド)を実行する。
Dockerfileかdocker-composeの中に定義してあれば不要。
・コマンド
コンテナに渡すコマンド。指定したコマンドを実行する。
Dockerfileかdocker-composeの中にCMDまたは、entrypointが定義してあれば不要。
・作業ディレクトリ
コンテナ起動したときの作業ディレクトリ。WORKDIR
ディレクティブと対応。
Dockerfileかdocker-composeに記述してあれば不要。
・Environment Files
環境変数を記述したファイルがS3にある場合は読み込むことができる。
ない場合は、次の環境変数で個別に設定していく。
環境変数
環境変数がある場合は、一つづつ記述していく。
コンテナタイムアウト
・タイムアウト開始
依存関係にあるコンテナが上手く立ち上がらない場合に適用される。
依存関係にあるコンテナが起動するまでの再試行を行う待機時間。
Fargateで値を設定しない場合は、デフォルトで3分が適用される。
・停止タイムアウト
コンテナが正常終了しなかった場合に強制終了するまでの待機時間。
Fargateで値を設定しない場合は、デフォルトで30秒が適用される。
ネットワーク設定
docker-composeはコンテナを起動した場合に、複数コンテナがある場合は自動でネットワークで繋ぐ。
このネットワークをfalseにしたり、依存関係の設定やDNSサーバーの設定ができる。
対応するディレクティブは、networks, links, dnsなど。
ストレージとログ
ここではサービス毎のボリュームの設定とログの設定ができる。
デフォルトではコンテナを停止するとデータは削除される。データを残したい場合はボリュームを設定する。
マウントポイントとボリュームソースの違い
マウントポイント
各コンテナに設定するボリューム。volume
ディレクティブに相当。
ホスト側と同期させたいディレクトリや、同期させたくないディレクトリを記述する。
ボリュームソース
他のサービスやコンテナのボリュームを使う場合に使用。volumes_from
ディレクティブに相当。
読み込み専用(ro)や書き込み(rw)を指定できる。
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
ログ設定
Cloud Watchにログを出力する場合に使用する。
リソースの制限
コンテナのデフォルトのulimitsを上書きする。ulimitsディレクティブに相当。
コンテナが使用できるオープンファイルの数を制限する。デフォルトのソフト制限は1024。ハード制限は4096(Fagateの場合)
使用できるタスク数をもっと増やしたい/減らしたい場合に設定する。
Dockerのラベル
dockerの--label
オプションに該当。
コンテナにキー/値のラベル(メタデータ)を設定する。
設定後のコンテナ設定後の例
ECRのイメージ、CPUユニット数、ソフト制限を設定したあとは次のようになる。
ボリュームの設定
サービス間で共有するボリュームがある場合はここで設定する。
docker-composeでサービス内ではなく、サービス外に定義したボリュームがここにあたる。
docker-composeの例
version: "3.7"
volumes:
app-volume:
app-db-volume:
app-node_modules2:
app-bundle2:
services:
db:
container_name: db
image: mdillon/postgis:10-alpine
ports:
- 5435:5432
volumes:
- app-db-volume:/data
タグの設定
タスクを管理しやすくするために、タグを設定することができる。
コンテナとは直接的に関係ないが、このタスク定義が何を指すのかを記述する。
タスク定義内の「Tags」タブから確認できる。
タスク定義の作成
最後に右下の「作成」ボタンを押せば、タスク定義が完了する。
タスク定義の修正
「新しいリビジョンの作成」をクリックすることで、既存のタスク定義を編集し、新たなタスクを作成することができる。
編集後はタスク新しいタスクが追加されていく。過去のタスク設定もログとして残っていく。
タスク定義のステータスは「Active」にしておくこと。後ほどクラスターを作成するときに、どのタスク定義を使うかを選択するが、その際Activeになっているタスクしか選択できない。
タスク定義は以上。
タスクの設定事例
参考リンク
▼AWS タスク定義
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definitions.html
▼AWS コンテナの設定パラメータ
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html