EC2 Container ServiceにDockerイメージを配備してApplication LoadBalancerで負荷分散させる

  • このエントリーをはてなブックマークに追加

概要

EC2 Container Serviceを使うと、複数台のEC2をクラスタリングしてDockerコンテナが稼働するリソースプールとすることができて、おそらくリソースの偏りを気にしたりとか、Dockerのホストマシン側のポートの空きなどを判断して、適切なリソースをもったEC2上にコンテナを配備してくれる、といったものだと思います。。
が、使ったことがなくしょうじき全然わかっていないので、とりあえず試してみます。

用語について整理

そもそも用語が理解整理できていないのでまとめます。

Container instance
(コンテナインスタンス)
コンテナを稼働させる基盤となるEC2インスタンス。ECRなどのコンテナレジストリからコンテナイメージを引っ張ってきてこの上で実行する。
Cluster
(クラスタ)
コンテナインスタンスをクラスタリングしたもの。
Task
(タスク)
コンテナインスタンス上で実行されているコンテナのこと(Container instanceはEC2を指し、コンテナはタスクと呼ぶ。みたいです。混乱します。"コンテナ" じゃだめだったのか。。)。
Task Definitionsタスクとして稼働させるDockerイメージ名や開放するポート番号、CPU、Memoryリソースをどのくらい使用するか、どのボリュームをどこにマウントするかなどの定義。1つかそれ以上のタスクを含む。JSONで記述する。
Scheduler
(スケジューラ)
同時に複数のタスクを動かす場合、クラスタ内でリソースの開いているコンテナインスタンスを選んで起動させる、などの制御をする。
ServiceTask Definitionを指定された数実行し、障害などでタスクが落ちた場合なども台数を維持したりするグループの単位。オートスケールやELBへの登録などもこの単位で管理される。
Container Agentクラスタで稼働するEC2それぞれで動いており、稼働中のタスクやリソースの利用状況、タスクが開始・停止したなどの情報をECSの基盤へ送信している。

まとめるとこんな感じ?

ECS用語整理

動かしてみる

なんとなくわかってきましたので、以下のようなながれで動かしてみたいと思います。

おおまかな手順のながれです。

  • Dockerレジストリの準備
    Task Definitionで指定するDockerイメージは、ECRのものを使用することとし、予めレポジトリを作成します
  • Dockerイメージの準備
    Dockerイメージは、nginxが入ったイメージとphp-fpmが入ったイメージを作成してlinkします。これらのイメージはECRに格納します
  • クラスタの作成
    コンテナインスタンスはap-northeast-1a、ap-northeast-1cに1台ずつ起動します
  • ターゲットグループ、Application Load Balancerの作成
    タスクを登録するターゲットグループを作成し、ALBへ登録します
  • Task Definitionsの作成
    ECRからnginx、php-fpmのイメージを取得して起動するTask Definitionsを作成します
  • Serviceの作成
    Task Definitionで定義した単位を10セット起動し、維持します
  • Application Load Balancerにアクセスして動作確認

作業内容

Dockerレジストリの準備

ECSのTask Definitionでは起動させるDockerイメージとして、Docker Hubのものと、プライベートリポジトリのものが使用できます。
今回はECRを利用します。

レジストリの作成と確認

nginx用のレポジトリと、php-fpm用のレポジトリの2つを作成します。今回はaws ciを使っています。

$ aws ecr create-repository --repository-name oreno/nginx --region ap-northeast-1
{
    "repository": {
        "registryId": "123456789012",
        "repositoryName": "oreno/nginx",
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/oreno/nginx",
        "repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx"
    }
}
$ aws ecr create-repository --repository-name oreno/php-fpm --region ap-northeast-1
{
    "repository": {
        "registryId": "123456789012",
        "repositoryName": "php-fpm/nginx",
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/oreno/php-fpm",
        "repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm"
    }
}

確認

$ aws ecr describe-repositories --region ap-northeast-1
{
    "repositories": [
        {
            "registryId": "123456789012",
            "repositoryName": "oreno/php-fpm",
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/oreno/php-fpm",
            "repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm"
        },
        {
            "repositoryName": "oreno/nginx",
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/oreno/nginx",
            "repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx"
        }
    ]
}

Dockerイメージの準備

nginxが入ったDockerイメージと、php-fpmのDockerイメージを作成していきます。

