[初心者必見] ECS でLaravel 環境を構築してみる

AWS

こんばんは、今回はLaravel 環境をECS で構築してみようと思います。以前のブログでnginx のコンテナは構築してみたので、よかったらそちらも見てみてください。

ということで構築を始めていきます。

今回の環境について

このGitHub のレポジトリにソースを置いているので、検証するにあたって、使ってみてください。

GitHub - kentaindeed/docker-files-for-ecs-practice: ECS でLaravel をホストするときの練習のためのレポジトリです
ECS でLaravel をホストするときの練習のためのレポジトリです. Contribute to kentaindeed/docker-files-for-ecs-practice development by creating an ...

Readme はAmazon Q に作ってもらいました。ということで環境を構築していきます。

ECS でのLaravel 開発環境構築

上のソースをClone している前提で進めていきます。

ECR でレポジトリを作成

今回はnginx・php-fpm・MySQL の三種類でレポジトリを作成していきます。そして、プッシュコマンドでそれぞれpush していきます。

# AWS ログイン
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com

# php-fpm build
docker build -f docker/app/Dockerfile.production -t php-fpm .

# nginx build
docker build -f docker/nginx/Dockerfile.production -t nginx .

# mysql build
docker build -f docker/mysql/Dockerfile -t mysql .

# tag づけ
docker tag nginx:latest <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest
docker tag php-fpm:latest <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/php-fpm:latest
docker tag mysql:latest <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/mysql:latest

# push 
docker push <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest
docker push <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/php-fpm:latest
docker push <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/mysql:latest

レポジトリにそれぞれ作成されていたら問題なく作成できています。

ECS Cluster の作成

CLI で作成します。

aws ecs create-cluster \
    --cluster-name laravel-cluster \
    --capacity-providers FARGATE FARGATE_SPOT \
    --default-capacity-provider-strategy capacityProvider=FARGATE,weight=1 \
    --region ap-northeast-1

下記のコマンドで作成されているのを確認してください。

aws ecs list-clusters --region ap-northeast-1

Cluster ができたので、サービスを作成する前にタスク定義をしていきましょう。

タスクの作成

今回は、masking したtask 定義json を用意しているので、それをみます。ポイントのみ箇条書きします。各自でAccount ID などを入力していってください。

  • ECS を実行するためのRole を用意すること
  • Compatibilty をFargate にすること
  • php-fpm とMySQL の両方の環境でDB の環境変数をセットすること
  • 好みですが、Cloudwatch logs を有効化すると調査に役に立ちます
{
    "family": "<task-family-name>",
    "taskRoleArn": "arn:aws:iam::<account-id>:role/<task-role-name>",
    "executionRoleArn": "arn:aws:iam::<account-id>:role/<execution-role-name>",
    "networkMode": "awsvpc",
    "requiresCompatibilities": ["FARGATE"],
    "cpu": "1024",
    "memory": "2048",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    },
    "containerDefinitions": [
        {
            "name": "<nginx-container-name>",
            "image": "<account-id>.dkr.ecr.<region>.amazonaws.com/<nginx-repository>:latest",
            "cpu": 0,
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp",
                    "name": "<nginx-container-name>-80-tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "environment": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/<task-family-name>",
                    "awslogs-create-group": "true",
                    "awslogs-region": "<region>",
                    "awslogs-stream-prefix": "ecs"
                }
            }
        },
        {
            "name": "<php-container-name>",
            "image": "<account-id>.dkr.ecr.<region>.amazonaws.com/<php-repository>:latest",
            "cpu": 0,
            "essential": true,
            "environment": [
                {
                    "name": "APP_KEY",
                    "value": "<app-key>"
                },
                {
                    "name": "DB_CONNECTION",
                    "value": "mysql"
                },
                {
                    "name": "DB_HOST",
                    "value": "localhost"
                },
                {
                    "name": "DB_PORT",
                    "value": "3306"
                },
                {
                    "name": "DB_DATABASE",
                    "value": "<database-name>"
                },
                {
                    "name": "DB_USERNAME",
                    "value": "<database-username>"
                },
                {
                    "name": "DB_PASSWORD",
                    "value": "<database-password>"
                }
            ],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/<task-family-name>",
                    "awslogs-create-group": "true",
                    "awslogs-region": "<region>",
                    "awslogs-stream-prefix": "ecs"
                }
            }
        },
        {
            "name": "<mysql-container-name>",
            "image": "<account-id>.dkr.ecr.<region>.amazonaws.com/<mysql-repository>:latest",
            "cpu": 0,
            "essential": false,
            "environment": [
                {
                    "name": "MYSQL_ROOT_PASSWORD",
                    "value": "<mysql-root-password>"
                },
                {
                    "name": "MYSQL_DATABASE",
                    "value": "<database-name>"
                },
                {
                    "name": "MYSQL_USER",
                    "value": "<database-username>"
                },
                {
                    "name": "MYSQL_PASSWORD",
                    "value": "<database-password>"
                },
                {
                    "name": "TZ",
                    "value": "Asia/Tokyo"
                }
            ],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/<task-family-name>",
                    "awslogs-create-group": "true",
                    "awslogs-region": "<region>",
                    "awslogs-stream-prefix": "ecs"
                }
            }
        }
    ]
}

ここまできたら、後はサービスを作成していきます。

サービスの作成

タスク定義ファミリーを指定してあげます。僕は7回ほどリビジョンしているので、7 になっていますが、数字は関係ないので、最新バージョンにしてあげてください。

環境は、Fargate にします。

デプロイ設定・デプロイオプションなどは特に今回は変更を加えず、デフォルトのままにします。ネットワーキングはpublic subnet にあることとパブリックIPをオンにしていることなどを確認してあげてください。

ここまできたら、後は作成を押して、立ち上がってくるのを待ちましょう。

作成後の確認

数分立ち上がるのに時間がかかります。デプロイされたら、Public IP をブラウザで叩いて、下記の表示がでれば成功です。

サービスの削除

検証用途なので、削除もしていきましょう。

更新を押下します。

必要なタスクを0にして更新します。

そして、サービスを削除します。

削除されたら、削除作業も終わりです。クラスター自体は料金は発生しないので、このままにしててもオッケーです。

まとめ

最小の構成でLaravel の環境構築ができたら、Aurora を使ってみたり、最近GA されたB/G デプロイを使ったりすると、よりパワーアップできそうですね!ということで、次回以降でECS 関連の記事も増やしていこうと思います。

\ 最新情報をチェック /

コメント

PAGE TOP
タイトルとURLをコピーしました