0
0

「AWS Hands-on for Beginners Amazon Elastic Container Service 入門 コンテナイメージを作って動かしてみよう」をAWS CLIでやってみる

Posted at

上記、「AWS Hands-on for Beginners Amazon Elastic Container Service 入門 コンテナイメージを作って動かしてみよう」 をAWS CLIでやってみる

image.png

ハンズオンから引用

以降、CloudShellで実施

02 コンテナイメージを作成するための、Cloud9 環境を構築する

変数

コマンド
# Cloud9環境名
CLOUD9_ENVIRONMENT_NAME="h4b-ecs" \
&& echo ${CLOUD9_ENVIRONMENT_NAME}

# インスタンスタイプ
INSTANCE_TYPE="t3.small" \
&& echo ${INSTANCE_TYPE}

# プラットフォーム
CLOUD9_IMAGE_ID="resolve:ssm:/aws/service/cloud9/amis/amazonlinux-2-x86_64" \
&& echo ${CLOUD9_IMAGE_ID}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # Cloud9環境名
[cloudshell-user@ip-10-132-94-73 ~]$ CLOUD9_ENVIRONMENT_NAME="h4b-ecs" \
> && echo ${CLOUD9_ENVIRONMENT_NAME}
h4b-ecs
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # インスタンスタイプ
[cloudshell-user@ip-10-132-94-73 ~]$ INSTANCE_TYPE="t3.small" \
> && echo ${INSTANCE_TYPE}
t3.small
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # プラットフォーム
[cloudshell-user@ip-10-132-94-73 ~]$ CLOUD9_IMAGE_ID="resolve:ssm:/aws/service/cloud9/amis/amazonlinux-2-x86_64" \
> && echo ${CLOUD9_IMAGE_ID}
resolve:ssm:/aws/service/cloud9/amis/amazonlinux-2-x86_64

作成

コマンド
# Cloud9環境作成
CLOUD9_ENVIRONMENT_ID=$(
    aws cloud9 create-environment-ec2 \
        --name ${CLOUD9_ENVIRONMENT_NAME} \
        --instance-type ${INSTANCE_TYPE} \
        --image-id ${CLOUD9_IMAGE_ID} \
        --connection-type CONNECT_SSM \
        --automatic-stop-time-minutes 30 \
        --query environmentId \
        --output text
) \
&& echo ${CLOUD9_ENVIRONMENT_ID}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # Cloud9環境作成
[cloudshell-user@ip-10-132-94-73 ~]$ CLOUD9_ENVIRONMENT_ID=$(
>     aws cloud9 create-environment-ec2 \
>         --name ${CLOUD9_ENVIRONMENT_NAME} \
>         --instance-type ${INSTANCE_TYPE} \
>         --image-id ${CLOUD9_IMAGE_ID} \
>         --connection-type CONNECT_SSM \
>         --automatic-stop-time-minutes 30 \
>         --query environmentId \
>         --output text
> ) \
> && echo ${CLOUD9_ENVIRONMENT_ID}
e2fc48dcc1ac453fbeaea7f97c179d65

以降、Cloud9で実施

docker コマンドの確認

コマンド
docker version

出力
admin:~/environment $ docker version
Client:
 Version:           25.0.5
 API version:       1.44
 Go version:        go1.22.5
 Git commit:        5dc9bcc
 Built:             Mon Jul 29 17:21:34 2024
 OS/Arch:           linux/amd64
 Context:           default

Server:
 Engine:
  Version:          25.0.6
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.22.5
  Git commit:       b08a51f
  Built:            Mon Jul 29 17:22:09 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.20
  GitCommit:        8fc6bcff51318944179630522a095cc9dbf9f353
 runc:
  Version:          1.1.13
  GitCommit:        58aa9203c123022138b22cf96540c284876a7910
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

03 コンテナイメージを作成して動かす その1

Dockerfile作成

コマンド
cat << EOF > Dockerfile
FROM ubuntu:18.04

# Install dependencies
RUN apt-get update && \
 apt-get -y install apache2

# Install apache and write hello world message
RUN echo 'Hello World!' > /var/www/html/index.html

# Configure apache
RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
 echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
 echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ 
 echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ 
 chmod 755 /root/run_apache.sh

EXPOSE 80

CMD /root/run_apache.sh
EOF

出力
admin:~/environment $ cat << EOF > Dockerfile
> FROM ubuntu:18.04
> 
> # Install dependencies
> RUN apt-get update && \
>  apt-get -y install apache2
> 
> # Install apache and write hello world message
> RUN echo 'Hello World!' > /var/www/html/index.html
> 
> # Configure apache
> RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
>  echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
>  echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ 
>  echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ 
>  chmod 755 /root/run_apache.sh
> 
> EXPOSE 80
> 
> CMD /root/run_apache.sh
> EOF

ノーブレークスペース削除

コマンド
sed -i "s/$(echo -ne '\u200b')//g" Dockerfile

出力
admin:~/environment $ sed -i "s/$(echo -ne '\u200b')//g" Dockerfile

DockerImage一覧事前確認

コマンド
docker images

出力
admin:~/environment $ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

コンテナイメージを作成

コマンド
docker build -t hello-world .

出力
admin:~/environment $ docker build -t hello-world .
[+] Building 27.8s (8/8) FINISHED                                                                                                                                                                                                     docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                                                            0.0s
 => => transferring dockerfile: 569B                                                                                                                                                                                                            0.0s
 => [internal] load metadata for docker.io/library/ubuntu:18.04                                                                                                                                                                                 1.8s
 => [internal] load .dockerignore                                                                                                                                                                                                               0.0s
 => => transferring context: 2B                                                                                                                                                                                                                 0.0s
 => [1/4] FROM docker.io/library/ubuntu:18.04@sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98                                                                                                                           2.4s
 => => resolve docker.io/library/ubuntu:18.04@sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98                                                                                                                           0.0s
 => => sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98 1.33kB / 1.33kB                                                                                                                                                  0.0s
 => => sha256:dca176c9663a7ba4c1f0e710986f5a25e672842963d95b960191e2d9f7185ebe 424B / 424B                                                                                                                                                      0.0s
 => => sha256:f9a80a55f492e823bf5d51f1bd5f87ea3eed1cb31788686aa99a2fb61a27af6a 2.30kB / 2.30kB                                                                                                                                                  0.0s
 => => sha256:7c457f213c7634afb95a0fb2410a74b7b5bc0ba527033362c240c7a11bef4331 25.69MB / 25.69MB                                                                                                                                                0.6s
 => => extracting sha256:7c457f213c7634afb95a0fb2410a74b7b5bc0ba527033362c240c7a11bef4331                                                                                                                                                       1.7s
 => [2/4] RUN apt-get update &&  apt-get -y install apache2                                                                                                                                                                                    21.5s
 => [3/4] RUN echo 'Hello World!' > /var/www/html/index.html                                                                                                                                                                                    0.4s 
 => [4/4] RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh &&  echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh &&  echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh &&  echo '/usr/sbin/apache2 -D FOREGROUND' >> /root  0.4s 
 => exporting to image                                                                                                                                                                                                                          1.2s 
 => => exporting layers                                                                                                                                                                                                                         1.2s 
 => => writing image sha256:7b980724c411c2561bac001828833b4308b85c4df7763906d72e79261734087b                                                                                                                                                    0.0s 
 => => naming to docker.io/library/hello-world                                                                                                                                                                                                  0.0s 

DockerImage一覧事後確認

コマンド
docker images

出力
admin:~/environment $ docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
hello-world   latest    7b980724c411   31 seconds ago   205MB

04 コンテナイメージを作成して動かす その2

コンテナ一覧事前確認

コマンド
docker ps

出力
admin:~/environment $ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

コンテナ起動

コマンド
docker run -d -p 8080:80 --name h4b-local-run hello-world

出力
admin:~/environment $ docker run -d -p 8080:80 --name h4b-local-run hello-world
d808c0fbf30b4bd81f7a50d1497335cdb6ed31ab6e1d2a9195ed5fea203268b3

コンテナ一覧事後確認

コマンド
docker ps

出力
admin:~/environment $ docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS         PORTS                                   NAMES
d808c0fbf30b   hello-world   "/bin/sh -c /root/ru…"   10 seconds ago   Up 9 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   h4b-local-run

コンテナ動作確認

コマンド
curl localhost:8080

出力
admin:~/environment $ curl localhost:8080
Hello World!

コンテナへのログイン

コマンド
docker exec -i -t h4b-local-run bash

出力
admin:~/environment $ docker exec -i -t h4b-local-run bash
root@d808c0fbf30b:/# 

コンテナ内ファイル確認

コマンド
pwd
ls -la
cd /root 
ls -la
cat run_apache.sh
cd /var/www/html/
ls -la
cat index.html

出力
root@d808c0fbf30b:/# pwd
/
root@d808c0fbf30b:/# ls -la
total 8
drwxr-xr-x   1 root root   28 Sep  1 03:59 .
drwxr-xr-x   1 root root   28 Sep  1 03:59 ..
-rwxr-xr-x   1 root root    0 Sep  1 03:59 .dockerenv
drwxr-xr-x   2 root root 4096 May 30  2023 bin
drwxr-xr-x   2 root root    6 Apr 24  2018 boot
drwxr-xr-x   5 root root  340 Sep  1 03:59 dev
drwxr-xr-x   1 root root   66 Sep  1 03:59 etc
drwxr-xr-x   2 root root    6 Apr 24  2018 home
drwxr-xr-x   1 root root   45 May 23  2017 lib
drwxr-xr-x   2 root root   34 May 30  2023 lib64
drwxr-xr-x   2 root root    6 May 30  2023 media
drwxr-xr-x   2 root root    6 May 30  2023 mnt
drwxr-xr-x   2 root root    6 May 30  2023 opt
dr-xr-xr-x 187 root root    0 Sep  1 03:59 proc
drwx------   1 root root   27 Sep  1 03:58 root
drwxr-xr-x   1 root root   33 Sep  1 03:59 run
drwxr-xr-x   2 root root 4096 May 30  2023 sbin
drwxr-xr-x   2 root root    6 May 30  2023 srv
dr-xr-xr-x  13 root root    0 Sep  1 03:59 sys
drwxrwxrwt   1 root root    6 Sep  1 03:58 tmp
drwxr-xr-x   1 root root   53 May 30  2023 usr
drwxr-xr-x   1 root root   17 Sep  1 03:58 var
root@d808c0fbf30b:/# cd /root 
root@d808c0fbf30b:~# ls -la
total 12
drwx------ 1 root root   27 Sep  1 03:58 .
drwxr-xr-x 1 root root   28 Sep  1 03:59 ..
-rw-r--r-- 1 root root 3106 Apr  9  2018 .bashrc
-rw-r--r-- 1 root root  148 Aug 17  2015 .profile
-rwxr-xr-x 1 root root  108 Sep  1 03:58 run_apache.sh
root@d808c0fbf30b:~# cat run_apache.sh
. /etc/apache2/envvars
mkdir -p /var/run/apache2
mkdir -p /var/lock/apache2
/usr/sbin/apache2 -D FOREGROUND
root@d808c0fbf30b:~# cd /var/www/html/
root@d808c0fbf30b:/var/www/html# ls -la
total 4
drwxr-xr-x 1 root root 24 Sep  1 03:58 .
drwxr-xr-x 1 root root 18 Sep  1 03:58 ..
-rw-r--r-- 1 root root 13 Sep  1 03:58 index.html
root@d808c0fbf30b:/var/www/html# cat index.html
Hello World!

コンテナからのログアウト

コマンド
exit

出力
root@d808c0fbf30b:/var/www/html# exit
exit
admin:~/environment $ 

以降、CloudShellで実施

05 コンテナイメージを、ECR にアップロードする

プライベートリポジトリ作成

コマンド
# プライベートリポジトリ名
REPOSITORY_NAME="h4b-ecs-helloworld" \
&& echo ${REPOSITORY_NAME}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # プライベートリポジトリ名
[cloudshell-user@ip-10-132-94-73 ~]$ REPOSITORY_NAME="h4b-ecs-helloworld" \
> && echo ${REPOSITORY_NAME}
h4b-ecs-helloworld

作成