nginxが稼働するDockerイメージの作成

(EC2 Container Registryへ自作のDockerイメージをプッシュで作成したものをベースにしています)

Dockerfileは以下です。

  • Dockerfile
FROM amazonlinux

USER root
RUN set -x && \
    yum -y install nginx

RUN set -x && \
    echo "NETWORKING=yes" >/etc/sysconfig/network && \
    mkdir -p /var/www/html && \
    chown -R nginx.nginx /var/www/html

COPY templates/etc/nginx/nginx.conf /etc/nginx/nginx.conf

RUN ln -sf /dev/stdout /var/log/nginx/access.log \
	&& ln -sf /dev/stderr /var/log/nginx/error.log

EXPOSE 80

CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

COPYを使っているので、以下のファイルも置いておきます。

  • templates/etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;


    server {
      listen       80 default_server;
      listen       [::]:80 default_server;
      server_name  localhost;
      root         /var/www/html;

      location / {
          fastcgi_pass   php-fpm:9000;
          fastcgi_index  index.php;
          fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
          include        fastcgi_params;
      }
    }
}

fastcgi_passとして、php-fpmというホスト名を指定していますが、これはphp-fpmが稼働するコンテナの名前を「php-fpm」としてlinkするためです。

buildします。
イメージ名はECRに作成したレポジトリのrepositoryUriと合わせます。

$ docker build -t 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx:latest .
Sending build context to Docker daemon 6.144 kB
Step 1 : FROM amazonlinux
...
Successfully built 1234567890ab

buildが完了し、AmazonLinuxをベースとした、nginxが入ったコンテナイメージができました。
これをECRへpushします。

まず、aws cliを使用して、AmazonのDockerレジストリへアクセスできるパスワードを含んだdocker loginコマンド文字列を取得し、docker loginします。

$ aws ecr get-login --region ap-northeast-1
docker login -u AWS -p <passowrdpassword....> -e none https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com

$ docker login -u AWS -p <passowrdpassword....> -e none https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
...
Login Succeeded

pushします。

$ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx:latest
The push refers to a repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx]
...
latest: digest: sha256:ee32d51b02cd4f325f768abb0d027d8cbdd4e6060f8ad64df12a23d5333ac18b size: 6317

pushされたことを確認します。

$ aws ecr list-images --repository-name oreno/nginx
{
    "imageIds": [
        {
            "imageTag": "latest",
            "imageDigest": "sha256:ee32d51b02cd4f325f768abb0d027d8cbdd4e6060f8ad64df12a23d5333ac18b"
        }
    ]
}

php-fpmが稼働するDockerイメージの作成

Dockerfileは以下です。

  • Dockerfile
FROM amazonlinux

USER root
RUN set -x && \
    yum -y install php-fpm

RUN set -x && \
    echo "NETWORKING=yes" >/etc/sysconfig/network && \
    useradd php-fpm && \
    mkdir -p /var/www/html && \
    chown -R php-fpm.php-fpm /var/www/html && \
    echo '<?php echo gethostname(); ?>' > /var/www/html/index.php

COPY templates/etc/php-fpm.conf /etc/php-fpm.conf
COPY templates/etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf

RUN ln -sf /dev/stdout /var/log/php-fpm/access.log \
	&& ln -sf /dev/stderr /var/log/php-fpm/error.log

EXPOSE 9000

CMD ["/usr/sbin/php-fpm", "--nodaemonize"]

COPYを使っているので、以下のファイルも置いておきます。

  • templates/etc/php-fpm.conf
