ECS (Elastic Container Service) を理解する
EC2 ( Elastic Compute Cloud ) とは?
EC2 インスタンスをクラスターとして作成できるサービス。
EC2 は Elastic Compute Cloud の略。コンテナではない。
E の後に C が 2 つだから EC2 。
https://it.impress.co.jp/articles/-/12382
Elastic とは、伸縮可能と言う意味。アクセス増えたら増強してくれることだと解釈する。
EC2 は
Springboot などで作った API サーバーをクラウド上で稼働させて、インターネットからアクセスできるようにするものだと解釈している。
EC2 インスタンスとは、EC2 で作成するサーバーの名称。
(Elastic Container Service) とは?
https://business.ntt-east.co.jp/content/cloudsolution/column-try-37.html
Docker を使ってサーバーをコンテナで立ち上げ
コンテナをクラスタとして同じものを同時に立ち上げて管理できるらしい。
なぜ ECS を使うのか?
クラスタとしてたくさん同じインスタンスを立ててサービスを提供することで、一つインスタンスが落ちても他のインスタンスに繋がるので、サービスが安定して提供できると考えている。
https://business.ntt-east.co.jp/content/cloudsolution/column-25.html
NTT の記事を見ると、ECS を使えば k8s を使わずに GUI でクラスタ管理ができるように見えた。
EC2 でサービスを作ると、k8s を使って複数コンテナのスケーリングを自分で管理しないといけないと解釈した
ECS を動かすための他のサービスを確認。
前回の記事で作った VPC シリーズが必要。
単体では動かないようだ。
https://youtu.be/2_FxLp9xgmo?t=533
クラインさんを参考にすると
ECR と並列で
VPC, サブネット、Internet Gateway,
これらを立てて、サブネットの中に ECR を放り込む必要があるようだ。
実際に ECS のクラスタを作る
Amazon ECS のクラスターのページに移動する
クラスターを作成のボタンを押し
ネットワークのみ(VPCとサブネットがついてない)を選択して
クラスターを作成する
自動的に Fargate と言うサービスが使われる
https://business.ntt-east.co.jp/content/cloudsolution/column-171.html
Fargate を使うことで、Amazon Web Service のインスタンスや、Amazon Web Service のインスタンスをまとめたクラスターを管理しなくて良くなるらしい。
名前を決めて作成
小文字始まりのタグも必要。
これで hello-cluster が作成された
ロールのページで ECS 用のロールを作成する。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-tasks-pull-images-ecr-repository/
動画にはなかったので公式サイトを参考にする
IAM ロールとは?
IAM ロールとは、 ECS を別のサービスである Fargate で動かすために必要な概念らしい。
Jenkins でいうエージェントのようなものだと想像した。
ロールの作成を開始
IAM の Roles のページにアクセスして
Create Role をクリック
エンティティタイプとユースケースの設定
Trusted Entity Type に AWS Service
Use case に
Elastic Container Service Task
これを選択
Elastic Container Service
ではない。似ているが。
これによって、ECS タスクが他の AWS サービスから使用できる権限を付与できるようだ。
Elastic Container Service では、ECS の作成と管理(無効化などと想像)のみしかできない。こちらでは ECS を呼べないと解釈した。
なので、間違えずに ECS Task を選択した。
permission に ECS の実行権限を追加
次に 許可の境界のセットで、
「許可の境界をロールの許可の最大化のために使う」
と言うラジオボタンをクリックする。
これは「検索して許可のプリセットを探す」と言う意味だと解釈した。
検索すると、たくさん許可のプリセットリストが出てくる。
公式記事に従って、ECS で検索してカスタム許可をつける
次に、記事の通りに ロール名に ecsTaskExecutionRole と
ECS タスク実行用と明記する。
ロールの作成を終了
ようやく作成が終了した。
これで ECS のタスク を動かすためのロール、ecsTaskExecutionRole が完成した。
タスクを作成する
why
Fargate で Docker イメージを動かすには、タスクいうものクラスターの中に 作成して、ECR をロール付きでセットする必要があるらしい。
クラスターのページで Run New Task を押しても作成できない。
できそうに見えるができなかった。
タスク定義のページで新規タスクを作成
タスク定義のページでのみ新規タスクは作成できる。
作成を押す。
FARGATE を選ぶ。
タスク定義の基本設定をする
- タスク名に hello-task
- タスクロールに先ほど作った ecsTaskExecutionRole
- ネットワークモードは aws vpc で固定値
- OS は Linux
これで基本定義を作れた。
タスク実行 IAM ロールと タスクサイズを設定
- タスク実行ロールは、デフォルトで ecsTaskExecutionRole
- タスクメモリと CPU は最初の 0.5, 0.25 を選択
コンテナ定義に ECR からコンテナイメージを追加する
名前は hello-nginx
ECR のコンテナイメージと同一にした。
イメージは、ECR のページで事前に作った hello-nginx のリンクを貼る。
YourDomain.dkr.ecr.ap-northeast-1.amazonaws.com/hello-nginx
URL はこの形になる。
メモリのリミットはデフォルトの 128 MiB
ポートは 80
これで追加する。
タスク定義の作成を完了
これで ECS クラスタで使うためのタスクが作成できた。
ECS にタスク定義を設定
ECS クラスタのページで Run New Task をクリック
- ローンチタイプに Fargate
- OS に Linux
- タスク定義に先程作った hello-task
- VPC に 最初に作った hello-vpc
- サブネットに 最初に作った hello-subnet
この設定で Run Task する。
するとタスクがクラスタにセットされて RUN しているのがわかる。
サービスの作成
サービスとは
https://youtu.be/2_FxLp9xgmo?t=2907
クラインさんの動画によると、サービスとはクラスタとタスクを結びつけるものらしい。
サービスの作成を開始
クラスターのページの hello-cluster の
サービスタブから Create を押す。
タスク定義やクラスタをセットして、サービス名とサービス数を入力
- ローンチタイプに FARGATE
- OS に Linux
- タスク定義に hello-task
- Cluster に hello-cluster
これらを選び
- サービス名に hello-service
- サービス数に 1 (クラスタの安定性は試せなくなるが、今回は構築手順の学習なので問題ないと解釈)
これらを入力して次に行く。
VPC とサブネットをセット
https://youtu.be/2_FxLp9xgmo?t=3032
hello-vpc と hello-subnet をセットする。
この時、サブネットはインターネットゲートウェイに繋がっている必要がある。
繋がっていないサブネットでは、ECR から Docker イメージを pull するときにエラーになってしまうからだ。
セキュリティグループを編集
デフォルトだとサービス名の一部とランダムな数字4桁で作成されている。
これを編集する。
開いてみると
- 新しいセキュリティグループをこのサービス用に以下の設定で作成する
- 名前は hello-5081(ランダム)
- 詳細説明は作成日時
- インバウンドファイアウォールのルール(制限)は、どこからでも 80 ポートから繋がる
になっている。
インバウンドファイアウォールとは?
https://techtarget.itmedia.co.jp/tt/news/1709/29/news10.html
IT Media のこの記事によると、
インバウンドファイアウォールとは、インターネットからアクセスするときに、許可されてない IP からの接続などをブロックするもののようだ。
対義語として、社内 LAN から守るアウトバウンドがあるようだ。
名前を hello-security-group に
説明を Accessible from anywhere by port 80 に
( 日本語だと作成時にエラーになる )
して、セキュリティグループを作成した。
残りのロードバランサーなどはデフォルトで大丈夫なので、次のステップに行く。
自動スケーリングは無しにする。落ちて損失が大きいサービスではないので。
サービスの作成を完了
レビュー画面で一覧で確認して、サービスを作成完了する。
するとローンチされて、
- セキュリティグループ
- インバウンドファイアウォールの設定
- サービス本体
これらが作成できたとわかる。
設定に不備があった場合は該当の箇所がエラーになる。
そして、クラスタのページのタスクのタブで、
今作成した hello-service がつながっているのをみることができる。
インターネットからアクセスする
タスク詳細に、ネットワーク情報がある。
Public IP でインターネットからアクセスできる。
これでインターネットから、ECS で動かしている nginx コンテナにアクセスすることができた。
Top comments (0)