Nao000のぶろぐ

蝶を追っている少年になりたい

AWS ECS を少し体験した

ざっくり何をやったか

  • ローカル PC で Apache httpd の Docker イメージと php-fpm の Docker イメージを用意しました
  • この2つのイメージを ECR にプッシュしました
  • ECS でクラスターを作成しました
  • ECS でタスク定義しました
  • ターゲットグループを作成しました
  • セキュリティグループを作成
  • ECS でサービスを作成しました
  • ALB を作成しました
  • ローカル PC のブラウザからアクセスしました

以下は少し詳細の記録です。

ローカル PC で Apache httpd の Docker イメージと php-fpm の Docker イメージを用意しました

この2つのイメージで構成される WEB アプリケーションを作成しました。

ブラウザでアクセスすると PHP で echo "Hello World! From "; echo gethostname() を実行するだけの WEB アプリケーションです。gethostname()によってコンテナを複数立ち上げた状態でアクセスしたときに別々のコンテナにアクセスされることを確認するためです。

2つのイメージは Copilot を使いながら作成しました。

この2つのイメージを ECR にプッシュしました

作成した2つのイメージを ECS 用の Docker イメージをビルドしました。ビルドするさいのタグ付けで <レジストリ>/<リポジトリ>:<タグ> のようにレジストリとリポジトリを決められるのですね。普段やらないので新鮮でした。以下のようなコマンドを実行しました。変数 $ECR にはレジストリとリポジトリが入っています。

docker build \
  -f httpd/Dockerfile.prod \
  -t "$ECR/learn-fargate/httpd:latest" .

docker build \
  -f phpfpm/Dockerfile.prod \
  -t "$ECR/learn-fargate/phpfpm:latest" .

AWS ECS で扱うために ECR にプッシュしました。プッシュ時のコマンドは以下です。

docker push "$ECR/learn-fargate/httpd:latest"
docker push "$ECR/learn-fargate/phpfpm:latest"

※ 前提として ECR には手動でリポジトリ作成しています。

ECS でクラスターを作成しました

my-learn-httpd-phpfpm-ecs という名前でクラスターを作成しました。

とりあえずタスクの入れ物を作成して次にタスク定義を行いました。

ECS でタスク定義しました

ここで実際にイメージをコンテナとして動かす際の詳細を定義します。ECRのどのリポジトリとイメージを使うか、コンテナとして動かすときのメモリーとCPUを定義します。 .5vCPU ってなんですかね。どのくらいの性能なのか想像できないです。あと公開するポート番号とかプロトコルを設定します。今回は Apache httpd を使うので ポート 80 で TCP で HTTP を公開しておきます。

ターゲットグループを作成しました

ECS でサービスによってタスクを実際に稼働して公開するときに ALB を経由してインターネットに公開します。その際にサービスに対してターゲットグループを設定して、そのターゲットグループに ALB から振り分けさせます。以下のような経路で Apache httpd コンテナにアクセスされるようにします。

インターネットからのアクセス → ALB → ターゲットグループ → ECS サービスの各タスクの Apache httpd コンテナ

セキュリティグループを作成

実際に作成したのは ALB 用のセキュリティグループだけで、ECS サービスに設定するセキュリティグループはデフォルトで用意されているものを使いました。

ECS サービスに設定するセキュリティグループのインバウンドルールのソースに ALB 用のセキュリティグループを設定するのですが、この感覚があまり馴染まないです。ソースとしてIPアドレスがあるのは分かります。ソースにセキュリティグループを設定することで、そのセキュリティグループを設定してある AWS リソースからのアクセスを許可します。

ALB 用のセキュリティグループのインバウンドルールはその時点の家のインターネット回線のグローバルIPアドレスをソースに設定した、TCPのポート80のHTTPのみをアクセス許可しました。

ECS サービス用のセキュリティグループのインバウンドルールは ALB のセキュリティグループをソースとした、TCPのポート80のHTTPのみをアクセス許可しました。

ECS でサービスを作成しました

タスク定義したものを実際にコンテナとして稼働させるためにサービスを作成します。このときにどのタスクを使うか、起動するタスクの数、セキュリティグループは何を使うか、ALBから振り分けられるときに使うターゲットグループは何を使うか、などを設定しました。

起動するタスクの数は2にしてます。

ALB を作成しました

ECS タスクを使ってサービスを作成したときに、インターネットからアクセスできるように ALB を作成しました。ECS サービス用に作成したターゲットグループに対して振り分けます。

ローカル PC のブラウザからアクセスしました

無事にアクセスできました。 ECS タスクの起動数は2なので、更新するときに gethostname() の結果が変わることを確認できました。交互だったかは覚えていないです。

おわり

実際にはこの通りの順番には作業していないです。ChatGPT に聞きながら作業しました。

今回はローカルPCでアプリケーションを改修して GitHub に push => AWS CodePipeline からの ECS タスク更新とかはやってないです。

これもいつか実験したいです。