include=/etc/php-fpm.d/*.conf

[global]
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
  • templates/etc/php-fpm.d/www.conf
[www]
listen = 0.0.0.0:9000
;listen.allowed_clients = any
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
catch_workers_output = yes
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
access.log = /var/log/php-fpm/access.log

buildします。
イメージ名はECRに作成したレポジトリのrepositoryUriと合わせます。

$ docker build -t 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm:latest .
Sending build context to Docker daemon 6.144 kB
Step 1 : FROM amazonlinux
...
Successfully built 1234567890ab

buildが完了し、AmazonLinuxをベースとした、php-fpmが入ったコンテナイメージができました。 これをECRへpushします。

まず、aws cliを使用して、AmazonのDockerレジストリへアクセスできるパスワードを含んだdocker loginコマンド文字列を取得し、docker loginします。

$ aws ecr get-login --region ap-northeast-1
docker login -u AWS -p <passowrdpassword....> -e none https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com

$ docker login -u AWS -p <passowrdpassword....> -e none https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
...
Login Succeeded

pushします。

$ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm:latest
The push refers to a repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm]
...
latest: digest: sha256:ee32d51b02cd4f325f768abb0d027d8cbdd4e6060f8ad64df12a23d5333ac18b size: 6317

pushされたことを確認します。

$ aws ecr list-images --repository-name oreno/php-fpm
{
    "imageIds": [
        {
            "imageTag": "latest",
            "imageDigest": "sha256:ee32d51b02cd4f325f768abb0d027d8cbdd4e6060f8ad64df12a23d5333ac18b"
        }
    ]
}

クラスタの作成

マネジメントコンソールからECSを選択します。

クラスターを選択し、画面右から「クラスターの作成」をクリックします。 クラスターの作成

※次画面から急に英語になっちゃいます。。

作成するクラスタの設定を入力します。 Create Cluster

ネットワーク周りの設定を入力します。
nginxを動かしますのでとりあえず80番を開けるのかなーと思って開けましたが、実際には80で着信するのはALBなので、ここでは特に指定はいらないはずです。
なのですが、このマネジメントコンソールのウィザードだとここを空欄にすることができないみたいなので、何かしら入れないと駄目です。でたらめで何か入れましょう。
Networking

IAMロールは、デフォルトでecsInstanceRoleというものが指定されていました。自動で適切なものを作ってくれるみたいです。
このまま「作成」をクリックします。 また日本語に。。 コンテナインスタンス IAM ロール

前画面で指定したリソースが作成されます。
裏でCloudFormationが動いているみたいです。 Launch status

CloudFormationの画面を見ると、たしかにstackが追加されていました。 CloudFormation

しばらくすると作成が完了し、クラスターが表示されます。 Cluster作成完了

ターゲットグループ、Application Load Balancerの作成

ターゲットグループの作成

$ aws elbv2 create-target-group \
 --name alb-target-group-ecs-sample  \
 --protocol HTTP \
 --vpc-id vpc-1q2w3e4r \
 --port 80 \
 --health-check-protocol HTTP \
 --health-check-port traffic-port \
 --health-check-path '/' \
 --health-check-interval-seconds 30 \
 --health-check-timeout-seconds 5 \
 --healthy-threshold-count 5 \
 --unhealthy-threshold-count 2 \
 --matcher HttpCode=200

{
    "TargetGroups": [
        {
            "HealthCheckPath": "/",
            "HealthCheckIntervalSeconds": 30,
            "VpcId": "vpc-1q2w3e4r",
            "Protocol": "HTTP",
            "HealthCheckTimeoutSeconds": 5,
            "HealthCheckProtocol": "HTTP",
            "UnhealthyThresholdCount": 2,
            "HealthyThresholdCount": 5,
            "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/alb-target-group-ecs-sample/9988uu99ii66yyff44",
            "Matcher": {
                "HttpCode": "200"
            },
            "HealthCheckPort": "traffic-port",
            "Port": 80,
            "TargetGroupName": "alb-target-group-ecs-sample"
        }
    ]
}

’–heathcheck-port’では、通常はEC2がリッスンするポート(Webサーバなら80)を指定しますが、ECSの場合、Serviceがタスクに対し動的にポートを割り当てるため、指定ができません。
その場合、’traffic-port’を指定します(ただ、ここは指定しなくてもデフォルトで’traffic-port’になります)。

続いて、ALB用のSecurity Groupを作成します。

$ aws ec2 create-security-group --group-name alb-ecs-sample-sg --description "Security group for alb" --vpc-id vpc-1q2w3e4r

{
    "GroupId": "sg-5t6y7u8i"
}

作成したALB用のSecurity Groupのポート80を全開放します

$ aws ec2 authorize-security-group-ingress --group-id sg-5t6y7u8i --protocol tcp --port 80 --cidr 0.0.0.0/0 

$ aws ec2 describe-security-groups --group-ids sg-5t6y7u8i | jq ".SecurityGroups[].IpPermissions"
[
  {
    "PrefixListIds": [],
    "FromPort": 80,
    "IpRanges": [
      {
        "CidrIp": "0.0.0.0/0"
      }
    ],
    "ToPort": 80,
    "IpProtocol": "tcp",
    "UserIdGroupPairs": []
  }
]

ECSクラスタ上のコンテナインスタンスは、タスクに動的にポートを割り当ててlistenします。
この範囲は、(Amazon EC2 Container Service TaskDefinition ContainerDefinitions PortMappingsにあるように、49153〜65535です。
ということなので、ALBからコンテナインスタンスへの49153〜65535番ポートへの通信を許可すればいいのかな、と思いきや、それだとなぜかヘルスチェックが通りません!

一旦、ALBからコンテナインスタンスへの通信は全許可しました。本当はどうすれば。。
これはよくわからなかったので、今後の課題にします。

$ aws ec2 authorize-security-group-ingress --group-id sg-9o8i7u6y --protocol tcp --port 49153-65535 --source-group sg-5t6y7u8i

$ Administrator$ aws ec2 describe-security-groups --group-ids sg-9o8i7u6y | jq ".SecurityGroups[].IpPermissions"
[
  {
    "PrefixListIds": [],
    "FromPort": 49153,
    "IpRanges": [],
    "ToPort": 65535,
    "IpProtocol": "tcp",
    "UserIdGroupPairs": [
      {
        "UserId": "123456789012",
        "GroupId": "sg-5t6y7u8i"
      }
    ]
  }
]

ALBを作成します。

$ aws elbv2 create-load-balancer --name alb-ecs-sample --subnets subnet-z9a8q716 subnet-1m2j3u4y --security-groups sg-5t6y7u8i
{
    "LoadBalancers": [
        {
            "VpcId": "vpc-1q2w3e4r",
            "LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/alb-ecs-sample/1q2w3e4r5t6y7u8i",
            "State": {
                "Code": "provisioning"
            },
            "DNSName": "alb-ecs-sample-1470162055.ap-northeast-1.elb.amazonaws.com",
            "SecurityGroups": [
                "sg-5t6y7u8i"
            ],
            "LoadBalancerName": "alb-ecs-sample",
            "CreatedTime": "2016-12-04T15:47:13.510Z",
            "Scheme": "internet-facing",
            "Type": "application",
            "CanonicalHostedZoneId": "Z14GRHDCWA56QT",
            "AvailabilityZones": [
                {
                    "SubnetId": "subnet-z9a8q716",
                    "ZoneName": "ap-northeast-1a"
                },
                {
                    "SubnetId": "subnet-1m2j3u4y",
                    "ZoneName": "ap-northeast-1c"
                }
            ]
        }
    ]
}

少し待つと

$ aws elbv2 describe-load-balancers --names alb-ecs-sample | jq ".LoadBalancers[].State"

{
  "Code": "provisioning"
}

から、

$ aws elbv2 describe-load-balancers --names alb-ecs-sample | jq ".LoadBalancers[].State"
{
  "Code": "active"
}

になり、ALBが作成完了します。

続いて、先ほど作成したターゲットグループをALBにリスナーとして紐付けます。

$ aws elbv2 create-listener \
 --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/alb-ecs-sample/1q2w3e4r5t6y7u8i \
 --protocol HTTP \
 --port 80 \
 --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/alb-target-group-ecs-sample/9988uu99ii66yyff44
{
    "Listeners": [
        {
            "Protocol": "HTTP",
            "DefaultActions": [
                {
                    "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/alb-target-group-ecs-sample/9988uu99ii66yyff44",
                    "Type": "forward"
                }
            ],
            "LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/alb-ecs-sample/1q2w3e4r5t6y7u8i",
            "Port": 80,
            "ListenerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener/app/alb-ecs-sample/1q2w3e4r5t6y7u8i/c95cc78cb047c6a0"
        }
    ]
}

Task Definitionsの作成

Task Definitionsをaws cliで作成する場合は、項目が多いので、jsonを作成してそれを読み込ませています。

jsonの雛形を生成します。

aws ecs register-task-definition --generate-cli-skeleton > task-definitions.json

生成したtask-definitions.jsonを編集します。

{
    "family": "task-definitions-nginx-php-fpm",
    "containerDefinitions": [
        {
            "name": "nginx",
            "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx",
            "cpu": 1024,
            "memory": 64,
            "links": [
                "php-fpm"
            ],
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 0,
                    "protocol": "tcp"
                }
            ]
        },
        {
            "name": "php-fpm",
            "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm",
            "cpu": 1024,
            "memory": 64
        }
    ]
}

Task definitionを作成します。

{
    "taskDefinition": {
        "status": "ACTIVE",
        "family": "task-definitions-nginx-php-fpm",
        "requiresAttributes": [
            {
                "name": "com.amazonaws.ecs.capability.ecr-auth"
            }
        ],
        "volumes": [],
        "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/task-definitions-nginx-php-fpm:1",
        "containerDefinitions": [
            {
                "environment": [],
                "name": "nginx",
                "links": [
                    "php-fpm"
                ],
                "mountPoints": [],
                "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx",
                "essential": true,
                "portMappings": [
                    {
                        "protocol": "tcp",
                        "containerPort": 80,
                        "hostPort": 0
                    }
                ],
                "memory": 64,
                "cpu": 1024,
                "volumesFrom": []
            },
            {
                "environment": [],
                "name": "php-fpm",
                "mountPoints": [],
                "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm",
                "cpu": 1024,
                "portMappings": [],
                "memory": 64,
                "essential": true,
                "volumesFrom": []
            }
        ],
        "revision": 1
    }
}

Serviceの作成

Serviceを作成するにはクラスターのARNが必要ですのでaws cliで取得しておきます。

$ aws ecs describe-clusters --cluster ecs-cluster-sample | jq ".clusters[].clusterArn"
"arn:aws:ecs:ap-northeast-1:123456789012:cluster/ecs-cluster-sample"

Serviceを作成します。

$ aws ecs create-service \
 --cluster arn:aws:ecs:ap-northeast-1:123456789012:cluster/ecs-cluster-sample \
 --service-name ecs-service-sample \
 --task-definition task-definitions-nginx-php-fpm:1 \
 --load-balancers targetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/alb-target-group-ecs-sample/9988uu99ii66yyff44,containerName=nginx,containerPort=80 \
 --desired-count 10 \
 --role ecsServiceRole 
{
    "service": {
        "status": "ACTIVE",
        "taskDefinition": "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/task-definitions-nginx-php-fpm:3",
        "pendingCount": 0,
        "loadBalancers": [
            {
                "containerName": "nginx",
                "targetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/alb-target-group-ecs-sample/9988uu99ii66yyff44",
                "containerPort": 80
            }
        ],
        "roleArn": "arn:aws:iam::123456789012:role/ecsServiceRole",
        "createdAt": 1480869441.932,
        "desiredCount": 10,
        "serviceName": "ecs-service-sample",
        "clusterArn": "arn:aws:ecs:ap-northeast-1:123456789012:cluster/ecs-cluster-sample",
        "serviceArn": "arn:aws:ecs:ap-northeast-1:123456789012:service/ecs-service-sample",
        "deploymentConfiguration": {
            "maximumPercent": 200,
            "minimumHealthyPercent": 100
        },
        "deployments": [
            {
                "status": "PRIMARY",
                "pendingCount": 0,
                "createdAt": 1480869441.932,
                "desiredCount": 10,
                "taskDefinition": "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/task-definitions-nginx-php-fpm:3",
                "updatedAt": 1480869441.932,
                "id": "ecs-svc/9223370555985333864",
                "runningCount": 0
            },
            {
                "status": "ACTIVE",
                "pendingCount": 0,
                "createdAt": 1480868913.607,
                "desiredCount": 0,
                "taskDefinition": "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/task-definitions-nginx-php-fpm:2",
                "updatedAt": 1480869340.633,
                "id": "ecs-svc/9223370555985862188",
                "runningCount": 0
            }
        ],
        "events": [],
        "runningCount": 0
    }
}

Application Load Balancerにアクセスして動作確認

ブラウザでALBのFQDNへアクセスしてみます。 ALBへのアクセス確認

リロードすると

ALBへのアクセス確認

という感じで、ホスト名が変わっていくのがわかります。

まとめ

ひととおりECSでWebをホストするところまでの動きが確認できました。

しかしまだサーバが障害などで停止した場合や、Task definitionsが更新された場合どのように新しいTaskが起動して新旧入れ替わりが起きるのか、AutoScalingはどういう動きになるのかなど、まだまだわからことがたくさんあるので、引き続き調べていきます。