🚀

AWS入門 - ECS・Fargate 使ってみる

2021/11/03に公開

AWSを使う必要が出てきたので、色々と試してみる。
ここでは、ECS・Fargate を試す。

Amazon Elastic Container Service

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html

ECSとはコンテナクラスターを管理してくれるやつ。
KubernetesのAWS版にあたる。

ECSクラスター

ECSを使う際のサービス単位。
クラスターの中にコンテナを立ち上げていく。

AWS Fargate

ECS自体はコンテナクラスターを管理するための、コンテナ管理サービスである。
なので、ECSをどこで動かすかは選択できる。

ECSを動かす環境として、EC2とFargateを選択することができる。
EC2を選択した場合は各インスタンスのOSアップデートなど、EC2自体の運用が必要となる。
一方で、Fargateを選択した場合は、そういった面倒くさい部分が抽象化され、運用に関する手間が削減できる。
もちろん、抽象化されている分、カスタマイズ性は下がるので、クラスター実行環境に手を入れたい場合はEC2を選択する必要がある。

タスク

ECSにおけるタスクとは、起動するコンテナの情報を定義したもの。
1つのタスクに対し、複数のコンテナを記述できる。

e.g.

{
    "family": "webserver",
    "containerDefinitions": [
        {
            "name": "web",
            "image": "nginx",
            "memory": "100",
            "cpu": "99"
        },
    ],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "networkMode": "awsvpc",
    "memory": "512",
    "cpu": "256",
}

タスク定義自体は独立してECS上に登録されるため、
1つのタスク定義を元に、複数のECSクラスター上にデプロイすることも出来る。

VPCはタスクをECSクラスター上にデプロイする時点で決められる。
ALBを紐付けるかどうかも、この時点で決められる。

つまり、
タスク定義で、コンテナ(アプリケーション)に関する情報を定め、
デプロイで、対象タスク・ネットワークに関する情報を定め、
それらを元に、ECSクラスター上にリソースを配置する。

ECS・Fargateを使ってアプリを立ち上げてみる

ECRと連携したり、CI/CD設定したり、ログ整えたりと、色々と出来ることは沢山ありそう.
しかし、ここまでの知識で最低限はOKそうなので、アプリを立ち上げてみる。

ECSクラスターを作成する

ECSクラスターを作成する。
クラスター用のVPCも同時に作成しておく。
とりあえずアプリを1つ立ち上げるだけなので、サブネットは1つだけ作っておく。

ECSクラスターと同時にCloudformationも作られている。

作成されたVPCはIGWがアタッチされ、
サブネットにもIGWへのルートが設定されている。
つまり、パブリックサブネットとして作成されている。

タスク定義を作成する

実行環境はFargateを選択する。

OS・CPU・メモリあたりは、適当に設定する。

コンテナイメージはnginxのやつを指定しておく。
そのまま起動しても使えるので動作確認にちょうどよい。

https://hub.docker.com/_/nginx

タスクをデプロイする

ECSクラスターとタスク定義が準備できたので、最後にデプロイしてみる。
アプリ(Webサーバー)なので、サービスとしてデプロイする。
まだ、理解しきれていないが、タスクの方は単発で実行するやつだと思う。

まず、先程作成したタスク定義を選択する。

ALBは今回は設定しないので、スキップ。
VPC・サブネットは先程作成したものを選択。
また、80番ポートでnginxが起動するので、セキュリティグループを新規作成し80番ポートからのアクセスを許可しておく。
インターネットからアクセス出来るよう、パブリックIPも有効にする。(今回はALBを作っていないので)

何故かここでSGを新規作成しようとすると、エラーになるので事前にSGを作っておいた。

デプロイが完了したら、タスク詳細のネットワーク情報からパブリックIPが確認できる。

このIPをWebブラウザで開くと、Nginxが立ち上がってることがわかる。

まとめ

コンテナを指定するだけでアプリを立ち上げられるのは良い。

ただし、EC2と同じくVPCが必要になるので、ネットワーク周りを気にする必要があるのは若干面倒くさい。
たぶん、そこらへんを簡単にしたのが AppRunner なんだろうか。

この他にも、ALBを設定したり、CI/CD設定してみたり、ログ転送してみたりと、色々と使ってみようと思う。

Discussion