【前半:AWS 初心者向け】AmazonECS(Fargate)でPHP+Apache環境を手動作成!ロードバランサ経由も!
どうも!ヒグッティ(twitter→ヒグッティ@システムエンジニア)です!
今回はAmazonECS(Fargate)でPHP+ApacheのWeb環境を作成します。全てAWSの管理コンソールで手動作成します。インフラのコード化、自動化が進んでいますが、手動で作成し理解を深めようと思います!ECSを勉強してみたいけど、わからない、、、手を動かしたいけど何をすれば、、と思っている方は是非参考にしてください!
今回は長いので前半と後半に記事を分けました。この記事は前半です。ロードバランサの作成とECRのイメージの作成、PUSHまでを解説します。後半はECSの作成をやります!!
過去のAWSについての記事は以下を見てください!
【初心者AWS S3+PHP】S3にファイルをアップロード!composer使いません!!
やりたいこと
- AmazonECS(Fargate)(以降、ECSと呼ぶ)でPHP+Apache環境を作成。
- ロードバランサ経由で接続できるようにする。
- 全ての作業を管理コンソールから手動で実行する。
全体の流れ
- ロードバランサの作成(前半)
- ECRへリポジトリの作成、イメージの登録(前半)
- ECSの作成(後半)
構成
以下のような構成を作成します。手動でECRにイメージを登録して、手動でECSのタスク定義からサービスを起動する感じです。では実際にECSの構築を実施していきましょう!!

ロードバランサの作成
ロードバランサを作成する前に、ターゲットグループの作成をします。以下が手順です。画像が荒いのは許してください、、どのリソースに紐づけるかを選択しますが、ECSの場合、IPに紐づくロードバランサが必要なので、IPアドレスを選択してください。

次は特に指定する箇所はなく作成ボタンを押下。

以上で、ターゲットグループの作成は完了です。次はロードバランサを作成します。
以下、ロードバランサの作成手順です。ALBを選択します!

特に指定が必要ない箇所は割愛しています。自分の環境に合わせて選択してください。私は基本的にAWSのdefaultにしちゃっています。

リスナーでは作成したターゲットグループを選択してください。

タグとかは一切指定していません。適宜設定してみて下さい。あとは作成ボタンを押します!

これでロードバランサの作成は完了です。
ECRへイメージのPUSH
ECR(Elastic Container Registry)にイメージをPUSHするには、リポジトリを作成する必要があります。作成したあと、イメージをPUSHします。
リポジトリの作成

以上でリポジトリの作成は完了です。次はリポジトリにイメージをPUSHしていきます。
イメージをPUSHするときは、EC2インスタンスを作成して、そこでイメージの作成、PUSHをします。今回はイメージ作成、PUSH用インスタンス構築については割愛します。基本的にはaws cliとdockerコマンドが使えれば問題ありません。
PUSHするコマンドを以下の操作で控えておきます。


赤枠の箇所をコピーしておいてください。PUSHするときに必要です!
イメージの作成、PUSH
次はイメージの作成とPUSHです。EC2インスタンスを起動して、SSHでログインしましょう。
今回使うDockerファイルは以下です。Dockerfileの説明は割愛します。説明がほしい場合、XにDMかコメントしてください。
# PHPの公式イメージをベースに選択。Apacheがプリインストールされているバージョン を使用
FROM php:7.4-apache
# 必要なPHPの拡張機能をインストール
RUN docker-php-ext-install pdo_mysql
# mod_rewriteを有効にする(必要に応じて他のモジュールも有効化)
RUN a2enmod rewrite
# ホストマシンのソースコードをコンテナのApacheドキュメントルートにコピー
COPY www/ /var/www/html/
# コンテナがリッスンするポートを指定
EXPOSE 80
# Apacheをフォアグラウンドで実行
CMD ["apache2-foreground"]
イメージを作成する際のディレクトリ構成は以下です。
├─ecrtestlocal
│ └─php
│ └─Dockerfile
└─www
└─index.php
以下はブラウザで表示するindex.phpの中身です。Hello world的な感じです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ECR test</title>
</head>
<body>
<?php
echo "ecr test! next!";
?>
</body>
</html>
ではイメージを作成します!!以下、各コマンドを実行した結果です。
[root@ip-172-31-0-182 ecrwork]# pwd
/root/ecrwork
[root@ip-172-31-0-182 ecrwork]# aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 【コピーしたID】.dkr.ecr.ap-northeast-1.amazonaws.com
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@ip-172-31-0-182 ecrwork]# docker build -f ecrtestlocal/php/Dockerfile -t tesrrepo .
Sending build context to Docker daemon 10.24kB
Step 1/6 : FROM php:7.4-apache
---> 20a3732f422b
Step 2/6 : RUN docker-php-ext-install pdo_mysql
---> Using cache
---> 70c21167cb68
Step 3/6 : RUN a2enmod rewrite
---> Using cache
---> 32f7da3bef93
Step 4/6 : COPY www/ /var/www/html/
---> Using cache
---> 425b309aac3f
Step 5/6 : EXPOSE 80
---> Using cache
---> 45117b221179
Step 6/6 : CMD ["apache2-foreground"]
---> Using cache
---> 3a8aefa02782
Successfully built 3a8aefa02782
Successfully tagged tesrrepo:latest
[root@ip-172-31-0-182 ecrwork]# docker tag tesrrepo:latest 【コピーしたID】.dkr.ecr.ap-northeast-1.amazonaws.com/tesrrepo:latest
[root@ip-172-31-0-182 ecrwork]# docker push 【コピーしたID】.dkr.ecr.ap-northeast-1.amazonaws.com/tesrrepo:latest
The push refers to repository [【コピーしたID】.dkr.ecr.ap-northeast-1.amazonaws.com/tesrrepo]
95fb05ab175d: Pushed
88206d96e4fa: Pushed
2943d6181f46: Pushed
3d33242bf117: Pushed
529016396883: Pushed
5464bcc3f1c2: Pushed
28192e867e79: Pushed
d173e78df32e: Pushed
0be1ec4fbfdc: Pushed
30fa0c430434: Pushed
a538c5a6e4e0: Pushed
e5d40f64dcb4: Pushed
44148371c697: Pushed
797a7c0590e0: Pushed
f60117696410: Pushed
ec4a38999118: Pushed
latest: digest: sha256:e4a4d42cce9a8b4d865650024f42df55ea97f7b5796ceb67a2facf6b5b1e6586 size: 3658
[root@ip-172-31-0-182 ecrwork]#
ECRでリポジトリにイメージが作成できていたら、PUSHまで完了です!!
まとめ
今回はECSでWebアプリを構築するために、ロードバランサの作成、ECRへのイメージPUSHまでをやりました。ロードバランサの作成でIPに紐づくようするのが、少しハマりましたが、、それ以外は特に問題ないですね!
次回!!ECSの作成!!お楽しみに!!