コマンド
# プライベートリポジトリ作成
aws ecr create-repository \
    --repository-name ${REPOSITORY_NAME} \
    --image-scanning-configuration scanOnPush=true

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # プライベートリポジトリ作成
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecr create-repository \
>     --repository-name ${REPOSITORY_NAME} \
>     --image-scanning-configuration scanOnPush=true
{
    "repository": {
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:999999999999:repository/h4b-ecs-helloworld",
        "registryId": "999999999999",
        "repositoryName": "h4b-ecs-helloworld",
        "repositoryUri": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld",
        "createdAt": "2024-09-01T04:01:14.519000+00:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": true
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}

確認

コマンド
# 詳細
aws ecr describe-repositories \
    --repository-names ${REPOSITORY_NAME}

# URI取得
REPOSITORYURI=$(
    aws ecr describe-repositories \
        --repository-names ${REPOSITORY_NAME} \
        --query repositories[].repositoryUri \
        --output text
) \
&& echo ${REPOSITORYURI}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # 詳細
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecr describe-repositories \
>     --repository-names ${REPOSITORY_NAME}
{
    "repositories": [
        {
            "repositoryArn": "arn:aws:ecr:ap-northeast-1:999999999999:repository/h4b-ecs-helloworld",
            "registryId": "999999999999",
            "repositoryName": "h4b-ecs-helloworld",
            "repositoryUri": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld",
            "createdAt": "2024-09-01T04:01:14.519000+00:00",
            "imageTagMutability": "MUTABLE",
            "imageScanningConfiguration": {
                "scanOnPush": true
            },
            "encryptionConfiguration": {
                "encryptionType": "AES256"
            }
        }
    ]
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # URI取得
[cloudshell-user@ip-10-132-94-73 ~]$ REPOSITORYURI=$(
>     aws ecr describe-repositories \
>         --repository-names ${REPOSITORY_NAME} \
>         --query repositories[].repositoryUri \
>         --output text
> ) \
> && echo ${REPOSITORYURI}
999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld

リポジトリ内のイメージ確認

コマンド
aws ecr list-images --repository-name ${REPOSITORY_NAME}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecr list-images --repository-name ${REPOSITORY_NAME}
{
    "imageIds": []
}

以降、Cloud9で実施

コンテナイメージを作成

コマンド
# リポジトリURI指定
REPOSITORYURI=999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld \
&& echo ${REPOSITORYURI}

# イメージ作成
docker build -t ${REPOSITORYURI}:0.0.1 .

出力
admin:~/environment $ # リポジトリURI指定
admin:~/environment $ REPOSITORYURI=999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld \
> && echo ${REPOSITORYURI}
999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld
admin:~/environment $ 
admin:~/environment $ # イメージ作成
admin:~/environment $ docker build -t ${REPOSITORYURI}:0.0.1 .
[+] Building 0.6s (8/8) FINISHED                                                                                                                                                                                                      docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                                                            0.0s
 => => transferring dockerfile: 569B                                                                                                                                                                                                            0.0s
 => [internal] load metadata for docker.io/library/ubuntu:18.04                                                                                                                                                                                 0.5s
 => [internal] load .dockerignore                                                                                                                                                                                                               0.0s
 => => transferring context: 2B                                                                                                                                                                                                                 0.0s
 => [1/4] FROM docker.io/library/ubuntu:18.04@sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98                                                                                                                           0.0s
 => CACHED [2/4] RUN apt-get update &&  apt-get -y install apache2                                                                                                                                                                              0.0s
 => CACHED [3/4] RUN echo 'Hello World!' > /var/www/html/index.html                                                                                                                                                                             0.0s
 => CACHED [4/4] RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh &&  echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh &&  echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh &&  echo '/usr/sbin/apache2 -D FOREGROUND' >  0.0s
 => exporting to image                                                                                                                                                                                                                          0.0s
 => => exporting layers                                                                                                                                                                                                                         0.0s
 => => writing image sha256:7b980724c411c2561bac001828833b4308b85c4df7763906d72e79261734087b                                                                                                                                                    0.0s
 => => naming to 999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1                                                                                                                                                     0.0s

DockerImage一覧確認

コマンド
docker images

出力
admin:~/environment $ docker images
REPOSITORY                                                             TAG       IMAGE ID       CREATED         SIZE
999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld   0.0.1     7b980724c411   4 minutes ago   205MB
hello-world                                                            latest    7b980724c411   4 minutes ago   205MB

ECRログイン

コマンド
aws ecr get-login-password | docker login --username AWS --password-stdin ${REPOSITORYURI}

出力
admin:~/environment $ aws ecr get-login-password | docker login --username AWS --password-stdin ${REPOSITORYURI}
WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

ECRへアップロード

コマンド
docker push ${REPOSITORYURI}:0.0.1

出力
admin:~/environment $ docker push ${REPOSITORYURI}:0.0.1
The push refers to repository [999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld]
8d652e6bb8c7: Pushed 
063eefad8995: Pushed 
6338b19070f0: Pushed 
548a79621a42: Pushed 
0.0.1: digest: sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7 size: 1155

以降、CloudShellで実施

リポジトリ内のイメージ確認

コマンド
aws ecr list-images --repository-name ${REPOSITORY_NAME}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecr list-images --repository-name ${REPOSITORY_NAME}
{
    "imageIds": [
        {
            "imageDigest": "sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7",
            "imageTag": "0.0.1"
        }
    ]
}

06 VPC の作成

VPC名:h4b-ecs
アベイラビリティーゾーン:2
パブリックサブネット:2
プライベートサブネット:0
NATゲートウェイ:なし
VPNエンドポイント:S3ゲートウェイ

変数

コマンド
# VPC名
VPC_NAME="h4b-ecs-vpc" \
&& echo ${VPC_NAME}

# サブネット名
AZ1_PUB_NAME="h4b-ecs-subnet-public1-ap-northeast-1a" \
&& echo ${AZ1_PUB_NAME}

AZ2_PUB_NAME="h4b-ecs-subnet-public2-ap-northeast-1c" \
&& echo ${AZ2_PUB_NAME}

# VPC CIDR block
VPC_CIDR_BLOCK="10.0.0.0/16" \
&& echo ${VPC_CIDR_BLOCK}

# サブネット CIDR block
AZ1_PUB_CIDR_BLOCK="10.0.0.0/20" \
&& echo ${AZ1_PUB_CIDR_BLOCK}

AZ2_PUB_CIDR_BLOCK="10.0.16.0/20" \
&& echo ${AZ2_PUB_CIDR_BLOCK}

# アベイラビリティーゾーン
AZ_1="ap-northeast-1a" \
&& echo ${AZ_1}

AZ_2="ap-northeast-1c" \
&& echo ${AZ_1}

# インターネットゲートウェイ名
IGW_NAME='h4b-ecs-igw' \
&& echo ${IGW_NAME}

# パブリックルートテーブル名
PUB_RT_NAME='h4b-ecs-rtb-public' \
&& echo ${PUB_RT_NAME}

# エンドポイント
END_POINT='h4b-ecs-vpce-s3' \
&& echo ${END_POINT}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # VPC名
[cloudshell-user@ip-10-132-94-73 ~]$ VPC_NAME="h4b-ecs-vpc" \
> && echo ${VPC_NAME}
h4b-ecs-vpc
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # サブネット名
[cloudshell-user@ip-10-132-94-73 ~]$ AZ1_PUB_NAME="h4b-ecs-subnet-public1-ap-northeast-1a" \
> && echo ${AZ1_PUB_NAME}
h4b-ecs-subnet-public1-ap-northeast-1a
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ AZ2_PUB_NAME="h4b-ecs-subnet-public2-ap-northeast-1c" \
> && echo ${AZ2_PUB_NAME}
h4b-ecs-subnet-public2-ap-northeast-1c
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # VPC CIDR block
[cloudshell-user@ip-10-132-94-73 ~]$ VPC_CIDR_BLOCK="10.0.0.0/16" \
> && echo ${VPC_CIDR_BLOCK}
10.0.0.0/16
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # サブネット CIDR block
[cloudshell-user@ip-10-132-94-73 ~]$ AZ1_PUB_CIDR_BLOCK="10.0.0.0/20" \
> && echo ${AZ1_PUB_CIDR_BLOCK}
10.0.0.0/20
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ AZ2_PUB_CIDR_BLOCK="10.0.16.0/20" \
> && echo ${AZ2_PUB_CIDR_BLOCK}
10.0.16.0/20
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # アベイラビリティーゾーン
[cloudshell-user@ip-10-132-94-73 ~]$ AZ_1="ap-northeast-1a" \
> && echo ${AZ_1}
ap-northeast-1a
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ AZ_2="ap-northeast-1c" \
> && echo ${AZ_1}
ap-northeast-1a
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # インターネットゲートウェイ名
[cloudshell-user@ip-10-132-94-73 ~]$ IGW_NAME='h4b-ecs-igw' \
> && echo ${IGW_NAME}
h4b-ecs-igw
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # パブリックルートテーブル名
[cloudshell-user@ip-10-132-94-73 ~]$ PUB_RT_NAME='h4b-ecs-rtb-public' \
> && echo ${PUB_RT_NAME}
h4b-ecs-rtb-public
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # エンドポイント
[cloudshell-user@ip-10-132-94-73 ~]$ END_POINT='h4b-ecs-vpce-s3' \
> && echo ${END_POINT}
h4b-ecs-vpce-s3

VPC作成

コマンド
# VPC作成
aws ec2 create-vpc \
    --cidr-block ${VPC_CIDR_BLOCK} \
    --tag-specifications "ResourceType=vpc,Tags=[{Key=Name,Value=${VPC_NAME}}]"

# ID取得
VPC_ID=$(
    aws ec2 describe-vpcs \
        --filters "Name=tag:Name,Values=${VPC_NAME}" \
        --query "Vpcs[0].VpcId" \
        --output text\
)\
&& echo ${VPC_ID}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # VPC作成
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 create-vpc \
>     --cidr-block ${VPC_CIDR_BLOCK} \
>     --tag-specifications "ResourceType=vpc,Tags=[{Key=Name,Value=${VPC_NAME}}]"
{
    "Vpc": {
        "CidrBlock": "10.0.0.0/16",
        "DhcpOptionsId": "dopt-0e7d97fbb33a62ce1",
        "State": "pending",
        "VpcId": "vpc-0753931619fb7ce9c",
        "OwnerId": "999999999999",
        "InstanceTenancy": "default",
        "Ipv6CidrBlockAssociationSet": [],
        "CidrBlockAssociationSet": [
            {
                "AssociationId": "vpc-cidr-assoc-084235b745e1877eb",
                "CidrBlock": "10.0.0.0/16",
                "CidrBlockState": {
                    "State": "associated"
                }
            }
        ],
        "IsDefault": false,
        "Tags": [
            {
                "Key": "Name",
                "Value": "h4b-ecs-vpc"
            }
        ]
    }
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ID取得
[cloudshell-user@ip-10-132-94-73 ~]$ VPC_ID=$(
>     aws ec2 describe-vpcs \
>         --filters "Name=tag:Name,Values=${VPC_NAME}" \
>         --query "Vpcs[0].VpcId" \
>         --output text\
> )\
> && echo ${VPC_ID}
vpc-0753931619fb7ce9c

サブネット作成

コマンド
# 第1アベイラビリティーゾーンのパブリックサブネット
aws ec2 create-subnet \
    --vpc-id ${VPC_ID} \
    --cidr-block ${AZ1_PUB_CIDR_BLOCK} \
    --availability-zone ${AZ_1} \
    --tag-specifications "ResourceType=subnet,Tags=[{Key=Name,Value=${AZ1_PUB_NAME}}]"

# 第2アベイラビリティーゾーンのパブリックサブネット
aws ec2 create-subnet \
    --vpc-id ${VPC_ID} \
    --cidr-block ${AZ2_PUB_CIDR_BLOCK} \
    --availability-zone ${AZ_2} \
    --tag-specifications "ResourceType=subnet,Tags=[{Key=Name,Value=${AZ2_PUB_NAME}}]"

# ID取得
# 第1アベイラビリティーゾーンのパブリックサブネット
AZ1_PUB_ID=$( \
    aws ec2 describe-subnets \
      --filters Name=vpc-id,Values=${VPC_ID} \
                Name=tag:Name,Values="${AZ1_PUB_NAME}" \
      --query "Subnets[].SubnetId" \
      --output text \
) \
&& echo ${AZ1_PUB_ID}

# 第2アベイラビリティーゾーンのパブリックサブネット
AZ2_PUB_ID=$( \
    aws ec2 describe-subnets \
      --filters Name=vpc-id,Values=${VPC_ID} \
                Name=tag:Name,Values="${AZ2_PUB_NAME}" \
      --query "Subnets[].SubnetId" \
      --output text \
) \
&& echo ${AZ2_PUB_ID}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # 第1アベイラビリティーゾーンのパブリックサブネット
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 create-subnet \
>     --vpc-id ${VPC_ID} \
>     --cidr-block ${AZ1_PUB_CIDR_BLOCK} \
>     --availability-zone ${AZ_1} \
>     --tag-specifications "ResourceType=subnet,Tags=[{Key=Name,Value=${AZ1_PUB_NAME}}]"
{
    "Subnet": {
        "AvailabilityZone": "ap-northeast-1a",
        "AvailabilityZoneId": "apne1-az4",
        "AvailableIpAddressCount": 4091,
        "CidrBlock": "10.0.0.0/20",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "available",
        "SubnetId": "subnet-00212e581b04af6ee",
        "VpcId": "vpc-0753931619fb7ce9c",
        "OwnerId": "999999999999",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "Tags": [
            {
                "Key": "Name",
                "Value": "h4b-ecs-subnet-public1-ap-northeast-1a"
            }
        ],
        "SubnetArn": "arn:aws:ec2:ap-northeast-1:999999999999:subnet/subnet-00212e581b04af6ee",
        "EnableDns64": false,
        "Ipv6Native": false,
        "PrivateDnsNameOptionsOnLaunch": {
            "HostnameType": "ip-name",
            "EnableResourceNameDnsARecord": false,
            "EnableResourceNameDnsAAAARecord": false
        }
    }
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # 第2アベイラビリティーゾーンのパブリックサブネット
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 create-subnet \
>     --vpc-id ${VPC_ID} \
>     --cidr-block ${AZ2_PUB_CIDR_BLOCK} \
>     --availability-zone ${AZ_2} \
>     --tag-specifications "ResourceType=subnet,Tags=[{Key=Name,Value=${AZ2_PUB_NAME}}]"
{
    "Subnet": {
        "AvailabilityZone": "ap-northeast-1c",
        "AvailabilityZoneId": "apne1-az1",
        "AvailableIpAddressCount": 4091,
        "CidrBlock": "10.0.16.0/20",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "available",
        "SubnetId": "subnet-0d47fd735f5035e47",
        "VpcId": "vpc-0753931619fb7ce9c",
        "OwnerId": "999999999999",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "Tags": [
            {
                "Key": "Name",
                "Value": "h4b-ecs-subnet-public2-ap-northeast-1c"
            }
        ],
        "SubnetArn": "arn:aws:ec2:ap-northeast-1:999999999999:subnet/subnet-0d47fd735f5035e47",
        "EnableDns64": false,
        "Ipv6Native": false,
        "PrivateDnsNameOptionsOnLaunch": {
            "HostnameType": "ip-name",
            "EnableResourceNameDnsARecord": false,
            "EnableResourceNameDnsAAAARecord": false
        }
    }
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ID取得
[cloudshell-user@ip-10-132-94-73 ~]$ # 第1アベイラビリティーゾーンのパブリックサブネット
[cloudshell-user@ip-10-132-94-73 ~]$ AZ1_PUB_ID=$( \
>     aws ec2 describe-subnets \
>       --filters Name=vpc-id,Values=${VPC_ID} \
>                 Name=tag:Name,Values="${AZ1_PUB_NAME}" \
>       --query "Subnets[].SubnetId" \
>       --output text \
> ) \
> && echo ${AZ1_PUB_ID}
subnet-00212e581b04af6ee
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # 第2アベイラビリティーゾーンのパブリックサブネット
[cloudshell-user@ip-10-132-94-73 ~]$ AZ2_PUB_ID=$( \
>     aws ec2 describe-subnets \
>       --filters Name=vpc-id,Values=${VPC_ID} \
>                 Name=tag:Name,Values="${AZ2_PUB_NAME}" \
>       --query "Subnets[].SubnetId" \
>       --output text \
> ) \
> && echo ${AZ2_PUB_ID}
subnet-0d47fd735f5035e47

インターネットゲートウェイ作成

コマンド
# インターネットゲートウェイ作成
aws ec2 create-internet-gateway \
    --tag-specifications "ResourceType=internet-gateway,Tags=[{Key=Name,Value=${IGW_NAME}}]"

# インターネットゲートウェイID取得
IGW_ID=$(
    aws ec2 describe-internet-gateways \
        --filters Name=tag:Name,Values=${IGW_NAME} \
        --query "InternetGateways[].InternetGatewayId" \
        --output text
) \
&& echo ${IGW_ID}

# インターネットゲートウェイをVPCにアタッチ
aws ec2 attach-internet-gateway \
    --vpc-id ${VPC_ID} \
    --internet-gateway-id ${IGW_ID}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # インターネットゲートウェイ作成
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 create-internet-gateway \
>     --tag-specifications "ResourceType=internet-gateway,Tags=[{Key=Name,Value=${IGW_NAME}}]"
{
    "InternetGateway": {
        "Attachments": [],
        "InternetGatewayId": "igw-01a5e3395fc1ffbc2",
        "OwnerId": "999999999999",
        "Tags": [
            {
                "Key": "Name",
                "Value": "h4b-ecs-igw"
            }
        ]
    }
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # インターネットゲートウェイID取得
[cloudshell-user@ip-10-132-94-73 ~]$ IGW_ID=$(
>     aws ec2 describe-internet-gateways \
>         --filters Name=tag:Name,Values=${IGW_NAME} \
>         --query "InternetGateways[].InternetGatewayId" \
>         --output text
> ) \
> && echo ${IGW_ID}
igw-01a5e3395fc1ffbc2
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # インターネットゲートウェイをVPCにアタッチ
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 attach-internet-gateway \
>     --vpc-id ${VPC_ID} \
>     --internet-gateway-id ${IGW_ID}

ルートテーブル作成

コマンド
# ルートテーブル作成
aws ec2 create-route-table \
    --vpc-id ${VPC_ID} \
    --tag-specifications "ResourceType=route-table,Tags=[{Key=Name,Value=${PUB_RT_NAME}}]"

# ルートテーブルID取得
PUB_RT_ID=$(
    aws ec2 describe-route-tables \
        --filters Name=vpc-id,Values=${VPC_ID} \
                  Name=tag:Name,Values="${PUB_RT_NAME}" \
        --query "RouteTables[].RouteTableId" \
        --output text
) \
&& echo ${PUB_RT_ID}

# デフォルトルート作成
aws ec2 create-route \
    --route-table-id ${PUB_RT_ID} \
    --destination-cidr-block 0.0.0.0/0 \
    --gateway-id ${IGW_ID}

# サブネット関連付け
aws ec2 associate-route-table \
    --subnet-id ${AZ1_PUB_ID} \
    --route-table-id ${PUB_RT_ID}

aws ec2 associate-route-table \
    --subnet-id ${AZ2_PUB_ID} \
    --route-table-id ${PUB_RT_ID}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # ルートテーブル作成
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 create-route-table \
>     --vpc-id ${VPC_ID} \
>     --tag-specifications "ResourceType=route-table,Tags=[{Key=Name,Value=${PUB_RT_NAME}}]"
{
    "RouteTable": {
        "Associations": [],
        "PropagatingVgws": [],
        "RouteTableId": "rtb-0bfe376ef3698c1a5",
        "Routes": [
            {
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            }
        ],
        "Tags": [
            {
                "Key": "Name",
                "Value": "h4b-ecs-rtb-public"
            }
        ],
        "VpcId": "vpc-0753931619fb7ce9c",
        "OwnerId": "999999999999"
    },
    "ClientToken": "dab14392-63fd-4c69-8674-48907142f8eb"
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ルートテーブルID取得
[cloudshell-user@ip-10-132-94-73 ~]$ PUB_RT_ID=$(
>     aws ec2 describe-route-tables \
>         --filters Name=vpc-id,Values=${VPC_ID} \
>                   Name=tag:Name,Values="${PUB_RT_NAME}" \
>         --query "RouteTables[].RouteTableId" \
>         --output text
> ) \
> && echo ${PUB_RT_ID}
rtb-0bfe376ef3698c1a5
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # デフォルトルート作成
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 create-route \
>     --route-table-id ${PUB_RT_ID} \
>     --destination-cidr-block 0.0.0.0/0 \
>     --gateway-id ${IGW_ID}
{
    "Return": true
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # サブネット関連付け
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 associate-route-table \
>     --subnet-id ${AZ1_PUB_ID} \
>     --route-table-id ${PUB_RT_ID}
{
    "AssociationId": "rtbassoc-03319c297b41b360a",
    "AssociationState": {
        "State": "associated"
    }
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 associate-route-table \
>     --subnet-id ${AZ2_PUB_ID} \
>     --route-table-id ${PUB_RT_ID}
{
    "AssociationId": "rtbassoc-08e5994a386c0816d",
    "AssociationState": {
        "State": "associated"
    }
}

セキュリティグループルールの追加

コマンド
# 変数設定 (セキュリティグループID取得)
SECURITY_GROUP_NAME="default" \
&& echo ${SECURITY_GROUP_NAME}

SECURITY_GROUP_ID=$( \
    aws ec2 describe-security-groups \
        --filters Name=vpc-id,Values=${VPC_ID} \
                  Name=group-name,Values=${SECURITY_GROUP_NAME} \
        --query "SecurityGroups[].GroupId" \
        --output text
) \
&& echo ${SECURITY_GROUP_ID}

# ルール追加
aws ec2 authorize-security-group-ingress \
    --group-id ${SECURITY_GROUP_ID} \
    --protocol tcp \
    --port 80 \
    --cidr 0.0.0.0/0

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # 変数設定 (セキュリティグループID取得)
[cloudshell-user@ip-10-132-94-73 ~]$ SECURITY_GROUP_NAME="default" \
> && echo ${SECURITY_GROUP_NAME}
default
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ SECURITY_GROUP_ID=$( \
>     aws ec2 describe-security-groups \
>         --filters Name=vpc-id,Values=${VPC_ID} \
>                   Name=group-name,Values=${SECURITY_GROUP_NAME} \
>         --query "SecurityGroups[].GroupId" \
>         --output text
> ) \
> && echo ${SECURITY_GROUP_ID}
sg-0439ac82bbca00d99
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ルール追加
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 authorize-security-group-ingress \
>     --group-id ${SECURITY_GROUP_ID} \
>     --protocol tcp \
>     --port 80 \
>     --cidr 0.0.0.0/0
{
    "Return": true,
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-0271d410d3bd0275f",
            "GroupId": "sg-0439ac82bbca00d99",
            "GroupOwnerId": "999999999999",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 80,
            "ToPort": 80,
            "CidrIpv4": "0.0.0.0/0"
        }
    ]
}

07 ECS クラスター・タスク定義の作成

変数

コマンド
# IAMロール名
ROLE_NAME="ecsTaskExecutionRole" \
&& echo ${ROLE_NAME}

# ポリシーARN
POLICY_ARN="arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" \
&& echo ${POLICY_ARN}

# クラスター名
CLUSTER_NAME="h4b-ecs-cluster" \
&& echo ${CLUSTER_NAME}

# タスク定義ファミリー
TASK_REGISTER_FAMILY="h4b-ecs-task-definition" \
&& echo ${TASK_REGISTER_FAMILY}

# コンテナ名
CONTAINER_NAME="apache-helloworld" \
&& echo ${CONTAINER_NAME}

# アカウントID
ACCOUNT_ID="999999999999" \
&& echo ${ACCOUNT_ID}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # IAMロール名
[cloudshell-user@ip-10-132-94-73 ~]$ ROLE_NAME="ecsTaskExecutionRole" \
> && echo ${ROLE_NAME}
ecsTaskExecutionRole
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ポリシーARN
[cloudshell-user@ip-10-132-94-73 ~]$ POLICY_ARN="arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" \
> && echo ${POLICY_ARN}
arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # クラスター名
[cloudshell-user@ip-10-132-94-73 ~]$ CLUSTER_NAME="h4b-ecs-cluster" \
> && echo ${CLUSTER_NAME}
h4b-ecs-cluster
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク定義ファミリー
[cloudshell-user@ip-10-132-94-73 ~]$ TASK_REGISTER_FAMILY="h4b-ecs-task-definition" \
> && echo ${TASK_REGISTER_FAMILY}
h4b-ecs-task-definition
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # コンテナ名
[cloudshell-user@ip-10-132-94-73 ~]$ CONTAINER_NAME="apache-helloworld" \
> && echo ${CONTAINER_NAME}
apache-helloworld
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # アカウントID
[cloudshell-user@ip-10-132-94-73 ~]$ ACCOUNT_ID="999999999999" \
> && echo ${ACCOUNT_ID}
999999999999

IAMロール作成

コマンド
# 信頼関係ポリシードキュメントの作成
ASSUME_ROLE_POLICY_DOCUMENT=$(cat << EOF
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "ecs-tasks.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
EOF
) \
&& echo ${ASSUME_ROLE_POLICY_DOCUMENT}

# JSONフォーマットの確認
echo ${ASSUME_ROLE_POLICY_DOCUMENT} | python -m json.tool

# IAMロールの作成
aws iam create-role \
    --role-name ${ROLE_NAME} \
    --assume-role-policy-document "${ASSUME_ROLE_POLICY_DOCUMENT}"

# ARN取得
ROLE_ARN=$(
    aws iam get-role \
        --role-name ${ROLE_NAME} \
        --query 'Role.Arn' --output text
) \
&& echo ${ROLE_ARN}

# IAMロールにポリシーをアタッチ
aws iam attach-role-policy \
    --role-name ${ROLE_NAME} \
    --policy-arn ${POLICY_ARN}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # 信頼関係ポリシードキュメントの作成
[cloudshell-user@ip-10-132-94-73 ~]$ ASSUME_ROLE_POLICY_DOCUMENT=$(cat << EOF
> {
>     "Version": "2008-10-17",
>     "Statement": [
>         {
>             "Sid": "",
>             "Effect": "Allow",
>             "Principal": {
>                 "Service": "ecs-tasks.amazonaws.com"
>             },
>             "Action": "sts:AssumeRole"
>         }
>     ]
> }
> EOF
> ) \
> && echo ${ASSUME_ROLE_POLICY_DOCUMENT}
{ "Version": "2008-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # JSONフォーマットの確認
[cloudshell-user@ip-10-132-94-73 ~]$ echo ${ASSUME_ROLE_POLICY_DOCUMENT} | python -m json.tool
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "ecs-tasks.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # IAMロールの作成
[cloudshell-user@ip-10-132-94-73 ~]$ aws iam create-role \
>     --role-name ${ROLE_NAME} \
>     --assume-role-policy-document "${ASSUME_ROLE_POLICY_DOCUMENT}"
{
    "Role": {
        "Path": "/",
        "RoleName": "ecsTaskExecutionRole",
        "RoleId": "AROAWFKRCMKOSRQ57SWHC",
        "Arn": "arn:aws:iam::999999999999:role/ecsTaskExecutionRole",
        "CreateDate": "2024-09-01T04:07:15+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2008-10-17",
            "Statement": [
                {
                    "Sid": "",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ecs-tasks.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ARN取得
[cloudshell-user@ip-10-132-94-73 ~]$ ROLE_ARN=$(
>     aws iam get-role \
>         --role-name ${ROLE_NAME} \
>         --query 'Role.Arn' --output text
> ) \
> && echo ${ROLE_ARN}
arn:aws:iam::999999999999:role/ecsTaskExecutionRole
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # IAMロールにポリシーをアタッチ
[cloudshell-user@ip-10-132-94-73 ~]$ aws iam attach-role-policy \
>     --role-name ${ROLE_NAME} \
>     --policy-arn ${POLICY_ARN}

ECSクラスターの作成

コマンド
# ECSクラスターの作成
aws ecs create-cluster \
    --cluster-name ${CLUSTER_NAME} 

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # ECSクラスターの作成
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs create-cluster \
>     --cluster-name ${CLUSTER_NAME} 
{
    "cluster": {
        "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
        "clusterName": "h4b-ecs-cluster",
        "status": "ACTIVE",
        "registeredContainerInstancesCount": 0,
        "runningTasksCount": 0,
        "pendingTasksCount": 0,
        "activeServicesCount": 0,
        "statistics": [],
        "tags": [],
        "settings": [
            {
                "name": "containerInsights",
                "value": "disabled"
            }
        ],
        "capacityProviders": [],
        "defaultCapacityProviderStrategy": []
    }
}

タスク定義の作成

タスク定義JSON

コマンド
# タスク定義JSON
TASK_JSON=$(cat << EOF
{
    "family": "${TASK_REGISTER_FAMILY}",
    "containerDefinitions": [
        {
            "name": "${CONTAINER_NAME}",
            "image": "${REPOSITORYURI}:0.0.1",
            "cpu": 0,
            "portMappings": [
                {
                    "name": "${CONTAINER_NAME}-80-tcp",
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "environment": [],
            "environmentFiles": [],
            "mountPoints": [],
            "volumesFrom": [],
            "ulimits": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/${TASK_REGISTER_FAMILY}",
                    "mode": "non-blocking",
                    "awslogs-create-group": "true",
                    "max-buffer-size": "25m",
                    "awslogs-region": "ap-northeast-1",
                    "awslogs-stream-prefix": "ecs"
                },
                "secretOptions": []
            },
            "systemControls": []
        }
    ],
    "executionRoleArn": "${ROLE_ARN}",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "1024",
    "memory": "3072",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    }
}
EOF
) \
&& echo ${TASK_JSON}

# JSONフォーマットの確認
echo ${TASK_JSON} | python -m json.tool

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク定義JSON
[cloudshell-user@ip-10-132-94-73 ~]$ TASK_JSON=$(cat << EOF
> {
>     "family": "${TASK_REGISTER_FAMILY}",
>     "containerDefinitions": [
>         {
>             "name": "${CONTAINER_NAME}",
>             "image": "${REPOSITORYURI}:0.0.1",
>             "cpu": 0,
>             "portMappings": [
>                 {
>                     "name": "${CONTAINER_NAME}-80-tcp",
>                     "containerPort": 80,
>                     "hostPort": 80,
>                     "protocol": "tcp",
>                     "appProtocol": "http"
>                 }
>             ],
>             "essential": true,
>             "environment": [],
>             "environmentFiles": [],
>             "mountPoints": [],
>             "volumesFrom": [],
>             "ulimits": [],
>             "logConfiguration": {
>                 "logDriver": "awslogs",
>                 "options": {
>                     "awslogs-group": "/ecs/${TASK_REGISTER_FAMILY}",
>                     "mode": "non-blocking",
>                     "awslogs-create-group": "true",
>                     "max-buffer-size": "25m",
>                     "awslogs-region": "ap-northeast-1",
>                     "awslogs-stream-prefix": "ecs"
>                 },
>                 "secretOptions": []
>             },
>             "systemControls": []
>         }
>     ],
>     "executionRoleArn": "${ROLE_ARN}",
>     "networkMode": "awsvpc",
>     "requiresCompatibilities": [
>         "FARGATE"
>     ],
>     "cpu": "1024",
>     "memory": "3072",
>     "runtimePlatform": {
>         "cpuArchitecture": "X86_64",
>         "operatingSystemFamily": "LINUX"
>     }
> }
> EOF
> ) \
> && echo ${TASK_JSON}
{ "family": "h4b-ecs-task-definition", "containerDefinitions": [ { "name": "apache-helloworld", "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1", "cpu": 0, "portMappings": [ { "name": "apache-helloworld-80-tcp", "containerPort": 80, "hostPort": 80, "protocol": "tcp", "appProtocol": "http" } ], "essential": true, "environment": [], "environmentFiles": [], "mountPoints": [], "volumesFrom": [], "ulimits": [], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/h4b-ecs-task-definition", "mode": "non-blocking", "awslogs-create-group": "true", "max-buffer-size": "25m", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "ecs" }, "secretOptions": [] }, "systemControls": [] } ], "executionRoleArn": "arn:aws:iam::999999999999:role/ecsTaskExecutionRole", "networkMode": "awsvpc", "requiresCompatibilities": [ "FARGATE" ], "cpu": "1024", "memory": "3072", "runtimePlatform": { "cpuArchitecture": "X86_64", "operatingSystemFamily": "LINUX" } }
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # JSONフォーマットの確認
[cloudshell-user@ip-10-132-94-73 ~]$ echo ${TASK_JSON} | python -m json.tool
{
    "family": "h4b-ecs-task-definition",
    "containerDefinitions": [
        {
            "name": "apache-helloworld",
            "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1",
            "cpu": 0,
            "portMappings": [
                {
                    "name": "apache-helloworld-80-tcp",
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "environment": [],
            "environmentFiles": [],
            "mountPoints": [],
            "volumesFrom": [],
            "ulimits": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/h4b-ecs-task-definition",
                    "mode": "non-blocking",
                    "awslogs-create-group": "true",
                    "max-buffer-size": "25m",
                    "awslogs-region": "ap-northeast-1",
                    "awslogs-stream-prefix": "ecs"
                },
                "secretOptions": []
            },
            "systemControls": []
        }
    ],
    "executionRoleArn": "arn:aws:iam::999999999999:role/ecsTaskExecutionRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "1024",
    "memory": "3072",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    }
}

作成

コマンド
# タスク定義の作成
aws ecs register-task-definition \
    --cli-input-json "${TASK_JSON}" \
    --no-cli-pager

# タスク定義のARN取得
TASK_DEFINITION_ARN=$(
    aws ecs describe-task-definition \
        --task-definition ${TASK_REGISTER_FAMILY} \
        --query taskDefinition.taskDefinitionArn \
        --output text
) \
&& echo ${TASK_DEFINITION_ARN}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク定義の作成
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs register-task-definition \
>     --cli-input-json "${TASK_JSON}" \
>     --no-cli-pager
{
    "taskDefinition": {
        "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
        "containerDefinitions": [
            {
                "name": "apache-helloworld",
                "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1",
                "cpu": 0,
                "portMappings": [
                    {
                        "containerPort": 80,
                        "hostPort": 80,
                        "protocol": "tcp",
                        "name": "apache-helloworld-80-tcp",
                        "appProtocol": "http"
                    }
                ],
                "essential": true,
                "environment": [],
                "environmentFiles": [],
                "mountPoints": [],
                "volumesFrom": [],
                "ulimits": [],
                "logConfiguration": {
                    "logDriver": "awslogs",
                    "options": {
                        "awslogs-group": "/ecs/h4b-ecs-task-definition",
                        "mode": "non-blocking",
                        "awslogs-create-group": "true",
                        "max-buffer-size": "25m",
                        "awslogs-region": "ap-northeast-1",
                        "awslogs-stream-prefix": "ecs"
                    },
                    "secretOptions": []
                },
                "systemControls": []
            }
        ],
        "family": "h4b-ecs-task-definition",
        "executionRoleArn": "arn:aws:iam::999999999999:role/ecsTaskExecutionRole",
        "networkMode": "awsvpc",
        "revision": 11,
        "volumes": [],
        "status": "ACTIVE",
        "requiresAttributes": [
            {
                "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
            },
            {
                "name": "ecs.capability.execution-role-awslogs"
            },
            {
                "name": "com.amazonaws.ecs.capability.ecr-auth"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.28"
            },
            {
                "name": "ecs.capability.execution-role-ecr-pull"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
            },
            {
                "name": "ecs.capability.task-eni"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29"
            }
        ],
        "placementConstraints": [],
        "compatibilities": [
            "EC2",
            "FARGATE"
        ],
        "runtimePlatform": {
            "cpuArchitecture": "X86_64",
            "operatingSystemFamily": "LINUX"
        },
        "requiresCompatibilities": [
            "FARGATE"
        ],
        "cpu": "1024",
        "memory": "3072",
        "registeredAt": "2024-09-01T04:08:23.830000+00:00",
        "registeredBy": "arn:aws:iam::999999999999:user/admin"
    }
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク定義のARN取得
[cloudshell-user@ip-10-132-94-73 ~]$ TASK_DEFINITION_ARN=$(
>     aws ecs describe-task-definition \
>         --task-definition ${TASK_REGISTER_FAMILY} \
>         --query taskDefinition.taskDefinitionArn \
>         --output text
> ) \
> && echo ${TASK_DEFINITION_ARN}
arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11

確認

コマンド
# タスク定義の確認
aws ecs describe-task-definition \
    --task-definition ${TASK_REGISTER_FAMILY} \
    --no-cli-pager

# 最新のタスク定義リビジョン番号を取得
TASKDEFINITION_REVISION_NO=$(
    aws ecs describe-task-definition \
        --task-definition ${TASK_REGISTER_FAMILY} \
        --query 'taskDefinition.revision'
) \
&& echo ${TASKDEFINITION_REVISION_NO}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク定義の確認
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs describe-task-definition \
>     --task-definition ${TASK_REGISTER_FAMILY} \
>     --no-cli-pager
{
    "taskDefinition": {
        "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
        "containerDefinitions": [
            {
                "name": "apache-helloworld",
                "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1",
                "cpu": 0,
                "portMappings": [
                    {
                        "containerPort": 80,
                        "hostPort": 80,
                        "protocol": "tcp",
                        "name": "apache-helloworld-80-tcp",
                        "appProtocol": "http"
                    }
                ],
                "essential": true,
                "environment": [],
                "environmentFiles": [],
                "mountPoints": [],
                "volumesFrom": [],
                "ulimits": [],
                "logConfiguration": {
                    "logDriver": "awslogs",
                    "options": {
                        "awslogs-group": "/ecs/h4b-ecs-task-definition",
                        "mode": "non-blocking",
                        "awslogs-create-group": "true",
                        "max-buffer-size": "25m",
                        "awslogs-region": "ap-northeast-1",
                        "awslogs-stream-prefix": "ecs"
                    },
                    "secretOptions": []
                },
                "systemControls": []
            }
        ],
        "family": "h4b-ecs-task-definition",
        "executionRoleArn": "arn:aws:iam::999999999999:role/ecsTaskExecutionRole",
        "networkMode": "awsvpc",
        "revision": 11,
        "volumes": [],
        "status": "ACTIVE",
        "requiresAttributes": [
            {
                "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
            },
            {
                "name": "ecs.capability.execution-role-awslogs"
            },
            {
                "name": "com.amazonaws.ecs.capability.ecr-auth"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.28"
            },
            {
                "name": "ecs.capability.execution-role-ecr-pull"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
            },
            {
                "name": "ecs.capability.task-eni"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29"
            }
        ],
        "placementConstraints": [],
        "compatibilities": [
            "EC2",
            "FARGATE"
        ],
        "runtimePlatform": {
            "cpuArchitecture": "X86_64",
            "operatingSystemFamily": "LINUX"
        },
        "requiresCompatibilities": [
            "FARGATE"
        ],
        "cpu": "1024",
        "memory": "3072",
        "registeredAt": "2024-09-01T04:08:23.830000+00:00",
        "registeredBy": "arn:aws:iam::999999999999:user/admin"
    },
    "tags": []
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # 最新のタスク定義リビジョン番号を取得
[cloudshell-user@ip-10-132-94-73 ~]$ TASKDEFINITION_REVISION_NO=$(
>     aws ecs describe-task-definition \
>         --task-definition ${TASK_REGISTER_FAMILY} \
>         --query 'taskDefinition.revision'
> ) \
> && echo ${TASKDEFINITION_REVISION_NO}
11

08 サービスの作成・ブラウザからアクセス

ファミリー:h4b-ecs-task-definition
サービス名:h4b-ecs-service
必要なタスク:2
ロードバランサーの種類:Application Load Balancer
ロードバランサー名:h4b-ecs-alb
ポート:80
プロトコル:HTTP
ターゲットグループ名:h4b-ecs-targetgroup
プロトコル:HTTP

変数

コマンド
# ターゲットタイプ
Target_GROUP_TYPE="ip" \
&& echo ${Target_GROUP_TYPE}

# ターゲットグループ名
Target_GROUP_NAME="h4b-ecs-targetgroup" \
&& echo ${Target_GROUP_NAME}

# ターゲットグループ プロトコル
Target_GROUP_PROTOCOL="HTTP" \
&& echo ${Target_GROUP_PROTOCOL}

# ターゲットグループ ポート
Target_GROUP_PORT="80" \
&& echo ${Target_GROUP_PORT}

# ターゲットグループ プロトコルバージョン
Target_GROUP_PROTOCOLVERSION="HTTP1" \
&& echo ${Target_GROUP_PROTOCOLVERSION}

# ヘルスチェックプロトコル
HEALTH_CHECK_PROTOCOL="HTTP" \
&& echo ${HEALTH_CHECK_PROTOCOL}

# ロードバランサー名
LB_NAME="h4b-ecs-alb" \
&& echo ${LB_NAME}

# リスナー プロトコル
LISTENER_PROTOCOL="HTTP" \
&& echo ${LISTENER_PROTOCOL}

# リスナー ポート
LISTENER_PORT="80" \
&& echo ${LISTENER_PORT}

# サービス名
SERVICE_NAME="h4b-ecs-service" \
&& echo ${SERVICE_NAME}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # ターゲットタイプ
[cloudshell-user@ip-10-132-94-73 ~]$ Target_GROUP_TYPE="ip" \
> && echo ${Target_GROUP_TYPE}
ip
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ターゲットグループ名
[cloudshell-user@ip-10-132-94-73 ~]$ Target_GROUP_NAME="h4b-ecs-targetgroup" \
> && echo ${Target_GROUP_NAME}
h4b-ecs-targetgroup
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ターゲットグループ プロトコル
[cloudshell-user@ip-10-132-94-73 ~]$ Target_GROUP_PROTOCOL="HTTP" \
> && echo ${Target_GROUP_PROTOCOL}
HTTP
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ターゲットグループ ポート
[cloudshell-user@ip-10-132-94-73 ~]$ Target_GROUP_PORT="80" \
> && echo ${Target_GROUP_PORT}
80
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ターゲットグループ プロトコルバージョン
[cloudshell-user@ip-10-132-94-73 ~]$ Target_GROUP_PROTOCOLVERSION="HTTP1" \
> && echo ${Target_GROUP_PROTOCOLVERSION}
HTTP1
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ヘルスチェックプロトコル
[cloudshell-user@ip-10-132-94-73 ~]$ HEALTH_CHECK_PROTOCOL="HTTP" \
> && echo ${HEALTH_CHECK_PROTOCOL}
HTTP
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ロードバランサー名
[cloudshell-user@ip-10-132-94-73 ~]$ LB_NAME="h4b-ecs-alb" \
> && echo ${LB_NAME}
h4b-ecs-alb
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # リスナー プロトコル
[cloudshell-user@ip-10-132-94-73 ~]$ LISTENER_PROTOCOL="HTTP" \
> && echo ${LISTENER_PROTOCOL}
HTTP
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # リスナー ポート
[cloudshell-user@ip-10-132-94-73 ~]$ LISTENER_PORT="80" \
> && echo ${LISTENER_PORT}
80
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # サービス名
[cloudshell-user@ip-10-132-94-73 ~]$ SERVICE_NAME="h4b-ecs-service" \
> && echo ${SERVICE_NAME}
h4b-ecs-service

ターゲットグループ作成

コマンド
# ターゲットグループ作成
aws elbv2 create-target-group \
    --name ${Target_GROUP_NAME} \
    --protocol ${Target_GROUP_PROTOCOL} \
    --port ${Target_GROUP_PORT} \
    --vpc-id ${VPC_ID} \
    --target-type ${Target_GROUP_TYPE} \
    --health-check-protocol ${HEALTH_CHECK_PROTOCOL}

# ARN取得
TARGET_GROUP_ARN=$(
    aws elbv2 describe-target-groups \
        --names ${Target_GROUP_NAME} \
        --query 'TargetGroups[*].TargetGroupArn' \
        --output text
) \
&& echo ${TARGET_GROUP_ARN}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # ターゲットグループ作成
[cloudshell-user@ip-10-132-94-73 ~]$ aws elbv2 create-target-group \
>     --name ${Target_GROUP_NAME} \
>     --protocol ${Target_GROUP_PROTOCOL} \
>     --port ${Target_GROUP_PORT} \
>     --vpc-id ${VPC_ID} \
>     --target-type ${Target_GROUP_TYPE} \
>     --health-check-protocol ${HEALTH_CHECK_PROTOCOL}
{
    "TargetGroups": [
        {
            "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c",
            "TargetGroupName": "h4b-ecs-targetgroup",
            "Protocol": "HTTP",
            "Port": 80,
            "VpcId": "vpc-0753931619fb7ce9c",
            "HealthCheckProtocol": "HTTP",
            "HealthCheckPort": "traffic-port",
            "HealthCheckEnabled": true,
            "HealthCheckIntervalSeconds": 30,
            "HealthCheckTimeoutSeconds": 5,
            "HealthyThresholdCount": 5,
            "UnhealthyThresholdCount": 2,
            "HealthCheckPath": "/",
            "Matcher": {
                "HttpCode": "200"
            },
            "TargetType": "ip",
            "ProtocolVersion": "HTTP1",
            "IpAddressType": "ipv4"
        }
    ]
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ARN取得
[cloudshell-user@ip-10-132-94-73 ~]$ TARGET_GROUP_ARN=$(
>     aws elbv2 describe-target-groups \
>         --names ${Target_GROUP_NAME} \
>         --query 'TargetGroups[*].TargetGroupArn' \
>         --output text
> ) \
> && echo ${TARGET_GROUP_ARN}
arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c

ALBの作成

コマンド
# ロードバランサー作成
aws elbv2 create-load-balancer \
    --name ${LB_NAME} \
    --type application \
    --scheme internet-facing \
    --ip-address-type ipv4 \
    --subnets ${AZ1_PUB_ID} ${AZ2_PUB_ID} \
    --security-groups ${SECURITY_GROUP_ID}

# ARN取得
LB_ARN=$(
    aws elbv2 describe-load-balancers \
        --names ${LB_NAME} \
        --query 'LoadBalancers[*].LoadBalancerArn' \
        --output text
) \
&& echo ${LB_ARN}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # ロードバランサー作成
[cloudshell-user@ip-10-132-94-73 ~]$ aws elbv2 create-load-balancer \
>     --name ${LB_NAME} \
>     --type application \
>     --scheme internet-facing \
>     --ip-address-type ipv4 \
>     --subnets ${AZ1_PUB_ID} ${AZ2_PUB_ID} \
>     --security-groups ${SECURITY_GROUP_ID}
{
    "LoadBalancers": [
        {
            "LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:loadbalancer/app/h4b-ecs-alb/3a43861bfe018cab",
            "DNSName": "h4b-ecs-alb-2111226423.ap-northeast-1.elb.amazonaws.com",
            "CanonicalHostedZoneId": "Z14GRHDCWA56QT",
            "CreatedTime": "2024-09-01T04:09:54.417000+00:00",
            "LoadBalancerName": "h4b-ecs-alb",
            "Scheme": "internet-facing",
            "VpcId": "vpc-0753931619fb7ce9c",
            "State": {
                "Code": "provisioning"
            },
            "Type": "application",
            "AvailabilityZones": [
                {
                    "ZoneName": "ap-northeast-1a",
                    "SubnetId": "subnet-00212e581b04af6ee",
                    "LoadBalancerAddresses": []
                },
                {
                    "ZoneName": "ap-northeast-1c",
                    "SubnetId": "subnet-0d47fd735f5035e47",
                    "LoadBalancerAddresses": []
                }
            ],
            "SecurityGroups": [
                "sg-0439ac82bbca00d99"
            ],
            "IpAddressType": "ipv4"
        }
    ]
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ARN取得
[cloudshell-user@ip-10-132-94-73 ~]$ LB_ARN=$(
>     aws elbv2 describe-load-balancers \
>         --names ${LB_NAME} \
>         --query 'LoadBalancers[*].LoadBalancerArn' \
>         --output text
> ) \
> && echo ${LB_ARN}
arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:loadbalancer/app/h4b-ecs-alb/3a43861bfe018cab

リスナーの追加

コマンド
# リスナーの追加
aws elbv2 create-listener \
    --load-balancer-arn ${LB_ARN} \
    --protocol ${LISTENER_PROTOCOL} \
    --port ${LISTENER_PORT} \
    --default-actions Type=forward,TargetGroupArn=${TARGET_GROUP_ARN}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # リスナーの追加
[cloudshell-user@ip-10-132-94-73 ~]$ aws elbv2 create-listener \
>     --load-balancer-arn ${LB_ARN} \
>     --protocol ${LISTENER_PROTOCOL} \
>     --port ${LISTENER_PORT} \
>     --default-actions Type=forward,TargetGroupArn=${TARGET_GROUP_ARN}
{
    "Listeners": [
        {
            "ListenerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:listener/app/h4b-ecs-alb/3a43861bfe018cab/2fb7a73b60570861",
            "LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:loadbalancer/app/h4b-ecs-alb/3a43861bfe018cab",
            "Port": 80,
            "Protocol": "HTTP",
            "DefaultActions": [
                {
                    "Type": "forward",
                    "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c",
                    "ForwardConfig": {
                        "TargetGroups": [
                            {
                                "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c",
                                "Weight": 1
                            }
                        ],
                        "TargetGroupStickinessConfig": {
                            "Enabled": false
                        }
                    }
                }
            ]
        }
    ]
}

ネットワーク設定用JSON

コマンド
# ネットワーク設定
NETWORK_CONFIGURATION_JSON=$(cat << EOF
{
    "awsvpcConfiguration": {
        "subnets": [
            "${AZ1_PUB_ID}",
            "${AZ2_PUB_ID}"
        ],
        "securityGroups": [
            "${SECURITY_GROUP_ID}"
        ],
        "assignPublicIp": "ENABLED"
    }
}
EOF
) \
&& echo ${NETWORK_CONFIGURATION_JSON}

# JSONフォーマットの確認
echo ${NETWORK_CONFIGURATION_JSON} | python -m json.tool

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # ネットワーク設定
[cloudshell-user@ip-10-132-94-73 ~]$ NETWORK_CONFIGURATION_JSON=$(cat << EOF
> {
>     "awsvpcConfiguration": {
>         "subnets": [
>             "${AZ1_PUB_ID}",
>             "${AZ2_PUB_ID}"
>         ],
>         "securityGroups": [
>             "${SECURITY_GROUP_ID}"
>         ],
>         "assignPublicIp": "ENABLED"
>     }
> }
> EOF
> ) \
> && echo ${NETWORK_CONFIGURATION_JSON}
{ "awsvpcConfiguration": { "subnets": [ "subnet-00212e581b04af6ee", "subnet-0d47fd735f5035e47" ], "securityGroups": [ "sg-0439ac82bbca00d99" ], "assignPublicIp": "ENABLED" } }
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # JSONフォーマットの確認
[cloudshell-user@ip-10-132-94-73 ~]$ echo ${NETWORK_CONFIGURATION_JSON} | python -m json.tool
{
    "awsvpcConfiguration": {
        "subnets": [
            "subnet-00212e581b04af6ee",
            "subnet-0d47fd735f5035e47"
        ],
        "securityGroups": [
            "sg-0439ac82bbca00d99"
        ],
        "assignPublicIp": "ENABLED"
    }
}

ロードバランシング設定用JSON

コマンド
# ロードバランシング設定
LOAD_BALANCERS_JSON=$(cat << EOF
{
    "targetGroupArn": "${TARGET_GROUP_ARN}",
    "containerName": "${CONTAINER_NAME}",
    "containerPort": 80
}
EOF
) \
&& echo ${LOAD_BALANCERS_JSON}

# JSONフォーマットの確認
echo ${LOAD_BALANCERS_JSON} | python -m json.tool

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # ロードバランシング設定
[cloudshell-user@ip-10-132-94-73 ~]$ LOAD_BALANCERS_JSON=$(cat << EOF
> {
>     "targetGroupArn": "${TARGET_GROUP_ARN}",
>     "containerName": "${CONTAINER_NAME}",
>     "containerPort": 80
> }
> EOF
> ) \
> && echo ${LOAD_BALANCERS_JSON}
{ "targetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c", "containerName": "apache-helloworld", "containerPort": 80 }
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # JSONフォーマットの確認
[cloudshell-user@ip-10-132-94-73 ~]$ echo ${LOAD_BALANCERS_JSON} | python -m json.tool
{
    "targetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c",
    "containerName": "apache-helloworld",
    "containerPort": 80
}

クラスター内サービスの作成

コマンド
# サービスの作成
aws ecs create-service \
    --cluster ${CLUSTER_NAME} \
    --service-name ${SERVICE_NAME} \
    --task-definition ${TASK_DEFINITION_ARN} \
    --desired-count 2 \
    --launch-type FARGATE \
    --network-configuration "${NETWORK_CONFIGURATION_JSON}" \
    --load-balancers "${LOAD_BALANCERS_JSON}" \
    --no-cli-pager

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # サービスの作成
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs create-service \
>     --cluster ${CLUSTER_NAME} \
>     --service-name ${SERVICE_NAME} \
>     --task-definition ${TASK_DEFINITION_ARN} \
>     --desired-count 2 \
>     --launch-type FARGATE \
>     --network-configuration "${NETWORK_CONFIGURATION_JSON}" \
>     --load-balancers "${LOAD_BALANCERS_JSON}" \
>     --no-cli-pager
{
    "service": {
        "serviceArn": "arn:aws:ecs:ap-northeast-1:999999999999:service/h4b-ecs-cluster/h4b-ecs-service",
        "serviceName": "h4b-ecs-service",
        "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
        "loadBalancers": [
            {
                "targetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c",
                "containerName": "apache-helloworld",
                "containerPort": 80
            }
        ],
        "serviceRegistries": [],
        "status": "ACTIVE",
        "desiredCount": 2,
        "runningCount": 0,
        "pendingCount": 0,
        "launchType": "FARGATE",
        "platformVersion": "LATEST",
        "platformFamily": "Linux",
        "taskDefinition": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
        "deploymentConfiguration": {
            "deploymentCircuitBreaker": {
                "enable": false,
                "rollback": false
            },
            "maximumPercent": 200,
            "minimumHealthyPercent": 100
        },
        "deployments": [
            {
                "id": "ecs-svc/2975423510966026190",
                "status": "PRIMARY",
                "taskDefinition": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
                "desiredCount": 0,
                "pendingCount": 0,
                "runningCount": 0,
                "failedTasks": 0,
                "createdAt": "2024-09-01T04:11:29.087000+00:00",
                "updatedAt": "2024-09-01T04:11:29.087000+00:00",
                "launchType": "FARGATE",
                "platformVersion": "1.4.0",
                "platformFamily": "Linux",
                "networkConfiguration": {
                    "awsvpcConfiguration": {
                        "subnets": [
                            "subnet-00212e581b04af6ee",
                            "subnet-0d47fd735f5035e47"
                        ],
                        "securityGroups": [
                            "sg-0439ac82bbca00d99"
                        ],
                        "assignPublicIp": "ENABLED"
                    }
                },
                "rolloutState": "IN_PROGRESS",
                "rolloutStateReason": "ECS deployment ecs-svc/2975423510966026190 in progress."
            }
        ],
        "roleArn": "arn:aws:iam::999999999999:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS",
        "events": [],
        "createdAt": "2024-09-01T04:11:29.087000+00:00",
        "placementConstraints": [],
        "placementStrategy": [],
        "networkConfiguration": {
            "awsvpcConfiguration": {
                "subnets": [
                    "subnet-00212e581b04af6ee",
                    "subnet-0d47fd735f5035e47"
                ],
                "securityGroups": [
                    "sg-0439ac82bbca00d99"
                ],
                "assignPublicIp": "ENABLED"
            }
        },
        "healthCheckGracePeriodSeconds": 0,
        "schedulingStrategy": "REPLICA",
        "deploymentController": {
            "type": "ECS"
        },
        "createdBy": "arn:aws:iam::999999999999:user/admin",
        "enableECSManagedTags": false,
        "propagateTags": "NONE",
        "enableExecuteCommand": false
    }
}

クラスター内サービスの確認

クラスター内サービスの確認

コマンド
# サービスの確認
aws ecs describe-services \
    --cluster ${CLUSTER_NAME} \
    --services ${SERVICE_NAME} \
    --no-cli-pager

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # サービスの確認
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs describe-services \
>     --cluster ${CLUSTER_NAME} \
>     --services ${SERVICE_NAME} \
>     --no-cli-pager
{
    "services": [
        {
            "serviceArn": "arn:aws:ecs:ap-northeast-1:999999999999:service/h4b-ecs-cluster/h4b-ecs-service",
            "serviceName": "h4b-ecs-service",
            "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
            "loadBalancers": [
                {
                    "targetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c",
                    "containerName": "apache-helloworld",
                    "containerPort": 80
                }
            ],
            "serviceRegistries": [],
            "status": "ACTIVE",
            "desiredCount": 2,
            "runningCount": 0,
            "pendingCount": 1,
            "launchType": "FARGATE",
            "platformVersion": "LATEST",
            "platformFamily": "Linux",
            "taskDefinition": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
            "deploymentConfiguration": {
                "deploymentCircuitBreaker": {
                    "enable": false,
                    "rollback": false
                },
                "maximumPercent": 200,
                "minimumHealthyPercent": 100
            },
            "deployments": [
                {
                    "id": "ecs-svc/2975423510966026190",
                    "status": "PRIMARY",
                    "taskDefinition": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
                    "desiredCount": 1,
                    "pendingCount": 1,
                    "runningCount": 0,
                    "failedTasks": 0,
                    "createdAt": "2024-09-01T04:11:29.087000+00:00",
                    "updatedAt": "2024-09-01T04:11:40.593000+00:00",
                    "launchType": "FARGATE",
                    "platformVersion": "1.4.0",
                    "platformFamily": "Linux",
                    "networkConfiguration": {
                        "awsvpcConfiguration": {
                            "subnets": [
                                "subnet-00212e581b04af6ee",
                                "subnet-0d47fd735f5035e47"
                            ],
                            "securityGroups": [
                                "sg-0439ac82bbca00d99"
                            ],
                            "assignPublicIp": "ENABLED"
                        }
                    },
                    "rolloutState": "IN_PROGRESS",
                    "rolloutStateReason": "ECS deployment ecs-svc/2975423510966026190 in progress."
                }
            ],
            "roleArn": "arn:aws:iam::999999999999:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS",
            "events": [
                {
                    "id": "c9a01a56-f61c-4a48-8b0b-871a6400cad4",
                    "createdAt": "2024-09-01T04:11:41.475000+00:00",
                    "message": "(service h4b-ecs-service) has started 1 tasks: (task 96f27181cb8e480793a548b98447e44c)."
                }
            ],
            "createdAt": "2024-09-01T04:11:29.087000+00:00",
            "placementConstraints": [],
            "placementStrategy": [],
            "networkConfiguration": {
                "awsvpcConfiguration": {
                    "subnets": [
                        "subnet-00212e581b04af6ee",
                        "subnet-0d47fd735f5035e47"
                    ],
                    "securityGroups": [
                        "sg-0439ac82bbca00d99"
                    ],
                    "assignPublicIp": "ENABLED"
                }
            },
            "healthCheckGracePeriodSeconds": 0,
            "schedulingStrategy": "REPLICA",
            "deploymentController": {
                "type": "ECS"
            },
            "createdBy": "arn:aws:iam::999999999999:user/admin",
            "enableECSManagedTags": false,
            "propagateTags": "NONE",
            "enableExecuteCommand": false
        }
    ],
    "failures": []
}

クラスター内サービス一覧

コマンド
# サービス一覧
aws ecs list-services \
    --cluster ${CLUSTER_NAME}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # サービス一覧
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs list-services \
>     --cluster ${CLUSTER_NAME}
{
    "serviceArns": [
        "arn:aws:ecs:ap-northeast-1:999999999999:service/h4b-ecs-cluster/h4b-ecs-service"
    ]
}

タスクリストの確認

コマンド
# タスクリストの確認
aws ecs list-tasks \
    --cluster ${CLUSTER_NAME} \
    --service-name ${SERVICE_NAME}

# タスクリストの取得
TASK_LISTS=$(
    aws ecs list-tasks \
    --cluster ${CLUSTER_NAME} \
    --service-name ${SERVICE_NAME} \
    --query taskArns \
    --output text
) \
&& echo ${TASK_LISTS}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスクリストの確認
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs list-tasks \
>     --cluster ${CLUSTER_NAME} \
>     --service-name ${SERVICE_NAME}
{
    "taskArns": [
        "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c",
        "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c"
    ]
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # タスクリストの取得
[cloudshell-user@ip-10-132-94-73 ~]$ TASK_LISTS=$(
>     aws ecs list-tasks \
>     --cluster ${CLUSTER_NAME} \
>     --service-name ${SERVICE_NAME} \
>     --query taskArns \
>     --output text
> ) \
> && echo ${TASK_LISTS}
arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c

タスク詳細の確認

コマンド
# タスク詳細の確認
aws ecs describe-tasks \
    --cluster ${CLUSTER_NAME} \
    --tasks ${TASK_LISTS} \
    --no-cli-pager

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク詳細の確認
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs describe-tasks \
>     --cluster ${CLUSTER_NAME} \
>     --tasks ${TASK_LISTS} \
>     --no-cli-pager
{
    "tasks": [
        {
            "attachments": [
                {
                    "id": "08b1ce55-2d34-4baa-91fe-80214bcd5c10",
                    "type": "ElasticNetworkInterface",
                    "status": "ATTACHED",
                    "details": [
                        {
                            "name": "subnetId",
                            "value": "subnet-00212e581b04af6ee"
                        },
                        {
                            "name": "networkInterfaceId",
                            "value": "eni-09bfdad6866cb6295"
                        },
                        {
                            "name": "macAddress",
                            "value": "06:43:c7:bc:69:b7"
                        },
                        {
                            "name": "privateIPv4Address",
                            "value": "10.0.13.115"
                        }
                    ]
                }
            ],
            "attributes": [
                {
                    "name": "ecs.cpu-architecture",
                    "value": "x86_64"
                }
            ],
            "availabilityZone": "ap-northeast-1a",
            "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
            "connectivity": "CONNECTED",
            "connectivityAt": "2024-09-01T04:12:43.823000+00:00",
            "containers": [
                {
                    "containerArn": "arn:aws:ecs:ap-northeast-1:999999999999:container/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c/4797e8e3-6b3a-402a-ae40-b3b9a0c1e980",
                    "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c",
                    "name": "apache-helloworld",
                    "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld@sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7",
                    "imageDigest": "sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7",
                    "runtimeId": "37dd830477fc4f5b8e11bbdfac88ae8c-860549998",
                    "lastStatus": "RUNNING",
                    "networkBindings": [],
                    "networkInterfaces": [
                        {
                            "attachmentId": "08b1ce55-2d34-4baa-91fe-80214bcd5c10",
                            "privateIpv4Address": "10.0.13.115"
                        }
                    ],
                    "healthStatus": "UNKNOWN",
                    "cpu": "0"
                }
            ],
            "cpu": "1024",
            "createdAt": "2024-09-01T04:12:39.953000+00:00",
            "desiredStatus": "RUNNING",
            "enableExecuteCommand": false,
            "group": "service:h4b-ecs-service",
            "healthStatus": "UNKNOWN",
            "lastStatus": "RUNNING",
            "launchType": "FARGATE",
            "memory": "3072",
            "overrides": {
                "containerOverrides": [
                    {
                        "name": "apache-helloworld"
                    }
                ],
                "inferenceAcceleratorOverrides": []
            },
            "platformVersion": "1.4.0",
            "platformFamily": "Linux",
            "pullStartedAt": "2024-09-01T04:12:50.738000+00:00",
            "pullStoppedAt": "2024-09-01T04:12:59.740000+00:00",
            "startedAt": "2024-09-01T04:13:11.382000+00:00",
            "startedBy": "ecs-svc/2975423510966026190",
            "tags": [],
            "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c",
            "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
            "version": 4,
            "ephemeralStorage": {
                "sizeInGiB": 20
            },
            "fargateEphemeralStorage": {
                "sizeInGiB": 20
            }
        },
        {
            "attachments": [
                {
                    "id": "3c68c53e-a087-41a4-99a7-7e290d06646a",
                    "type": "ElasticNetworkInterface",
                    "status": "ATTACHED",
                    "details": [
                        {
                            "name": "subnetId",
                            "value": "subnet-0d47fd735f5035e47"
                        },
                        {
                            "name": "networkInterfaceId",
                            "value": "eni-0e2aec3c63efa1abf"
                        },
                        {
                            "name": "macAddress",
                            "value": "0a:b1:89:d3:4a:f5"
                        },
                        {
                            "name": "privateIPv4Address",
                            "value": "10.0.16.55"
                        }
                    ]
                }
            ],
            "attributes": [
                {
                    "name": "ecs.cpu-architecture",
                    "value": "x86_64"
                }
            ],
            "availabilityZone": "ap-northeast-1c",
            "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
            "connectivity": "CONNECTED",
            "connectivityAt": "2024-09-01T04:11:45.072000+00:00",
            "containers": [
                {
                    "containerArn": "arn:aws:ecs:ap-northeast-1:999999999999:container/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c/79371dae-14ff-4567-9449-d093df27a8cf",
                    "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c",
                    "name": "apache-helloworld",
                    "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1",
                    "imageDigest": "sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7",
                    "runtimeId": "96f27181cb8e480793a548b98447e44c-860549998",
                    "lastStatus": "RUNNING",
                    "networkBindings": [],
                    "networkInterfaces": [
                        {
                            "attachmentId": "3c68c53e-a087-41a4-99a7-7e290d06646a",
                            "privateIpv4Address": "10.0.16.55"
                        }
                    ],
                    "healthStatus": "UNKNOWN",
                    "cpu": "0"
                }
            ],
            "cpu": "1024",
            "createdAt": "2024-09-01T04:11:41.378000+00:00",
            "desiredStatus": "RUNNING",
            "enableExecuteCommand": false,
            "group": "service:h4b-ecs-service",
            "healthStatus": "UNKNOWN",
            "lastStatus": "RUNNING",
            "launchType": "FARGATE",
            "memory": "3072",
            "overrides": {
                "containerOverrides": [
                    {
                        "name": "apache-helloworld"
                    }
                ],
                "inferenceAcceleratorOverrides": []
            },
            "platformVersion": "1.4.0",
            "platformFamily": "Linux",
            "pullStartedAt": "2024-09-01T04:12:00.423000+00:00",
            "pullStoppedAt": "2024-09-01T04:12:06.322000+00:00",
            "startedAt": "2024-09-01T04:12:28.976000+00:00",
            "startedBy": "ecs-svc/2975423510966026190",
            "tags": [],
            "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c",
            "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
            "version": 5,
            "ephemeralStorage": {
                "sizeInGiB": 20
            },
            "fargateEphemeralStorage": {
                "sizeInGiB": 20
            }
        }
    ],
    "failures": []
}

サービスのDNS名を取得

コマンド
# サービスのDNS名を取得
SERVICE_URL=$(
    aws elbv2 describe-load-balancers \
        --load-balancer-arn ${LB_ARN} \
        --query 'LoadBalancers[].DNSName' \
        --output text
) \
&& echo ${SERVICE_URL}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # サービスのDNS名を取得
[cloudshell-user@ip-10-132-94-73 ~]$ SERVICE_URL=$(
>     aws elbv2 describe-load-balancers \
>         --load-balancer-arn ${LB_ARN} \
>         --query 'LoadBalancers[].DNSName' \
>         --output text
> ) \
> && echo ${SERVICE_URL}
h4b-ecs-alb-2111226423.ap-northeast-1.elb.amazonaws.com

アクセス確認

コマンド
curl ${SERVICE_URL}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ curl ${SERVICE_URL}
Hello World!

サービスイベント確認

コマンド
aws ecs describe-services \
    --cluster ${CLUSTER_NAME} \
    --services ${SERVICE_NAME} \
    --query 'services[0].events[*].[id, createdAt, message]' \
    --output table

出力
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs describe-services \
>     --cluster ${CLUSTER_NAME} \
>     --services ${SERVICE_NAME} \
>     --query 'services[0].events[*].[id, createdAt, message]' \
>     --output table
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                                                     DescribeServices                                                                                                                     |
+--------------------------------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  b1d2cf97-622c-4dc1-9bf7-30b2be8ebcec|  2024-09-01T04:13:26.555000+00:00 |  (service h4b-ecs-service) has reached a steady state.                                                                                                                        |
|  68fc1a52-add2-4bd9-bec7-1b94f352d9bc|  2024-09-01T04:13:26.554000+00:00 |  (service h4b-ecs-service) (deployment ecs-svc/2975423510966026190) deployment completed.                                                                                     |
|  5f6758fd-977b-4811-b9c6-8033c98e85bf|  2024-09-01T04:13:07.843000+00:00 |  (service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)   |
|  712ea0fb-172a-41e5-aff3-3aa2c148bc31|  2024-09-01T04:12:40.035000+00:00 |  (service h4b-ecs-service) has started 1 tasks: (task 37dd830477fc4f5b8e11bbdfac88ae8c).                                                                                      |
|  e18f719e-c9b0-40ae-a618-49f6b3b0c277|  2024-09-01T04:12:20.525000+00:00 |  (service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)   |
|  c9a01a56-f61c-4a48-8b0b-871a6400cad4|  2024-09-01T04:11:41.475000+00:00 |  (service h4b-ecs-service) has started 1 tasks: (task 96f27181cb8e480793a548b98447e44c).                                                                                      |
+--------------------------------------+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

09 コンテナの自動復旧、スケールアウトをやってみる

タスク1のアクセス確認

コマンド
# タスク1 ID抽出
TASK1_ID=$(echo ${TASK_LISTS} | awk '{print $1}') \
&& echo ${TASK1_ID}

# タスク1のインタフェースID取得
NETWORK_INTERFACE1_ID=$(
    aws ecs describe-tasks \
        --cluster ${CLUSTER_NAME} \
        --tasks ${TASK1_ID} \
        --query 'tasks[].attachments[].details[?name==`networkInterfaceId`].value' \
        --output text
) \
&& echo ${NETWORK_INTERFACE1_ID} 

# タスク1のパブリックIP取得
TASK1_PUBLIC_IP=$(
    aws ec2 describe-network-interfaces \
        --network-interface-ids ${NETWORK_INTERFACE1_ID}  \
        --query 'NetworkInterfaces[].Association.PublicIp' \
        --output text
) \
&& echo ${TASK1_PUBLIC_IP}
 
# タスク1のアクセス確認
curl ${TASK1_PUBLIC_IP}
 
出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク1 ID抽出
[cloudshell-user@ip-10-132-94-73 ~]$ TASK1_ID=$(echo ${TASK_LISTS} | awk '{print $1}') \
> && echo ${TASK1_ID}
arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク1のインタフェースID取得
[cloudshell-user@ip-10-132-94-73 ~]$ NETWORK_INTERFACE1_ID=$(
>     aws ecs describe-tasks \
>         --cluster ${CLUSTER_NAME} \
>         --tasks ${TASK1_ID} \
>         --query 'tasks[].attachments[].details[?name==`networkInterfaceId`].value' \
>         --output text
> ) \
> && echo ${NETWORK_INTERFACE1_ID} 
eni-09bfdad6866cb6295
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク1のパブリックIP取得
[cloudshell-user@ip-10-132-94-73 ~]$ TASK1_PUBLIC_IP=$(
>     aws ec2 describe-network-interfaces \
>         --network-interface-ids ${NETWORK_INTERFACE1_ID}  \
>         --query 'NetworkInterfaces[].Association.PublicIp' \
>         --output text
> ) \
> && echo ${TASK1_PUBLIC_IP}
43.207.235.181
[cloudshell-user@ip-10-132-94-73 ~]$  
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク1のアクセス確認
[cloudshell-user@ip-10-132-94-73 ~]$ curl ${TASK1_PUBLIC_IP}
Hello World!

タスク2のアクセス確認

コマンド
# タスク2 ID抽出
TASK2_ID=$(echo ${TASK_LISTS} | awk '{print $2}') \
&& echo ${TASK2_ID}

# タスク1のインタフェースID取得
NETWORK_INTERFACE2_ID=$(
    aws ecs describe-tasks \
        --cluster ${CLUSTER_NAME} \
        --tasks ${TASK2_ID} \
        --query 'tasks[].attachments[].details[?name==`networkInterfaceId`].value' \
        --output text
) \
&& echo ${NETWORK_INTERFACE2_ID} 

# タスク1のパブリックIP取得
TASK2_PUBLIC_IP=$(
    aws ec2 describe-network-interfaces \
        --network-interface-ids ${NETWORK_INTERFACE2_ID}  \
        --query 'NetworkInterfaces[].Association.PublicIp' \
        --output text
) \
&& echo ${TASK2_PUBLIC_IP}
 
# タスク1のアクセス確認
curl ${TASK2_PUBLIC_IP}
 
出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク2 ID抽出
[cloudshell-user@ip-10-132-94-73 ~]$ TASK2_ID=$(echo ${TASK_LISTS} | awk '{print $2}') \
> && echo ${TASK2_ID}
arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク1のインタフェースID取得
[cloudshell-user@ip-10-132-94-73 ~]$ NETWORK_INTERFACE2_ID=$(
>     aws ecs describe-tasks \
>         --cluster ${CLUSTER_NAME} \
>         --tasks ${TASK2_ID} \
>         --query 'tasks[].attachments[].details[?name==`networkInterfaceId`].value' \
>         --output text
> ) \
> && echo ${NETWORK_INTERFACE2_ID} 
eni-0e2aec3c63efa1abf
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク1のパブリックIP取得
[cloudshell-user@ip-10-132-94-73 ~]$ TASK2_PUBLIC_IP=$(
>     aws ec2 describe-network-interfaces \
>         --network-interface-ids ${NETWORK_INTERFACE2_ID}  \
>         --query 'NetworkInterfaces[].Association.PublicIp' \
>         --output text
> ) \
> && echo ${TASK2_PUBLIC_IP}
43.207.59.249
[cloudshell-user@ip-10-132-94-73 ~]$  
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク1のアクセス確認
[cloudshell-user@ip-10-132-94-73 ~]$ curl ${TASK2_PUBLIC_IP}
Hello World!

疑似障害

疎通確認 (別タブで実施)

  • uriは適宜変更
  • ステータスコードを返すようにコマンドを変更
コマンド
url=h4b-ecs-alb-2111226423.ap-northeast-1.elb.amazonaws.com
while true; do echo -n "$(date) "; curl -o /dev/null -s -w "%{http_code}\n" ${url}; sleep 1s; done

出力
[cloudshell-user@ip-10-132-94-73 ~]$ url=h4b-ecs-alb-2111226423.ap-northeast-1.elb.amazonaws.com
[cloudshell-user@ip-10-132-94-73 ~]$ while true; do echo -n "$(date) "; curl -o /dev/null -s -w "%{http_code}\n" ${url}; sleep 1s; done
Sun Sep  1 05:01:45 AM UTC 2024 200
Sun Sep  1 05:01:46 AM UTC 2024 200
Sun Sep  1 05:01:47 AM UTC 2024 200
Sun Sep  1 05:01:48 AM UTC 2024 200
Sun Sep  1 05:01:50 AM UTC 2024 200
Sun Sep  1 05:01:51 AM UTC 2024 200
Sun Sep  1 05:01:52 AM UTC 2024 200
Sun Sep  1 05:01:53 AM UTC 2024 200
Sun Sep  1 05:01:54 AM UTC 2024 200
Sun Sep  1 05:01:55 AM UTC 2024 200
Sun Sep  1 05:01:56 AM UTC 2024 200
Sun Sep  1 05:01:57 AM UTC 2024 200
Sun Sep  1 05:01:58 AM UTC 2024 200
Sun Sep  1 05:01:59 AM UTC 2024 200
Sun Sep  1 05:02:00 AM UTC 2024 200
Sun Sep  1 05:02:01 AM UTC 2024 200
Sun Sep  1 05:02:02 AM UTC 2024 200
Sun Sep  1 05:02:03 AM UTC 2024 200
Sun Sep  1 05:02:04 AM UTC 2024 200
Sun Sep  1 05:02:05 AM UTC 2024 200
Sun Sep  1 05:02:06 AM UTC 2024 200
Sun Sep  1 05:02:07 AM UTC 2024 200
Sun Sep  1 05:02:08 AM UTC 2024 200
Sun Sep  1 05:02:09 AM UTC 2024 200
Sun Sep  1 05:02:10 AM UTC 2024 200
Sun Sep  1 05:02:11 AM UTC 2024 200
Sun Sep  1 05:02:12 AM UTC 2024 200
Sun Sep  1 05:02:13 AM UTC 2024 200
Sun Sep  1 05:02:14 AM UTC 2024 200
Sun Sep  1 05:02:15 AM UTC 2024 200
Sun Sep  1 05:02:16 AM UTC 2024 200
Sun Sep  1 05:02:17 AM UTC 2024 200
Sun Sep  1 05:02:18 AM UTC 2024 200
Sun Sep  1 05:02:19 AM UTC 2024 200
Sun Sep  1 05:02:20 AM UTC 2024 200
Sun Sep  1 05:02:21 AM UTC 2024 200
Sun Sep  1 05:02:22 AM UTC 2024 200
Sun Sep  1 05:02:23 AM UTC 2024 200
Sun Sep  1 05:02:24 AM UTC 2024 200
Sun Sep  1 05:02:25 AM UTC 2024 200
Sun Sep  1 05:02:26 AM UTC 2024 200
Sun Sep  1 05:02:27 AM UTC 2024 200
Sun Sep  1 05:02:28 AM UTC 2024 200
Sun Sep  1 05:02:29 AM UTC 2024 200
Sun Sep  1 05:02:30 AM UTC 2024 200
Sun Sep  1 05:02:31 AM UTC 2024 200
Sun Sep  1 05:02:32 AM UTC 2024 200
Sun Sep  1 05:02:34 AM UTC 2024 200
Sun Sep  1 05:02:35 AM UTC 2024 200
Sun Sep  1 05:02:36 AM UTC 2024 200
Sun Sep  1 05:02:37 AM UTC 2024 200
Sun Sep  1 05:02:38 AM UTC 2024 200
Sun Sep  1 05:02:39 AM UTC 2024 200
Sun Sep  1 05:02:40 AM UTC 2024 200
Sun Sep  1 05:02:41 AM UTC 2024 200
Sun Sep  1 05:02:42 AM UTC 2024 200
Sun Sep  1 05:02:43 AM UTC 2024 200
Sun Sep  1 05:02:44 AM UTC 2024 200
Sun Sep  1 05:02:45 AM UTC 2024 200
Sun Sep  1 05:02:46 AM UTC 2024 200
Sun Sep  1 05:02:47 AM UTC 2024 200
Sun Sep  1 05:02:48 AM UTC 2024 200
Sun Sep  1 05:02:49 AM UTC 2024 200
Sun Sep  1 05:02:50 AM UTC 2024 200
Sun Sep  1 05:02:51 AM UTC 2024 200
Sun Sep  1 05:02:52 AM UTC 2024 200
Sun Sep  1 05:02:53 AM UTC 2024 200
Sun Sep  1 05:02:54 AM UTC 2024 200
Sun Sep  1 05:02:55 AM UTC 2024 200
Sun Sep  1 05:02:56 AM UTC 2024 200
Sun Sep  1 05:02:57 AM UTC 2024 200
Sun Sep  1 05:02:58 AM UTC 2024 200
Sun Sep  1 05:02:59 AM UTC 2024 200
Sun Sep  1 05:03:00 AM UTC 2024 200
Sun Sep  1 05:03:01 AM UTC 2024 200
Sun Sep  1 05:03:02 AM UTC 2024 200
Sun Sep  1 05:03:03 AM UTC 2024 200
Sun Sep  1 05:03:04 AM UTC 2024 200
Sun Sep  1 05:03:05 AM UTC 2024 200
Sun Sep  1 05:03:06 AM UTC 2024 200
Sun Sep  1 05:03:07 AM UTC 2024 200
Sun Sep  1 05:03:08 AM UTC 2024 200
Sun Sep  1 05:03:09 AM UTC 2024 200
Sun Sep  1 05:03:11 AM UTC 2024 200
Sun Sep  1 05:03:12 AM UTC 2024 200
Sun Sep  1 05:03:13 AM UTC 2024 200
Sun Sep  1 05:03:14 AM UTC 2024 200
Sun Sep  1 05:03:15 AM UTC 2024 200
Sun Sep  1 05:03:16 AM UTC 2024 200
Sun Sep  1 05:03:17 AM UTC 2024 200
Sun Sep  1 05:03:18 AM UTC 2024 200
Sun Sep  1 05:03:19 AM UTC 2024 200
Sun Sep  1 05:03:20 AM UTC 2024 200
Sun Sep  1 05:03:21 AM UTC 2024 200
Sun Sep  1 05:03:22 AM UTC 2024 200
Sun Sep  1 05:03:23 AM UTC 2024 200
Sun Sep  1 05:03:24 AM UTC 2024 200
Sun Sep  1 05:03:25 AM UTC 2024 200
Sun Sep  1 05:03:26 AM UTC 2024 200
Sun Sep  1 05:03:27 AM UTC 2024 200
Sun Sep  1 05:03:28 AM UTC 2024 200
Sun Sep  1 05:03:29 AM UTC 2024 200
Sun Sep  1 05:03:30 AM UTC 2024 200
Sun Sep  1 05:03:31 AM UTC 2024 200
Sun Sep  1 05:03:32 AM UTC 2024 200
Sun Sep  1 05:03:33 AM UTC 2024 200
Sun Sep  1 05:03:34 AM UTC 2024 200
Sun Sep  1 05:03:35 AM UTC 2024 200
Sun Sep  1 05:03:36 AM UTC 2024 200
Sun Sep  1 05:03:37 AM UTC 2024 200
Sun Sep  1 05:03:38 AM UTC 2024 200
Sun Sep  1 05:03:39 AM UTC 2024 200
Sun Sep  1 05:03:40 AM UTC 2024 200
Sun Sep  1 05:03:41 AM UTC 2024 200
Sun Sep  1 05:03:42 AM UTC 2024 200
Sun Sep  1 05:03:43 AM UTC 2024 200
Sun Sep  1 05:03:44 AM UTC 2024 200
Sun Sep  1 05:03:45 AM UTC 2024 200
Sun Sep  1 05:03:46 AM UTC 2024 200
Sun Sep  1 05:03:47 AM UTC 2024 200
Sun Sep  1 05:03:48 AM UTC 2024 200
Sun Sep  1 05:03:49 AM UTC 2024 200
Sun Sep  1 05:03:50 AM UTC 2024 200
Sun Sep  1 05:03:52 AM UTC 2024 200
Sun Sep  1 05:03:53 AM UTC 2024 200
Sun Sep  1 05:03:54 AM UTC 2024 200
Sun Sep  1 05:03:55 AM UTC 2024 200
Sun Sep  1 05:03:56 AM UTC 2024 200
Sun Sep  1 05:03:57 AM UTC 2024 200
Sun Sep  1 05:03:58 AM UTC 2024 200
Sun Sep  1 05:03:59 AM UTC 2024 200
Sun Sep  1 05:04:00 AM UTC 2024 200
Sun Sep  1 05:04:01 AM UTC 2024 200
Sun Sep  1 05:04:02 AM UTC 2024 200
Sun Sep  1 05:04:03 AM UTC 2024 200
Sun Sep  1 05:04:04 AM UTC 2024 200
Sun Sep  1 05:04:05 AM UTC 2024 200
Sun Sep  1 05:04:06 AM UTC 2024 200
Sun Sep  1 05:04:07 AM UTC 2024 200
Sun Sep  1 05:04:08 AM UTC 2024 200
Sun Sep  1 05:04:09 AM UTC 2024 200
Sun Sep  1 05:04:10 AM UTC 2024 200
^C

タスク停止

コマンド
aws ecs stop-task \
    --cluster ${CLUSTER_NAME} \
    --task ${TASK1_ID} \
    --no-cli-pager

出力
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs stop-task \
>     --cluster ${CLUSTER_NAME} \
>     --task ${TASK1_ID} \
>     --no-cli-pager
{
    "task": {
        "attachments": [
            {
                "id": "08b1ce55-2d34-4baa-91fe-80214bcd5c10",
                "type": "ElasticNetworkInterface",
                "status": "ATTACHED",
                "details": [
                    {
                        "name": "subnetId",
                        "value": "subnet-00212e581b04af6ee"
                    },
                    {
                        "name": "networkInterfaceId",
                        "value": "eni-09bfdad6866cb6295"
                    },
                    {
                        "name": "macAddress",
                        "value": "06:43:c7:bc:69:b7"
                    },
                    {
                        "name": "privateIPv4Address",
                        "value": "10.0.13.115"
                    }
                ]
            }
        ],
        "attributes": [
            {
                "name": "ecs.cpu-architecture",
                "value": "x86_64"
            }
        ],
        "availabilityZone": "ap-northeast-1a",
        "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
        "connectivity": "CONNECTED",
        "connectivityAt": "2024-09-01T04:12:43.823000+00:00",
        "containers": [
            {
                "containerArn": "arn:aws:ecs:ap-northeast-1:999999999999:container/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c/4797e8e3-6b3a-402a-ae40-b3b9a0c1e980",
                "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c",
                "name": "apache-helloworld",
                "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld@sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7",
                "imageDigest": "sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7",
                "runtimeId": "37dd830477fc4f5b8e11bbdfac88ae8c-860549998",
                "lastStatus": "RUNNING",
                "networkBindings": [],
                "networkInterfaces": [
                    {
                        "attachmentId": "08b1ce55-2d34-4baa-91fe-80214bcd5c10",
                        "privateIpv4Address": "10.0.13.115"
                    }
                ],
                "cpu": "0"
            }
        ],
        "cpu": "1024",
        "createdAt": "2024-09-01T04:12:39.953000+00:00",
        "desiredStatus": "STOPPED",
        "enableExecuteCommand": false,
        "group": "service:h4b-ecs-service",
        "lastStatus": "DEACTIVATING",
        "launchType": "FARGATE",
        "memory": "3072",
        "overrides": {
            "containerOverrides": [
                {
                    "name": "apache-helloworld"
                }
            ],
            "inferenceAcceleratorOverrides": []
        },
        "platformVersion": "1.4.0",
        "platformFamily": "Linux",
        "pullStartedAt": "2024-09-01T04:12:50.738000+00:00",
        "pullStoppedAt": "2024-09-01T04:12:59.740000+00:00",
        "startedAt": "2024-09-01T04:13:11.382000+00:00",
        "startedBy": "ecs-svc/2975423510966026190",
        "stopCode": "UserInitiated",
        "stoppedReason": "Task stopped by user",
        "stoppingAt": "2024-09-01T05:01:55.964000+00:00",
        "tags": [],
        "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c",
        "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
        "version": 5,
        "ephemeralStorage": {
            "sizeInGiB": 20
        },
        "fargateEphemeralStorage": {
            "sizeInGiB": 20
        }
    }
}

サービスイベント確認

コマンド
aws ecs describe-services \
    --cluster ${CLUSTER_NAME} \
    --services ${SERVICE_NAME} \
    --query 'services[0].events[*].[id, createdAt, message]' \
    --output table

出力
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs describe-services \
>     --cluster ${CLUSTER_NAME} \
>     --services ${SERVICE_NAME} \
>     --query 'services[0].events[*].[id, createdAt, message]' \
>     --output table
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                                                      DescribeServices                                                                                                                      |
+--------------------------------------+-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  80c028aa-5078-4ebe-88af-e5ba135d7db8|  2024-09-01T05:02:58.648000+00:00 |  (service h4b-ecs-service) has reached a steady state.                                                                                                                          |
|  8e9176e5-575e-48b0-ba0a-40fc14c2514b|  2024-09-01T05:02:39.799000+00:00 |  (service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)     |
|  d77b77f4-2699-4deb-a612-e56176cb63f9|  2024-09-01T05:02:11.809000+00:00 |  (service h4b-ecs-service) has started 1 tasks: (task ff8e2c9646954b76ac57c5d04f6a6c7b).                                                                                        |
|  05097688-0581-4af3-ad2a-85ec1c0e24f1|  2024-09-01T05:02:10.659000+00:00 |  (service h4b-ecs-service, taskSet ecs-svc/2975423510966026190) has begun draining connections on 1 tasks.                                                                      |
|  b32998eb-cc08-4d18-b0d0-8ba77c37515b|  2024-09-01T05:02:10.653000+00:00 |  (service h4b-ecs-service) deregistered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)   |
|  b1d2cf97-622c-4dc1-9bf7-30b2be8ebcec|  2024-09-01T04:13:26.555000+00:00 |  (service h4b-ecs-service) has reached a steady state.                                                                                                                          |
|  68fc1a52-add2-4bd9-bec7-1b94f352d9bc|  2024-09-01T04:13:26.554000+00:00 |  (service h4b-ecs-service) (deployment ecs-svc/2975423510966026190) deployment completed.                                                                                       |
|  5f6758fd-977b-4811-b9c6-8033c98e85bf|  2024-09-01T04:13:07.843000+00:00 |  (service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)     |
|  712ea0fb-172a-41e5-aff3-3aa2c148bc31|  2024-09-01T04:12:40.035000+00:00 |  (service h4b-ecs-service) has started 1 tasks: (task 37dd830477fc4f5b8e11bbdfac88ae8c).                                                                                        |
|  e18f719e-c9b0-40ae-a618-49f6b3b0c277|  2024-09-01T04:12:20.525000+00:00 |  (service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)     |
|  c9a01a56-f61c-4a48-8b0b-871a6400cad4|  2024-09-01T04:11:41.475000+00:00 |  (service h4b-ecs-service) has started 1 tasks: (task 96f27181cb8e480793a548b98447e44c).                                                                                        |
+--------------------------------------+-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

アクセス確認

コマンド
# タスク1のアクセス確認
curl ${TASK1_PUBLIC_IP}

# タスク2のアクセス確認
curl ${TASK2_PUBLIC_IP}
出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク1のアクセス確認
[cloudshell-user@ip-10-132-94-73 ~]$ curl ${TASK1_PUBLIC_IP}
^C
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク1のアクセス確認
[cloudshell-user@ip-10-132-94-73 ~]$ curl ${TASK2_PUBLIC_IP}
Hello World!

サービス状態

コマンド
aws ecs describe-services \
    --cluster ${CLUSTER_NAME} \
    --services ${SERVICE_NAME} \
    --no-cli-pager

出力
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs describe-services \
>     --cluster ${CLUSTER_NAME} \
>     --services ${SERVICE_NAME} \
>     --no-cli-pager
{
    "services": [
        {
            "serviceArn": "arn:aws:ecs:ap-northeast-1:999999999999:service/h4b-ecs-cluster/h4b-ecs-service",
            "serviceName": "h4b-ecs-service",
            "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
            "loadBalancers": [
                {
                    "targetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c",
                    "containerName": "apache-helloworld",
                    "containerPort": 80
                }
            ],
            "serviceRegistries": [],
            "status": "ACTIVE",
            "desiredCount": 2,
            "runningCount": 2,
            "pendingCount": 0,
            "launchType": "FARGATE",
            "platformVersion": "LATEST",
            "platformFamily": "Linux",
            "taskDefinition": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
            "deploymentConfiguration": {
                "deploymentCircuitBreaker": {
                    "enable": false,
                    "rollback": false
                },
                "maximumPercent": 200,
                "minimumHealthyPercent": 100
            },
            "deployments": [
                {
                    "id": "ecs-svc/2975423510966026190",
                    "status": "PRIMARY",
                    "taskDefinition": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
                    "desiredCount": 2,
                    "pendingCount": 0,
                    "runningCount": 2,
                    "failedTasks": 0,
                    "createdAt": "2024-09-01T04:11:29.087000+00:00",
                    "updatedAt": "2024-09-01T05:02:58.642000+00:00",
                    "launchType": "FARGATE",
                    "platformVersion": "1.4.0",
                    "platformFamily": "Linux",
                    "networkConfiguration": {
                        "awsvpcConfiguration": {
                            "subnets": [
                                "subnet-00212e581b04af6ee",
                                "subnet-0d47fd735f5035e47"
                            ],
                            "securityGroups": [
                                "sg-0439ac82bbca00d99"
                            ],
                            "assignPublicIp": "ENABLED"
                        }
                    },
                    "rolloutState": "COMPLETED",
                    "rolloutStateReason": "ECS deployment ecs-svc/2975423510966026190 completed."
                }
            ],
            "roleArn": "arn:aws:iam::999999999999:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS",
            "events": [
                {
                    "id": "80c028aa-5078-4ebe-88af-e5ba135d7db8",
                    "createdAt": "2024-09-01T05:02:58.648000+00:00",
                    "message": "(service h4b-ecs-service) has reached a steady state."
                },
                {
                    "id": "8e9176e5-575e-48b0-ba0a-40fc14c2514b",
                    "createdAt": "2024-09-01T05:02:39.799000+00:00",
                    "message": "(service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
                },
                {
                    "id": "d77b77f4-2699-4deb-a612-e56176cb63f9",
                    "createdAt": "2024-09-01T05:02:11.809000+00:00",
                    "message": "(service h4b-ecs-service) has started 1 tasks: (task ff8e2c9646954b76ac57c5d04f6a6c7b)."
                },
                {
                    "id": "05097688-0581-4af3-ad2a-85ec1c0e24f1",
                    "createdAt": "2024-09-01T05:02:10.659000+00:00",
                    "message": "(service h4b-ecs-service, taskSet ecs-svc/2975423510966026190) has begun draining connections on 1 tasks."
                },
                {
                    "id": "b32998eb-cc08-4d18-b0d0-8ba77c37515b",
                    "createdAt": "2024-09-01T05:02:10.653000+00:00",
                    "message": "(service h4b-ecs-service) deregistered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
                },
                {
                    "id": "b1d2cf97-622c-4dc1-9bf7-30b2be8ebcec",
                    "createdAt": "2024-09-01T04:13:26.555000+00:00",
                    "message": "(service h4b-ecs-service) has reached a steady state."
                },
                {
                    "id": "68fc1a52-add2-4bd9-bec7-1b94f352d9bc",
                    "createdAt": "2024-09-01T04:13:26.554000+00:00",
                    "message": "(service h4b-ecs-service) (deployment ecs-svc/2975423510966026190) deployment completed."
                },
                {
                    "id": "5f6758fd-977b-4811-b9c6-8033c98e85bf",
                    "createdAt": "2024-09-01T04:13:07.843000+00:00",
                    "message": "(service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
                },
                {
                    "id": "712ea0fb-172a-41e5-aff3-3aa2c148bc31",
                    "createdAt": "2024-09-01T04:12:40.035000+00:00",
                    "message": "(service h4b-ecs-service) has started 1 tasks: (task 37dd830477fc4f5b8e11bbdfac88ae8c)."
                },
                {
                    "id": "e18f719e-c9b0-40ae-a618-49f6b3b0c277",
                    "createdAt": "2024-09-01T04:12:20.525000+00:00",
                    "message": "(service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
                },
                {
                    "id": "c9a01a56-f61c-4a48-8b0b-871a6400cad4",
                    "createdAt": "2024-09-01T04:11:41.475000+00:00",
                    "message": "(service h4b-ecs-service) has started 1 tasks: (task 96f27181cb8e480793a548b98447e44c)."
                }
            ],
            "createdAt": "2024-09-01T04:11:29.087000+00:00",
            "placementConstraints": [],
            "placementStrategy": [],
            "networkConfiguration": {
                "awsvpcConfiguration": {
                    "subnets": [
                        "subnet-00212e581b04af6ee",
                        "subnet-0d47fd735f5035e47"
                    ],
                    "securityGroups": [
                        "sg-0439ac82bbca00d99"
                    ],
                    "assignPublicIp": "ENABLED"
                }
            },
            "healthCheckGracePeriodSeconds": 0,
            "schedulingStrategy": "REPLICA",
            "deploymentController": {
                "type": "ECS"
            },
            "createdBy": "arn:aws:iam::999999999999:user/admin",
            "enableECSManagedTags": false,
            "propagateTags": "NONE",
            "enableExecuteCommand": false
        }
    ],
    "failures": []
}

タスク状態確認

コマンド
# タスク状態確認
aws ecs describe-tasks \
    --cluster ${CLUSTER_NAME} \
    --tasks ${TASK_LISTS} \
    --no-cli-pager

aws ecs describe-tasks \
    --cluster ${CLUSTER_NAME} \
    --tasks ${TASK_LISTS} \
    --query 'tasks[*].[taskArn, lastStatus]' \
    --output text

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク状態確認
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs describe-tasks \
>     --cluster ${CLUSTER_NAME} \
>     --tasks ${TASK_LISTS} \
>     --no-cli-pager
{
    "tasks": [
        {
            "attachments": [
                {
                    "id": "08b1ce55-2d34-4baa-91fe-80214bcd5c10",
                    "type": "ElasticNetworkInterface",
                    "status": "DELETED",
                    "details": [
                        {
                            "name": "subnetId",
                            "value": "subnet-00212e581b04af6ee"
                        },
                        {
                            "name": "networkInterfaceId",
                            "value": "eni-09bfdad6866cb6295"
                        },
                        {
                            "name": "macAddress",
                            "value": "06:43:c7:bc:69:b7"
                        },
                        {
                            "name": "privateIPv4Address",
                            "value": "10.0.13.115"
                        }
                    ]
                }
            ],
            "attributes": [
                {
                    "name": "ecs.cpu-architecture",
                    "value": "x86_64"
                }
            ],
            "availabilityZone": "ap-northeast-1a",
            "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
            "connectivity": "CONNECTED",
            "connectivityAt": "2024-09-01T04:12:43.823000+00:00",
            "containers": [
                {
                    "containerArn": "arn:aws:ecs:ap-northeast-1:999999999999:container/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c/4797e8e3-6b3a-402a-ae40-b3b9a0c1e980",
                    "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c",
                    "name": "apache-helloworld",
                    "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld@sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7",
                    "imageDigest": "sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7",
                    "runtimeId": "37dd830477fc4f5b8e11bbdfac88ae8c-860549998",
                    "lastStatus": "STOPPED",
                    "exitCode": 137,
                    "networkBindings": [],
                    "networkInterfaces": [
                        {
                            "attachmentId": "08b1ce55-2d34-4baa-91fe-80214bcd5c10",
                            "privateIpv4Address": "10.0.13.115"
                        }
                    ],
                    "healthStatus": "UNKNOWN",
                    "cpu": "0"
                }
            ],
            "cpu": "1024",
            "createdAt": "2024-09-01T04:12:39.953000+00:00",
            "desiredStatus": "STOPPED",
            "enableExecuteCommand": false,
            "executionStoppedAt": "2024-09-01T05:08:22.357000+00:00",
            "group": "service:h4b-ecs-service",
            "healthStatus": "UNKNOWN",
            "lastStatus": "STOPPED",
            "launchType": "FARGATE",
            "memory": "3072",
            "overrides": {
                "containerOverrides": [
                    {
                        "name": "apache-helloworld"
                    }
                ],
                "inferenceAcceleratorOverrides": []
            },
            "platformVersion": "1.4.0",
            "platformFamily": "Linux",
            "pullStartedAt": "2024-09-01T04:12:50.738000+00:00",
            "pullStoppedAt": "2024-09-01T04:12:59.740000+00:00",
            "startedAt": "2024-09-01T04:13:11.382000+00:00",
            "startedBy": "ecs-svc/2975423510966026190",
            "stopCode": "UserInitiated",
            "stoppedAt": "2024-09-01T05:08:46.306000+00:00",
            "stoppedReason": "Task stopped by user",
            "stoppingAt": "2024-09-01T05:01:55.964000+00:00",
            "tags": [],
            "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c",
            "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
            "version": 8,
            "ephemeralStorage": {
                "sizeInGiB": 20
            },
            "fargateEphemeralStorage": {
                "sizeInGiB": 20
            }
        },
        {
            "attachments": [
                {
                    "id": "3c68c53e-a087-41a4-99a7-7e290d06646a",
                    "type": "ElasticNetworkInterface",
                    "status": "ATTACHED",
                    "details": [
                        {
                            "name": "subnetId",
                            "value": "subnet-0d47fd735f5035e47"
                        },
                        {
                            "name": "networkInterfaceId",
                            "value": "eni-0e2aec3c63efa1abf"
                        },
                        {
                            "name": "macAddress",
                            "value": "0a:b1:89:d3:4a:f5"
                        },
                        {
                            "name": "privateIPv4Address",
                            "value": "10.0.16.55"
                        }
                    ]
                }
            ],
            "attributes": [
                {
                    "name": "ecs.cpu-architecture",
                    "value": "x86_64"
                }
            ],
            "availabilityZone": "ap-northeast-1c",
            "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
            "connectivity": "CONNECTED",
            "connectivityAt": "2024-09-01T04:11:45.072000+00:00",
            "containers": [
                {
                    "containerArn": "arn:aws:ecs:ap-northeast-1:999999999999:container/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c/79371dae-14ff-4567-9449-d093df27a8cf",
                    "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c",
                    "name": "apache-helloworld",
                    "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1",
                    "imageDigest": "sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7",
                    "runtimeId": "96f27181cb8e480793a548b98447e44c-860549998",
                    "lastStatus": "RUNNING",
                    "networkBindings": [],
                    "networkInterfaces": [
                        {
                            "attachmentId": "3c68c53e-a087-41a4-99a7-7e290d06646a",
                            "privateIpv4Address": "10.0.16.55"
                        }
                    ],
                    "healthStatus": "UNKNOWN",
                    "cpu": "0"
                }
            ],
            "cpu": "1024",
            "createdAt": "2024-09-01T04:11:41.378000+00:00",
            "desiredStatus": "RUNNING",
            "enableExecuteCommand": false,
            "group": "service:h4b-ecs-service",
            "healthStatus": "UNKNOWN",
            "lastStatus": "RUNNING",
            "launchType": "FARGATE",
            "memory": "3072",
            "overrides": {
                "containerOverrides": [
                    {
                        "name": "apache-helloworld"
                    }
                ],
                "inferenceAcceleratorOverrides": []
            },
            "platformVersion": "1.4.0",
            "platformFamily": "Linux",
            "pullStartedAt": "2024-09-01T04:12:00.423000+00:00",
            "pullStoppedAt": "2024-09-01T04:12:06.322000+00:00",
            "startedAt": "2024-09-01T04:12:28.976000+00:00",
            "startedBy": "ecs-svc/2975423510966026190",
            "tags": [],
            "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c",
            "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
            "version": 5,
            "ephemeralStorage": {
                "sizeInGiB": 20
            },
            "fargateEphemeralStorage": {
                "sizeInGiB": 20
            }
        }
    ],
    "failures": []
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs describe-tasks \
>     --cluster ${CLUSTER_NAME} \
>     --tasks ${TASK_LISTS} \
>     --query 'tasks[*].[taskArn, lastStatus]' \
>     --output text
arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/37dd830477fc4f5b8e11bbdfac88ae8c   STOPPED
arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c   RUNNING

タスクリスト更新

コマンド
# タスクリストの確認
aws ecs list-tasks \
    --cluster ${CLUSTER_NAME} \
    --service-name ${SERVICE_NAME}

# タスクリストの取得
TASK_LISTS_AFTER=$(
    aws ecs list-tasks \
    --cluster ${CLUSTER_NAME} \
    --service-name ${SERVICE_NAME} \
    --query taskArns \
    --output text
) \
&& echo ${TASK_LISTS_AFTER}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスクリストの確認
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs list-tasks \
>     --cluster ${CLUSTER_NAME} \
>     --service-name ${SERVICE_NAME}
{
    "taskArns": [
        "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c",
        "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/ff8e2c9646954b76ac57c5d04f6a6c7b"
    ]
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # タスクリストの取得
[cloudshell-user@ip-10-132-94-73 ~]$ TASK_LISTS_AFTER=$(
>     aws ecs list-tasks \
>     --cluster ${CLUSTER_NAME} \
>     --service-name ${SERVICE_NAME} \
>     --query taskArns \
>     --output text
> ) \
> && echo ${TASK_LISTS_AFTER}
arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/ff8e2c9646954b76ac57c5d04f6a6c7b

タスク状態確認

コマンド
# タスク状態確認
aws ecs describe-tasks \
    --cluster ${CLUSTER_NAME} \
    --tasks ${TASK_LISTS_AFTER} \
    --no-cli-pager

aws ecs describe-tasks \
    --cluster ${CLUSTER_NAME} \
    --tasks ${TASK_LISTS_AFTER} \
    --query 'tasks[*].[taskArn, lastStatus]' \
    --output text

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク状態確認
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs describe-tasks \
>     --cluster ${CLUSTER_NAME} \
>     --tasks ${TASK_LISTS_AFTER} \
>     --no-cli-pager
{
    "tasks": [
        {
            "attachments": [
                {
                    "id": "3c68c53e-a087-41a4-99a7-7e290d06646a",
                    "type": "ElasticNetworkInterface",
                    "status": "ATTACHED",
                    "details": [
                        {
                            "name": "subnetId",
                            "value": "subnet-0d47fd735f5035e47"
                        },
                        {
                            "name": "networkInterfaceId",
                            "value": "eni-0e2aec3c63efa1abf"
                        },
                        {
                            "name": "macAddress",
                            "value": "0a:b1:89:d3:4a:f5"
                        },
                        {
                            "name": "privateIPv4Address",
                            "value": "10.0.16.55"
                        }
                    ]
                }
            ],
            "attributes": [
                {
                    "name": "ecs.cpu-architecture",
                    "value": "x86_64"
                }
            ],
            "availabilityZone": "ap-northeast-1c",
            "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
            "connectivity": "CONNECTED",
            "connectivityAt": "2024-09-01T04:11:45.072000+00:00",
            "containers": [
                {
                    "containerArn": "arn:aws:ecs:ap-northeast-1:999999999999:container/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c/79371dae-14ff-4567-9449-d093df27a8cf",
                    "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c",
                    "name": "apache-helloworld",
                    "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1",
                    "imageDigest": "sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7",
                    "runtimeId": "96f27181cb8e480793a548b98447e44c-860549998",
                    "lastStatus": "RUNNING",
                    "networkBindings": [],
                    "networkInterfaces": [
                        {
                            "attachmentId": "3c68c53e-a087-41a4-99a7-7e290d06646a",
                            "privateIpv4Address": "10.0.16.55"
                        }
                    ],
                    "healthStatus": "UNKNOWN",
                    "cpu": "0"
                }
            ],
            "cpu": "1024",
            "createdAt": "2024-09-01T04:11:41.378000+00:00",
            "desiredStatus": "RUNNING",
            "enableExecuteCommand": false,
            "group": "service:h4b-ecs-service",
            "healthStatus": "UNKNOWN",
            "lastStatus": "RUNNING",
            "launchType": "FARGATE",
            "memory": "3072",
            "overrides": {
                "containerOverrides": [
                    {
                        "name": "apache-helloworld"
                    }
                ],
                "inferenceAcceleratorOverrides": []
            },
            "platformVersion": "1.4.0",
            "platformFamily": "Linux",
            "pullStartedAt": "2024-09-01T04:12:00.423000+00:00",
            "pullStoppedAt": "2024-09-01T04:12:06.322000+00:00",
            "startedAt": "2024-09-01T04:12:28.976000+00:00",
            "startedBy": "ecs-svc/2975423510966026190",
            "tags": [],
            "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c",
            "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
            "version": 5,
            "ephemeralStorage": {
                "sizeInGiB": 20
            },
            "fargateEphemeralStorage": {
                "sizeInGiB": 20
            }
        },
        {
            "attachments": [
                {
                    "id": "0f394aa5-7e67-4443-902c-0e18c4f1bf71",
                    "type": "ElasticNetworkInterface",
                    "status": "ATTACHED",
                    "details": [
                        {
                            "name": "subnetId",
                            "value": "subnet-00212e581b04af6ee"
                        },
                        {
                            "name": "networkInterfaceId",
                            "value": "eni-065df50311438e44c"
                        },
                        {
                            "name": "macAddress",
                            "value": "06:72:db:58:24:4f"
                        },
                        {
                            "name": "privateIPv4Address",
                            "value": "10.0.2.231"
                        }
                    ]
                }
            ],
            "attributes": [
                {
                    "name": "ecs.cpu-architecture",
                    "value": "x86_64"
                }
            ],
            "availabilityZone": "ap-northeast-1a",
            "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
            "connectivity": "CONNECTED",
            "connectivityAt": "2024-09-01T05:02:16.114000+00:00",
            "containers": [
                {
                    "containerArn": "arn:aws:ecs:ap-northeast-1:999999999999:container/h4b-ecs-cluster/ff8e2c9646954b76ac57c5d04f6a6c7b/9da3e2b5-ab18-4664-8dc1-9815f699fbe4",
                    "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/ff8e2c9646954b76ac57c5d04f6a6c7b",
                    "name": "apache-helloworld",
                    "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld@sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7",
                    "imageDigest": "sha256:0cdafbfa1b5674149472ef708caec511a42e929e83c2ae980908311a92f02cb7",
                    "runtimeId": "ff8e2c9646954b76ac57c5d04f6a6c7b-860549998",
                    "lastStatus": "RUNNING",
                    "networkBindings": [],
                    "networkInterfaces": [
                        {
                            "attachmentId": "0f394aa5-7e67-4443-902c-0e18c4f1bf71",
                            "privateIpv4Address": "10.0.2.231"
                        }
                    ],
                    "healthStatus": "UNKNOWN",
                    "cpu": "0"
                }
            ],
            "cpu": "1024",
            "createdAt": "2024-09-01T05:02:11.703000+00:00",
            "desiredStatus": "RUNNING",
            "enableExecuteCommand": false,
            "group": "service:h4b-ecs-service",
            "healthStatus": "UNKNOWN",
            "lastStatus": "RUNNING",
            "launchType": "FARGATE",
            "memory": "3072",
            "overrides": {
                "containerOverrides": [
                    {
                        "name": "apache-helloworld"
                    }
                ],
                "inferenceAcceleratorOverrides": []
            },
            "platformVersion": "1.4.0",
            "platformFamily": "Linux",
            "pullStartedAt": "2024-09-01T05:02:25.144000+00:00",
            "pullStoppedAt": "2024-09-01T05:02:32.607000+00:00",
            "startedAt": "2024-09-01T05:02:42.275000+00:00",
            "startedBy": "ecs-svc/2975423510966026190",
            "tags": [],
            "taskArn": "arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/ff8e2c9646954b76ac57c5d04f6a6c7b",
            "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
            "version": 4,
            "ephemeralStorage": {
                "sizeInGiB": 20
            },
            "fargateEphemeralStorage": {
                "sizeInGiB": 20
            }
        }
    ],
    "failures": []
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs describe-tasks \
>     --cluster ${CLUSTER_NAME} \
>     --tasks ${TASK_LISTS_AFTER} \
>     --query 'tasks[*].[taskArn, lastStatus]' \
>     --output text
arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/96f27181cb8e480793a548b98447e44c   RUNNING
arn:aws:ecs:ap-northeast-1:999999999999:task/h4b-ecs-cluster/ff8e2c9646954b76ac57c5d04f6a6c7b   RUNNING

タスク数追加

タスク数追加

コマンド
# タスク数追加
aws ecs update-service \
    --cluster ${CLUSTER_NAME} \
    --service ${SERVICE_NAME} \
    --desired-count 3 \
    --no-cli-pager

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク数追加
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs update-service \
>     --cluster ${CLUSTER_NAME} \
>     --service ${SERVICE_NAME} \
>     --desired-count 3
{
    "service": {
        "serviceArn": "arn:aws:ecs:ap-northeast-1:999999999999:service/h4b-ecs-cluster/h4b-ecs-service",
        "serviceName": "h4b-ecs-service",
        "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
        "loadBalancers": [
            {
                "targetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c",
                "containerName": "apache-helloworld",
                "containerPort": 80
            }
        ],
        "serviceRegistries": [],
        "status": "ACTIVE",
        "desiredCount": 3,
        "runningCount": 2,
        "pendingCount": 0,
        "launchType": "FARGATE",
        "platformVersion": "LATEST",
        "platformFamily": "Linux",
        "taskDefinition": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
        "deploymentConfiguration": {
            "deploymentCircuitBreaker": {
                "enable": false,
                "rollback": false
            },
            "maximumPercent": 200,
            "minimumHealthyPercent": 100
        },
        "deployments": [
            {
                "id": "ecs-svc/2975423510966026190",
                "status": "PRIMARY",
                "taskDefinition": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
                "desiredCount": 2,
                "pendingCount": 0,
                "runningCount": 2,
                "failedTasks": 0,
                "createdAt": "2024-09-01T04:11:29.087000+00:00",
                "updatedAt": "2024-09-01T05:02:58.642000+00:00",
                "launchType": "FARGATE",
                "platformVersion": "1.4.0",
                "platformFamily": "Linux",
                "networkConfiguration": {
                    "awsvpcConfiguration": {
                        "subnets": [
                            "subnet-00212e581b04af6ee",
                            "subnet-0d47fd735f5035e47"
                        ],
                        "securityGroups": [
                            "sg-0439ac82bbca00d99"
                        ],
                        "assignPublicIp": "ENABLED"
                    }
                },
                "rolloutState": "COMPLETED",
                "rolloutStateReason": "ECS deployment ecs-svc/2975423510966026190 completed."
            }
        ],
        "roleArn": "arn:aws:iam::999999999999:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS",
        "events": [
            {
                "id": "80c028aa-5078-4ebe-88af-e5ba135d7db8",
                "createdAt": "2024-09-01T05:02:58.648000+00:00",
                "message": "(service h4b-ecs-service) has reached a steady state."
            },
            {
                "id": "8e9176e5-575e-48b0-ba0a-40fc14c2514b",
                "createdAt": "2024-09-01T05:02:39.799000+00:00",
                "message": "(service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
            },
            {
                "id": "d77b77f4-2699-4deb-a612-e56176cb63f9",
                "createdAt": "2024-09-01T05:02:11.809000+00:00",
                "message": "(service h4b-ecs-service) has started 1 tasks: (task ff8e2c9646954b76ac57c5d04f6a6c7b)."
            },
            {
                "id": "05097688-0581-4af3-ad2a-85ec1c0e24f1",
                "createdAt": "2024-09-01T05:02:10.659000+00:00",
                "message": "(service h4b-ecs-service, taskSet ecs-svc/2975423510966026190) has begun draining connections on 1 tasks."
            },
            {
                "id": "b32998eb-cc08-4d18-b0d0-8ba77c37515b",
                "createdAt": "2024-09-01T05:02:10.653000+00:00",
                "message": "(service h4b-ecs-service) deregistered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
            },
            {
                "id": "b1d2cf97-622c-4dc1-9bf7-30b2be8ebcec",
                "createdAt": "2024-09-01T04:13:26.555000+00:00",
                "message": "(service h4b-ecs-service) has reached a steady state."
            },
            {
                "id": "68fc1a52-add2-4bd9-bec7-1b94f352d9bc",
                "createdAt": "2024-09-01T04:13:26.554000+00:00",
                "message": "(service h4b-ecs-service) (deployment ecs-svc/2975423510966026190) deployment completed."
            },
            {
                "id": "5f6758fd-977b-4811-b9c6-8033c98e85bf",
                "createdAt": "2024-09-01T04:13:07.843000+00:00",
                "message": "(service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
            },
            {
                "id": "712ea0fb-172a-41e5-aff3-3aa2c148bc31",
                "createdAt": "2024-09-01T04:12:40.035000+00:00",
                "message": "(service h4b-ecs-service) has started 1 tasks: (task 37dd830477fc4f5b8e11bbdfac88ae8c)."
            },
            {
                "id": "e18f719e-c9b0-40ae-a618-49f6b3b0c277",
                "createdAt": "2024-09-01T04:12:20.525000+00:00",
                "message": "(service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
            },
            {
                "id": "c9a01a56-f61c-4a48-8b0b-871a6400cad4",
                "createdAt": "2024-09-01T04:11:41.475000+00:00",
                "message": "(service h4b-ecs-service) has started 1 tasks: (task 96f27181cb8e480793a548b98447e44c)."
            }
        ],
        "createdAt": "2024-09-01T04:11:29.087000+00:00",
        "placementConstraints": [],
        "placementStrategy": [],
        "networkConfiguration": {
            "awsvpcConfiguration": {
                "subnets": [
                    "subnet-00212e581b04af6ee",
                    "subnet-0d47fd735f5035e47"
                ],
                "securityGroups": [
                    "sg-0439ac82bbca00d99"
                ],
                "assignPublicIp": "ENABLED"
            }
        },
        "healthCheckGracePeriodSeconds": 0,
        "schedulingStrategy": "REPLICA",
        "deploymentController": {
            "type": "ECS"
        },
        "createdBy": "arn:aws:iam::999999999999:user/admin",
        "enableECSManagedTags": false,
        "propagateTags": "NONE",
        "enableExecuteCommand": false
    }
}

イベント確認

コマンド
aws ecs describe-services \
    --cluster ${CLUSTER_NAME} \
    --services ${SERVICE_NAME} \
    --query 'services[0].events[*].[id, createdAt, message]' \
    --output table

出力
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs describe-services \
>     --cluster ${CLUSTER_NAME} \
>     --services ${SERVICE_NAME} \
>     --query 'services[0].events[*].[id, createdAt, message]' \
>     --output table
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                                                      DescribeServices                                                                                                                      |
+--------------------------------------+-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  b1879450-2af9-4738-95ca-bfcae692a72e|  2024-09-01T05:41:06.768000+00:00 |  (service h4b-ecs-service) has reached a steady state.                                                                                                                          |
|  0230765e-2fd0-4b6d-a98f-e9d6b73a29a2|  2024-09-01T05:40:48.426000+00:00 |  (service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)     |
|  c7143c6c-01db-4292-a013-4d6b9a6d0707|  2024-09-01T05:40:19.569000+00:00 |  (service h4b-ecs-service) has started 1 tasks: (task 9c9ed82835fc4982b127b4cd8d0d217d).                                                                                        |
|  80c028aa-5078-4ebe-88af-e5ba135d7db8|  2024-09-01T05:02:58.648000+00:00 |  (service h4b-ecs-service) has reached a steady state.                                                                                                                          |
|  8e9176e5-575e-48b0-ba0a-40fc14c2514b|  2024-09-01T05:02:39.799000+00:00 |  (service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)     |
|  d77b77f4-2699-4deb-a612-e56176cb63f9|  2024-09-01T05:02:11.809000+00:00 |  (service h4b-ecs-service) has started 1 tasks: (task ff8e2c9646954b76ac57c5d04f6a6c7b).                                                                                        |
|  05097688-0581-4af3-ad2a-85ec1c0e24f1|  2024-09-01T05:02:10.659000+00:00 |  (service h4b-ecs-service, taskSet ecs-svc/2975423510966026190) has begun draining connections on 1 tasks.                                                                      |
|  b32998eb-cc08-4d18-b0d0-8ba77c37515b|  2024-09-01T05:02:10.653000+00:00 |  (service h4b-ecs-service) deregistered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)   |
|  b1d2cf97-622c-4dc1-9bf7-30b2be8ebcec|  2024-09-01T04:13:26.555000+00:00 |  (service h4b-ecs-service) has reached a steady state.                                                                                                                          |
|  68fc1a52-add2-4bd9-bec7-1b94f352d9bc|  2024-09-01T04:13:26.554000+00:00 |  (service h4b-ecs-service) (deployment ecs-svc/2975423510966026190) deployment completed.                                                                                       |
|  5f6758fd-977b-4811-b9c6-8033c98e85bf|  2024-09-01T04:13:07.843000+00:00 |  (service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)     |
|  712ea0fb-172a-41e5-aff3-3aa2c148bc31|  2024-09-01T04:12:40.035000+00:00 |  (service h4b-ecs-service) has started 1 tasks: (task 37dd830477fc4f5b8e11bbdfac88ae8c).                                                                                        |
|  e18f719e-c9b0-40ae-a618-49f6b3b0c277|  2024-09-01T04:12:20.525000+00:00 |  (service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)     |
|  c9a01a56-f61c-4a48-8b0b-871a6400cad4|  2024-09-01T04:11:41.475000+00:00 |  (service h4b-ecs-service) has started 1 tasks: (task 96f27181cb8e480793a548b98447e44c).                                                                                        |

10 リソースの削除 + まとめ + Next Action 案

ALB削除

コマンド
# ALB削除
aws elbv2 delete-load-balancer --load-balancer-arn ${LB_ARN}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # ALB削除
[cloudshell-user@ip-10-132-94-73 ~]$ aws elbv2 delete-load-balancer --load-balancer-arn ${LB_ARN}

ターゲットグループ削除

コマンド
# ターゲットグループ削除
aws elbv2 delete-target-group --target-group-arn ${TARGET_GROUP_ARN}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # ターゲットグループ削除
[cloudshell-user@ip-10-132-94-73 ~]$ aws elbv2 delete-target-group --target-group-arn ${TARGET_GROUP_ARN}

ECS削除

クラスター削除

コマンド
# サービス削除
aws ecs delete-service \
    --cluster ${CLUSTER_NAME} \
    --service ${SERVICE_NAME} \
    --force \
    --no-cli-pager

# クラスター削除
aws ecs delete-cluster \
    --cluster ${CLUSTER_NAME} \
    --no-cli-pager
出力
[cloudshell-user@ip-10-132-94-73 ~]$ # サービス削除
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs delete-service \
>     --cluster ${CLUSTER_NAME} \
>     --service ${SERVICE_NAME} \
>     --force \
>     --no-cli-pager
{
    "service": {
        "serviceArn": "arn:aws:ecs:ap-northeast-1:999999999999:service/h4b-ecs-cluster/h4b-ecs-service",
        "serviceName": "h4b-ecs-service",
        "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
        "loadBalancers": [
            {
                "targetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c",
                "containerName": "apache-helloworld",
                "containerPort": 80
            }
        ],
        "serviceRegistries": [],
        "status": "DRAINING",
        "desiredCount": 0,
        "runningCount": 2,
        "pendingCount": 0,
        "launchType": "FARGATE",
        "platformVersion": "LATEST",
        "platformFamily": "Linux",
        "taskDefinition": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
        "deploymentConfiguration": {
            "deploymentCircuitBreaker": {
                "enable": false,
                "rollback": false
            },
            "maximumPercent": 200,
            "minimumHealthyPercent": 100
        },
        "deployments": [
            {
                "id": "ecs-svc/2975423510966026190",
                "status": "PRIMARY",
                "taskDefinition": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
                "desiredCount": 0,
                "pendingCount": 0,
                "runningCount": 2,
                "failedTasks": 0,
                "createdAt": "2024-09-01T04:11:29.087000+00:00",
                "updatedAt": "2024-09-01T05:51:05.464000+00:00",
                "launchType": "FARGATE",
                "platformVersion": "1.4.0",
                "platformFamily": "Linux",
                "networkConfiguration": {
                    "awsvpcConfiguration": {
                        "subnets": [
                            "subnet-00212e581b04af6ee",
                            "subnet-0d47fd735f5035e47"
                        ],
                        "securityGroups": [
                            "sg-0439ac82bbca00d99"
                        ],
                        "assignPublicIp": "ENABLED"
                    }
                },
                "rolloutState": "COMPLETED",
                "rolloutStateReason": "ECS deployment ecs-svc/2975423510966026190 completed."
            }
        ],
        "roleArn": "arn:aws:iam::999999999999:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS",
        "events": [
            {
                "id": "329e6443-c81d-41c9-a058-0e7935fc5433",
                "createdAt": "2024-09-01T05:51:14.783000+00:00",
                "message": "(service h4b-ecs-service, taskSet ecs-svc/2975423510966026190) has begun draining connections on 1 tasks."
            },
            {
                "id": "b841fb7f-838e-4f88-80dc-bbed50f83999",
                "createdAt": "2024-09-01T05:51:14.778000+00:00",
                "message": "(service h4b-ecs-service) failed to deregister targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c) with (error Target groups 'arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c' not found)"
            },
            {
                "id": "7f0d116d-2ef6-495b-bfb6-1ce7d315e237",
                "createdAt": "2024-09-01T05:51:05.533000+00:00",
                "message": "(service h4b-ecs-service) has stopped 1 running tasks: (task 96f27181cb8e480793a548b98447e44c)."
            },
            {
                "id": "b1879450-2af9-4738-95ca-bfcae692a72e",
                "createdAt": "2024-09-01T05:41:06.768000+00:00",
                "message": "(service h4b-ecs-service) has reached a steady state."
            },
            {
                "id": "0230765e-2fd0-4b6d-a98f-e9d6b73a29a2",
                "createdAt": "2024-09-01T05:40:48.426000+00:00",
                "message": "(service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
            },
            {
                "id": "c7143c6c-01db-4292-a013-4d6b9a6d0707",
                "createdAt": "2024-09-01T05:40:19.569000+00:00",
                "message": "(service h4b-ecs-service) has started 1 tasks: (task 9c9ed82835fc4982b127b4cd8d0d217d)."
            },
            {
                "id": "80c028aa-5078-4ebe-88af-e5ba135d7db8",
                "createdAt": "2024-09-01T05:02:58.648000+00:00",
                "message": "(service h4b-ecs-service) has reached a steady state."
            },
            {
                "id": "8e9176e5-575e-48b0-ba0a-40fc14c2514b",
                "createdAt": "2024-09-01T05:02:39.799000+00:00",
                "message": "(service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
            },
            {
                "id": "d77b77f4-2699-4deb-a612-e56176cb63f9",
                "createdAt": "2024-09-01T05:02:11.809000+00:00",
                "message": "(service h4b-ecs-service) has started 1 tasks: (task ff8e2c9646954b76ac57c5d04f6a6c7b)."
            },
            {
                "id": "05097688-0581-4af3-ad2a-85ec1c0e24f1",
                "createdAt": "2024-09-01T05:02:10.659000+00:00",
                "message": "(service h4b-ecs-service, taskSet ecs-svc/2975423510966026190) has begun draining connections on 1 tasks."
            },
            {
                "id": "b32998eb-cc08-4d18-b0d0-8ba77c37515b",
                "createdAt": "2024-09-01T05:02:10.653000+00:00",
                "message": "(service h4b-ecs-service) deregistered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
            },
            {
                "id": "b1d2cf97-622c-4dc1-9bf7-30b2be8ebcec",
                "createdAt": "2024-09-01T04:13:26.555000+00:00",
                "message": "(service h4b-ecs-service) has reached a steady state."
            },
            {
                "id": "68fc1a52-add2-4bd9-bec7-1b94f352d9bc",
                "createdAt": "2024-09-01T04:13:26.554000+00:00",
                "message": "(service h4b-ecs-service) (deployment ecs-svc/2975423510966026190) deployment completed."
            },
            {
                "id": "5f6758fd-977b-4811-b9c6-8033c98e85bf",
                "createdAt": "2024-09-01T04:13:07.843000+00:00",
                "message": "(service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
            },
            {
                "id": "712ea0fb-172a-41e5-aff3-3aa2c148bc31",
                "createdAt": "2024-09-01T04:12:40.035000+00:00",
                "message": "(service h4b-ecs-service) has started 1 tasks: (task 37dd830477fc4f5b8e11bbdfac88ae8c)."
            },
            {
                "id": "e18f719e-c9b0-40ae-a618-49f6b3b0c277",
                "createdAt": "2024-09-01T04:12:20.525000+00:00",
                "message": "(service h4b-ecs-service) registered 1 targets in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:999999999999:targetgroup/h4b-ecs-targetgroup/e9af50f66620267c)"
            },
            {
                "id": "c9a01a56-f61c-4a48-8b0b-871a6400cad4",
                "createdAt": "2024-09-01T04:11:41.475000+00:00",
                "message": "(service h4b-ecs-service) has started 1 tasks: (task 96f27181cb8e480793a548b98447e44c)."
            }
        ],
        "createdAt": "2024-09-01T04:11:29.087000+00:00",
        "placementConstraints": [],
        "placementStrategy": [],
        "networkConfiguration": {
            "awsvpcConfiguration": {
                "subnets": [
                    "subnet-00212e581b04af6ee",
                    "subnet-0d47fd735f5035e47"
                ],
                "securityGroups": [
                    "sg-0439ac82bbca00d99"
                ],
                "assignPublicIp": "ENABLED"
            }
        },
        "healthCheckGracePeriodSeconds": 0,
        "schedulingStrategy": "REPLICA",
        "deploymentController": {
            "type": "ECS"
        },
        "createdBy": "arn:aws:iam::999999999999:user/admin",
        "enableECSManagedTags": false,
        "propagateTags": "NONE",
        "enableExecuteCommand": false
    }
}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # クラスター削除
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs delete-cluster \
>     --cluster ${CLUSTER_NAME} \
>     --no-cli-pager
{
    "cluster": {
        "clusterArn": "arn:aws:ecs:ap-northeast-1:999999999999:cluster/h4b-ecs-cluster",
        "clusterName": "h4b-ecs-cluster",
        "status": "INACTIVE",
        "registeredContainerInstancesCount": 0,
        "runningTasksCount": 0,
        "pendingTasksCount": 0,
        "activeServicesCount": 0,
        "statistics": [],
        "tags": [],
        "settings": [
            {
                "name": "containerInsights",
                "value": "disabled"
            }
        ],
        "capacityProviders": [],
        "defaultCapacityProviderStrategy": []
    }
}
[cloudshell-user@ip-10-132-94-73 ~]$ 

タスク定義無効化

コマンド
# タスク定義無効化
aws ecs deregister-task-definition \
    --task-definition ${TASK_REGISTER_FAMILY}:${TASKDEFINITION_REVISION_NO} \
    --no-cli-pager

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # タスク定義無効化
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs deregister-task-definition \
>     --task-definition ${TASK_REGISTER_FAMILY}:${TASKDEFINITION_REVISION_NO} \
>     --no-cli-pager
{
    "taskDefinition": {
        "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
        "containerDefinitions": [
            {
                "name": "apache-helloworld",
                "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1",
                "cpu": 0,
                "portMappings": [
                    {
                        "containerPort": 80,
                        "hostPort": 80,
                        "protocol": "tcp",
                        "name": "apache-helloworld-80-tcp",
                        "appProtocol": "http"
                    }
                ],
                "essential": true,
                "environment": [],
                "environmentFiles": [],
                "mountPoints": [],
                "volumesFrom": [],
                "ulimits": [],
                "logConfiguration": {
                    "logDriver": "awslogs",
                    "options": {
                        "awslogs-group": "/ecs/h4b-ecs-task-definition",
                        "mode": "non-blocking",
                        "max-buffer-size": "25m",
                        "awslogs-create-group": "true",
                        "awslogs-region": "ap-northeast-1",
                        "awslogs-stream-prefix": "ecs"
                    },
                    "secretOptions": []
                },
                "systemControls": []
            }
        ],
        "family": "h4b-ecs-task-definition",
        "executionRoleArn": "arn:aws:iam::999999999999:role/ecsTaskExecutionRole",
        "networkMode": "awsvpc",
        "revision": 11,
        "volumes": [],
        "status": "INACTIVE",
        "requiresAttributes": [
            {
                "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
            },
            {
                "name": "ecs.capability.execution-role-awslogs"
            },
            {
                "name": "com.amazonaws.ecs.capability.ecr-auth"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.28"
            },
            {
                "name": "ecs.capability.execution-role-ecr-pull"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
            },
            {
                "name": "ecs.capability.task-eni"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29"
            }
        ],
        "placementConstraints": [],
        "compatibilities": [
            "EC2",
            "FARGATE"
        ],
        "runtimePlatform": {
            "cpuArchitecture": "X86_64",
            "operatingSystemFamily": "LINUX"
        },
        "requiresCompatibilities": [
            "FARGATE"
        ],
        "cpu": "1024",
        "memory": "3072",
        "registeredAt": "2024-09-01T04:08:23.830000+00:00",
        "deregisteredAt": "2024-09-01T06:04:03.462000+00:00",
        "registeredBy": "arn:aws:iam::999999999999:user/admin"
    }
}

非アクティブなタスク定義を取得

コマンド
# 非アクティブなタスク定義を取得
aws ecs list-task-definitions \
    --family-prefix ${TASK_REGISTER_FAMILY}  \
    --status INACTIVE \
    --output text

for revision in $(
    aws ecs list-task-definitions \
        --family-prefix ${TASK_REGISTER_FAMILY} \
        --status INACTIVE \
        --query "taskDefinitionArns[]" \
        --output text
);
do
  aws ecs delete-task-definitions \
    --task-definition $revision \
    --no-cli-pager
done

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # 非アクティブなタスク定義を取得
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecs list-task-definitions \
>     --family-prefix ${TASK_REGISTER_FAMILY}  \
>     --status INACTIVE \
>     --output text
TASKDEFINITIONARNS      arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ for revision in $(
>     aws ecs list-task-definitions \
>         --family-prefix ${TASK_REGISTER_FAMILY} \
>         --status INACTIVE \
>         --query "taskDefinitionArns[]" \
>         --output text
> );
> do
>   aws ecs delete-task-definitions \
>     --task-definition $revision \
>     --no-cli-pager
> done
{
    "taskDefinitions": [
        {
            "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:999999999999:task-definition/h4b-ecs-task-definition:11",
            "containerDefinitions": [
                {
                    "name": "apache-helloworld",
                    "image": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1",
                    "cpu": 0,
                    "portMappings": [
                        {
                            "containerPort": 80,
                            "hostPort": 80,
                            "protocol": "tcp",
                            "name": "apache-helloworld-80-tcp",
                            "appProtocol": "http"
                        }
                    ],
                    "essential": true,
                    "environment": [],
                    "environmentFiles": [],
                    "mountPoints": [],
                    "volumesFrom": [],
                    "ulimits": [],
                    "logConfiguration": {
                        "logDriver": "awslogs",
                        "options": {
                            "awslogs-group": "/ecs/h4b-ecs-task-definition",
                            "mode": "non-blocking",
                            "awslogs-create-group": "true",
                            "max-buffer-size": "25m",
                            "awslogs-region": "ap-northeast-1",
                            "awslogs-stream-prefix": "ecs"
                        },
                        "secretOptions": []
                    },
                    "systemControls": []
                }
            ],
            "family": "h4b-ecs-task-definition",
            "executionRoleArn": "arn:aws:iam::999999999999:role/ecsTaskExecutionRole",
            "networkMode": "awsvpc",
            "revision": 11,
            "volumes": [],
            "status": "DELETE_IN_PROGRESS",
            "requiresAttributes": [
                {
                    "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
                },
                {
                    "name": "ecs.capability.execution-role-awslogs"
                },
                {
                    "name": "com.amazonaws.ecs.capability.ecr-auth"
                },
                {
                    "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
                },
                {
                    "name": "com.amazonaws.ecs.capability.docker-remote-api.1.28"
                },
                {
                    "name": "ecs.capability.execution-role-ecr-pull"
                },
                {
                    "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
                },
                {
                    "name": "ecs.capability.task-eni"
                },
                {
                    "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29"
                }
            ],
            "placementConstraints": [],
            "compatibilities": [
                "EC2",
                "FARGATE"
            ],
            "runtimePlatform": {
                "cpuArchitecture": "X86_64",
                "operatingSystemFamily": "LINUX"
            },
            "requiresCompatibilities": [
                "FARGATE"
            ],
            "cpu": "1024",
            "memory": "3072",
            "registeredAt": "2024-09-01T04:08:23.830000+00:00",
            "deregisteredAt": "2024-09-01T06:04:03.462000+00:00",
            "registeredBy": "arn:aws:iam::999999999999:user/admin"
        }
    ],
    "failures": []
}

VPC削除

コマンド
# インターネットゲートウェイ デタッチ
aws ec2 detach-internet-gateway \
    --internet-gateway-id ${IGW_ID}\
    --vpc-id ${VPC_ID}

# インターネットゲートウェイ削除
aws ec2 delete-internet-gateway --internet-gateway-id ${IGW_ID}

# Subnet 削除
aws ec2 delete-subnet --subnet-id ${AZ1_PUB_ID}
aws ec2 delete-subnet --subnet-id ${AZ2_PUB_ID}

# ルートテーブル削除
aws ec2 delete-route-table --route-table-id ${PUB_RT_ID}

# VPC削除
aws ec2 delete-vpc --vpc-id ${VPC_ID}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # インターネットゲートウェイ デタッチ
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 detach-internet-gateway \
>     --internet-gateway-id ${IGW_ID}\
>     --vpc-id ${VPC_ID}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # インターネットゲートウェイ削除
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 delete-internet-gateway --internet-gateway-id ${IGW_ID}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # Subnet 削除
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 delete-subnet --subnet-id ${AZ1_PUB_ID}
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 delete-subnet --subnet-id ${AZ2_PUB_ID}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # ルートテーブル削除
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 delete-route-table --route-table-id ${PUB_RT_ID}
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # VPC削除
[cloudshell-user@ip-10-132-94-73 ~]$ aws ec2 delete-vpc --vpc-id ${VPC_ID}

ECR削除

コマンド
aws ecr delete-repository \
    --repository-name ${REPOSITORY_NAME} \
    --force

出力
[cloudshell-user@ip-10-132-94-73 ~]$ aws ecr delete-repository \
>     --repository-name ${REPOSITORY_NAME} \
>     --force
{
    "repository": {
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:999999999999:repository/h4b-ecs-helloworld",
        "registryId": "999999999999",
        "repositoryName": "h4b-ecs-helloworld",
        "repositoryUri": "999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld",
        "createdAt": "2024-09-01T04:01:14.519000+00:00",
        "imageTagMutability": "MUTABLE"
    }
}

IAMロールの削除

コマンド
# ロールにアタッチされているポリシーをリスト
POLICIES=$(
    aws iam list-attached-role-policies \
        --role-name ${ROLE_NAME} \
        --query 'AttachedPolicies[*].PolicyArn' \
        --output text
) \
&& echo ${POLICIES}

# リスト内のポリシーをデタッチする
for POLICY in ${POLICIES}; do
    aws iam detach-role-policy \
        --role-name ${ROLE_NAME} \
        --policy-arn ${POLICY}
done

# IAMロールの削除
aws iam delete-role \
    --role-name ${ROLE_NAME}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ # ロールにアタッチされているポリシーをリスト
[cloudshell-user@ip-10-132-94-73 ~]$ POLICIES=$(
>     aws iam list-attached-role-policies \
>         --role-name ${ROLE_NAME} \
>         --query 'AttachedPolicies[*].PolicyArn' \
>         --output text
> ) \
> && echo ${POLICIES}
arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # リスト内のポリシーをデタッチする
[cloudshell-user@ip-10-132-94-73 ~]$ for POLICY in ${POLICIES}; do
>     aws iam detach-role-policy \
>         --role-name ${ROLE_NAME} \
>         --policy-arn ${POLICY}
> done
[cloudshell-user@ip-10-132-94-73 ~]$ 
[cloudshell-user@ip-10-132-94-73 ~]$ # IAMロールの削除
[cloudshell-user@ip-10-132-94-73 ~]$ aws iam delete-role \
>     --role-name ${ROLE_NAME}

Cloud9削除

コマンド
aws cloud9 delete-environment \
    --environment-id ${CLOUD9_ENVIRONMENT_ID}

出力
[cloudshell-user@ip-10-132-94-73 ~]$ aws cloud9 delete-environment \
>     --environment-id ${CLOUD9_ENVIRONMENT_ID}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0