![見出し画像](https://assets.st-note.com/production/uploads/images/41760317/rectangle_large_type_2_0897e15db5fda139a7e7d45df3e5731e.jpeg?width=1200)
ECS&ECR 第三回(動作確認まで)
前回の記事でネットワーク周りの設定を行っていきました
本記事ではECSでコンテナを起動し、動作確認するまでの手順を書いていこうと思います
準備
手順の確認を行っていきます
VPCの作成
↓
サブネットの作成
↓
インターネットゲートウェイの作成
↓
ルートテーブルの作成
↓
ECSクラスタの作成
↓
ECSタスク定義の作成
↓
コンテナ起動で動作確認
このルートテーブルの作成までは終わっているので
今回扱う内容はECSクラスタ作成、ECSタスク定義作成、動作確認となります
早速やっていきたいと思います
【手順5】ECSクラスタの作成
ECSクラスタはコンテナインスタンスの集合体です
どんなタイプで起動するか(EC2やFargateなど)を設定して作成していきます
マネジメントコンソールからECSを検索し、下記画面へ移動してください
ダッシュボードからクラスターを選択し、早速クラスターを作成していきます
「クラスターの作成」をクリックし、作成画面へ移動します
クラスターテンプレートの選択を行います
今回はFargateを選択することにします
クラスター名を「ecs-demo-cluster」、にし、名前タグをつけて作成します
正常に作成できたようです
クラスタ作成の手順はここまでとなります
【手順6】ECSタスク定義の作成
おそらく一番の山場
タスクとはコンテナの実行単位のことです
タスクはタスク定義をもとに開始されますがこの手順で作成するのはその定義の部分です
まずはECSのタスク定義画面より「新しいタスク定義の作成」をクリックします
起動タイプはFargateとし、「次のステップ」をクリックします
まずタスク定義名をつけていきます
今回は「ecs-demo-task-definition」としておきます
タスクロールを設定してきます
タスクロールはコンテナインスタンスがアクセスできるAWSリソースへの権限のことです
今回はロールを作成していないので「なし」しか選択できませんが、S3へのリードオンリー権限を付与したいなどの場合は予めIAMコンソールからECSコンテナインスタンスIAMロールを作成します
次に何かしらの操作を行うものではありませんがタスク実行ロールを見ていきます
ecsTaskExecutionRoleがデフォルトで設定されていると思います
これはECSがECRからイメージをプルしたりコンテナログをCloudwatchに出力するために必要な権限となっています
中身は以下のJSONです
タスクロール(コンテナインスタンスのロール)とタスク実行ロール(ECSのロール)の違うものなので注意が必要かもしれません
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
次にタスクメモリやCPUサイズを設定していきます
タスクメモリは最小の0.5GB、
タスクCPUも最小の0.25CPUでOKです
次にコンテナの追加をしていきます
ここでコンテナ名やイメージを設定していきます
イメージに関しては今回はECRにプッシュしたイメージを利用するため、ECRの下記画面からURIの赤枠部分をコピーペーストします
なお、dockerhubのイメージを利用することも可能なのでそれで十分な場合はそちらも利用できます
コンテナ名とイメージを入力します
次にメモリ制限とポートマッピングを設定していきます
メモリは最小値の128MiBで今回は十分です
ポートマッピングについては80を設定します
以下からは今回は設定しませんが、どのような項目であるか簡単に説明していきます
ヘルスチェック
ヘルスチェックの設定を行うことができます
例えばcurlコマンドの実行間隔、タイムアウト(失敗と判定されるまでの時間)、開始期間、再試行(異常と判定されるまでの回数)を設定できます
環境
コンテナ用に予約する環境を設定します
CPUユニット数、GPU、基本(ここにチェックが入っている場合はコンテナが何らかの原因で停止するとタスク内の他のコンテナが停止し、入っていない場合は停止しません)の設定ができます
他にもDockerfileでいうところのENTRYPOINT、CMD、WORKDIR、ENVを設定できる項目もあります
コンテナタイムアウト
コンテナごとの開始と終了の依存関係を定義することができますが、タイムアウト開始(依存関係解決の再試行を諦めるまでの時間)と停止タイムアウト(コンテナが正常終了しなかった場合の強制終了されるまでの待機時間)を設定できます
ネットワーク設定
コンテナのネットワーク設定ができます
リンクはDockerで非推奨となっているので使用には注意が必要です
あとはホスト名(コンテナのホスト名)、DNSサーバー、検索ドメイン、追加ホスト(コンテナ上の/etc/hostsに追加するホスト名とIPアドレスのマッピング)を設定できます
ストレージとログ
マウントポイントはEFSなどをマウントできるようになる設定項目です
ボリュームソースについては、ソースコンテナのマウントしているボリュームをまるっとマウントできるような設定項目となっています
ログ設定についてですが、awslogsを選択しておけばclowdwatchにログが図れることになります
リソースの制限
Linuxであるようなulimitをコンテナに設定できます
DOCKERラベル
コンテナに追加するラベルのkey/value値です
設定を色々見ていきましたが、最後に「追加」ボタンをクリックします
設定した内容を見てタスクメモリが割り当てられ、コンテナが追加されました
このタスク定義によって起動されるタスクには一つのコンテナが立ち上がるイメージです
ネームタグを「ecs-demo-task-definition」とし、「追加」をクリックします
タスク定義の作成に成功しました
タスク定義はJSON形式となっており、JSONタブから確認することができます
【手順7】コンテナ起動し動作確認
クラスタの作成とタスク定義の作成まで終了したので実際に起動して動作確認を行っていきたいと思います
まずはクラスター画面から作成したクラスターをクリックします
下記画面へ遷移するのでサービスタブから「作成」をクリックします
サービスはクラスターとタスク定義を紐付けたもののことです
サービス作成画面へ遷移します
今回はfargateを使用するのでまずはFARGATEを選択します
次にタスク定義、そのリビジョン(一つのリビジョンしかないのでそれがlatestでそれ以外は選択できません)、クラスター、サービス名(今回は「ecs-demo-service」とします)を設定します
次にタスクの数を設定していきます
タスクはコンテナの起動単位ですのでこの数分のコンテナインスタンスが立ち上がることになります
ネームタグを「ecs-demo-service」とし、「次のステップ」をクリックします
次はネットワークの設定です
VPC、サブネット、パブリックIPの割当を設定します
(パブリックIPの割当は当たり前ですがENABLEのままにしておきます)
クラスターVPCには前回作成したVPCを設定します
サブネットも前回作成したパブリックサブネットを設定します
次にセキュリティグループの設定をしていきます
デフォルトで「ecs-de-1041」と入っていますがこれを変更してみましょう
「編集」をクリックします
下記のような画面が出てくるのでセキュリティグループ名を「ecs-demo-sg」に変更します
ちなみにインバウンドルールについてですがインターネットからアクセスするため、下記のような任意のIPアドレスからインバウンド(中へ入る)HTTPアクセスを許可する設定となっています
「保存」をクリックします
ロードバランサは今回使用しないためなしとします
「次のステップ」をクリックします
Auto Scalingもしないためそのまま「次のステップ」をクリックします
最後に今まで設定した内容を確認し、OKであれば「サービスの作成」をクリックします
成功しました
「サービスの表示」をクリックし、作成されたサービスを確認します
タスクタブから今回起動されたタスクを選択します
詳細画面でパブリックIPが見られるのでそれをブラウザに入力してアクセスしてみます
ローカルで確認したとき同様、Hello Worldができました!
最後に
ECSやってみた記事は以上となります
タスク定義がとにかく難しいですし、今回飛ばしたようなオートスケールなども重要になってくるはずですので
時間があればそちらにフォーカスした記事も作ってみたいと思います