LaravelとNginxをECS on Fargateにデプロイする

AWS

こんにちは、ニキです。

ECS (Elastic Container Service) on Fargateは、コンテナの運用を実現するAWSのサービスです。この記事では、LaravelアプリケーションとNginxをECS on Fargateにデプロイする手順を紹介します。

Takaharu Niki

・Webエンジニア5年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする

事前準備

まず、ECS on Fargateのデプロイの前に行う必要のある事前準備について説明します。

AWS CLIの設定

まず、AWS CLIをインストールし、適切なクレデンシャルを設定する必要があります。

$ aws configure

Dockerイメージの作成

LaravelアプリケーションとNginxのDockerイメージを作成し、ECRにpushしておきます。

ECS on FargateにLaravelとNginxコンテナをデプロイ

こちらのセクションでは、ECS on Fargateの基本的な設定手順を紹介します。

クラスターの作成

ECSクラスターを作成します。

今回は、fargate-clusterというクラスター名にします。

aws ecs create-cluster --cluster-name fargate-cluster

タスク定義の作成

LaravelとNginxのコンテナをFargate上で動作させるためのタスク定義を作成します。

まず、タスク定義ファイルを作成します。

touch task-definition.json 

以下のように作成します。

{
  "taskRoleArn": "arn:aws:iam::AWS_ACCOUNT_ID:role/ecsTaskExecutionRole",
  "containerDefinitions": [
    {
      "name": "php",
      "image": "AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/php",
      "memory": 100,
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
            "awslogs-create-group": "true",
            "awslogs-group": "/ecs/nginx",
            "awslogs-region": "ap-northeast-1",
            "awslogs-stream-prefix": "ecs"
        },
        "secretOptions": []
      },
      "linuxParameters": {
        "initProcessEnabled": true
      }
    },
    {
      "name": "nginx",
      "image": "AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/nginx",
      "memory": 10,
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
            "awslogs-create-group": "true",
            "awslogs-group": "/ecs/nginx",
            "awslogs-region": "ap-northeast-1",
            "awslogs-stream-prefix": "ecs"
        },
        "secretOptions": []
      },
      "environment": [
        {
            "name": "PHP_HOST",
            "value": "localhost"
        }
      ]
    }
  ],
  "family": "laravel",
  "networkMode": "awsvpc",
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "256",
  "memory": "512",
  "runtimePlatform": {
    "cpuArchitecture": "ARM64",
    "operatingSystemFamily": "LINUX"
  }
}

何点かポイントを紹介します。

  • taskRoleArn

ECRへのアクセスに必要なので、ecsTaskExecutionRoleという名前のIAMロールを作成しています。

作成方法の詳細は、公式ページに記載があります。

Amazon ECS タスク実行IAM ロール - Amazon Elastic Container Service
タスク実行ロールは、ユーザーに代わってAWSAPIコールを実行するためのアクセス許可をAmazonECSコンテナとFargateエージェントに付与します。タスク実行IAMロールは、タスクの要件に応じて必要です。さまざまな目的とサービスのタスク実行ロールを、アカウントに複数関連付けることができます。アプリケーションの実行...
  • environment

Nginx設定ファイルの値を動的に指定しています。ローカル環境と共通の設定ファイルを使用するための工夫です。

同じタスクに属するコンテナでも、localhost インターフェイス経由での通信が可能になります。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/fargate-task-networking.html

タスク定義を登録します。

aws ecs register-task-definition --cli-input-json file://task-definition.json

サービスの設定

ECSサービスを作成し、Fargate上でのコンテナの実行を管理します。

今回は、以下を指定します。パブリックサブネット使用しています。

  • クラスター名:fargate-cluster
  • サービス名:laravel
  • タスク定義:作成済みのタスク定義
  • 作成数:1
  • サブネット:作成済みのサブネット
  • セキュリティグループ:作成済みのセキュリティグループ
aws ecs create-service --cluster fargate-cluster --service-name laravel --task-definition laravel:1 --desired-count 1 --launch-type "FARGATE" --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234],securityGroups=[sg-abcd1234],assignPublicIp=ENABLED}"

ECSサービスを確認し、以下のように表示されればOKです。

aws ecs list-services --cluster fargate-cluster

{
    "serviceArns": [
        "arn:aws:ecs:ap-northeast-1:account_id:service/fargate-cluster/laravel"
    ]
}

以下のようにservice.json ファイルを使用してサービスを作成することもできます。

{
  "cluster": "fargate-cluster",
  "serviceName": "laravel",
  "taskDefinition": "laravel:1",
  "launchType": "FARGATE",
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "assignPublicIp": "ENABLED",
      "securityGroups": [ "sg-abcd1234" ],
      "subnets": [ "subnet-abcd1234" ]
    }
  },
  "desiredCount": 1
}
aws ecs create-service \
     --cli-input-json file://service.json \
     --region ap-northeast-1

Fargate上のLaravelアプリの動作確認

最後に、動作確認をします。

指定されたURLやIPアドレスにアクセスして、Laravelアプリケーションが正しく動作することを確認します。

EC2コンソールのネットワークインターフェースから、対象のネットワークインタフェースを探して、パブリックIPを確認できます。

まとめ

この記事を通して、laravelアプリケーションのfargateのセットアップとデプロイの基本を理解できたことを願っています。ECS on Fargateは、Laravelアプリケーションのスケーラブルで効率的な運用を実現します。是非、実際のプロジェクトでの利用を検討してみてください。

さらに詳しく学びたい方は、以下の書籍がおすすめです。

nginx実践入門

Nginxの構築と運用に関する幅広い知識を得られます。リアルなユースケースを元にした具体例が豊富に紹介されており、初心者から上級者まで、あらゆるレベルのエンジニアにとって実際の問題解決に役立ちます。

Docker/Kubernetes 実践コンテナ開発入門

コンテナ技術をこれから学びたい方、あるいはすでに基本的な知識を持っているが実践的なスキルを伸ばしたい方に最適な書籍です。この書籍では、Dockerの基本操作から始まり、Kubernetesでのクラスタ管理、サービスの自動化、スケーリング、ネットワークの設定といった高度な内容に至るまで、手厚くガイドしてくれます。

PHPフレームワークLaravel Webアプリケーション開発 バージョン8.x対応

既にLaravelの基本を知っていてスキルアップを図りたい開発者にとって、かなりおすすめです。クリーンなコーディング、保守性、テストの容易さなど、Laravelの提供する現代的なWeb開発のベストプラクティスを体系的に学べる内容が含まれています。

効率的に学習するならプログラミングスクールの検討もありです。

PRUMエンジニア留学


PRUMエンジニア留学は、実践的なオンラインプログラミングスクールで、未経験者でもエンジニア転職や副業を目指せます。カリキュラムは実務レベルのチーム開発を含み、基礎から応用までを学べます。個別メンタリングや進捗可視化で学習をサポートし、エンジニアとしての実務経験とコミュニケーションスキルも身に付けられます。

Takaharu Niki

・Webエンジニア5年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする
AWS
Takaharu Nikiをフォローする
アントレプログラマー
タイトルとURLをコピーしました