こんにちは、ニキです。
ECS (Elastic Container Service) on Fargateは、コンテナの運用を実現するAWSのサービスです。この記事では、LaravelアプリケーションとNginxをECS on Fargateにデプロイする手順を紹介します。
事前準備
まず、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ロールを作成しています。
作成方法の詳細は、公式ページに記載があります。
- environment
Nginx設定ファイルの値を動的に指定しています。ローカル環境と共通の設定ファイルを使用するための工夫です。
同じタスクに属するコンテナでも、
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/fargate-task-networking.htmllocalhost
インターフェイス経由での通信が可能になります。
タスク定義を登録します。
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アプリケーションのスケーラブルで効率的な運用を実現します。是非、実際のプロジェクトでの利用を検討してみてください。