「AWS へのデプロイ、何から手をつければいい?」そんな悩みを抱えていませんか?本記事では、Laravel + React プロジェクトを AWS ECS (Fargate) へデプロイするための、実務に即したインフラ設計と Docker 構成を徹底解説します。この記事を読むことで、スケーラブルでメンテナンス性の高い本番環境を最短で構築する術が身につきます。
AWS ECS (Fargate) を採用する技術的背景
モダンな Web アプリケーション開発において、サーバーの管理を意識せずに済む サーバーレスコンテナ (Fargate) は、運用負荷を劇的に軽減する選択肢です。
今回の構成では、CloudFormation による IaC (Infrastructure as Code) を導入し、ネストされたスタック構造(main.yml から 00-vpc.yml〜40-ecs.yml を呼び出し)でインフラを管理します。これにより、誰でも同じ環境を再現できる「構成の透明性」を確保することが可能です。
インフラ構成と主要リソース
ALB (Application Load Balancer) を入り口とし、ECS Fargate 上で Laravel コンテナを稼働させます。
- VPC / ネットワーク: CIDR
10.0.0.0/16、2つの Public サブネットに配置。 - Security Groups: HTTP(80)を許可する
SGWeb、およびそこからのアクセスのみを許可するSGMysql。 - ECS Fargate: タスク定義は CPU 256 / Memory 512。
AssignPublicIp: ENABLEDで構成。 - RDS (MySQL 8.0):
db.t3.micro、ストレージ 20GB。 - S3 (ImageBucket): 静的ファイル公開用。バケットポリシーで公開読み取りを許可。
- CloudWatch Logs:
/ecs/ロググループにて 7 日間のリテンション設定。
作成したCloudFormationのテンプレート例はこちら
クイック対談
エンジニアマルチステージビルドを採用することで、フロントエンドのビルド環境を最終イメージに含めず、軽量でセキュアなコンテナを実現しています。
デザイナーインフラが安定していると、私たちが作成した UI/UX がユーザーにストレスなく届くので、オートスケーリングの安心感は大きいですね。
実装例・コード
ECS 向けに最適化された Dockerfile(docker/aws/Dockerfile)の構成例です。ビルドコンテキストはリポジトリルートを想定し、.dockerignore で不要なファイルを適切に除外します。
# --- Stage 1: Node.js (Frontend Build) ---
FROM node:18 AS node-build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --legacy-peer-deps
COPY resources/js ./resources/js
COPY resources/css ./resources/css
RUN npm run build --if-present
# --- Stage 2: Composer (PHP Dependencies) ---
FROM composer:2 AS composer
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --prefer-dist --no-scripts --no-interaction --optimize-autoloader
# --- Stage 3: Final Runtime (Apache + PHP) ---
FROM php:8.1-apache
RUN apt-get update && apt-get install -y libzip-dev unzip git zip \
&& docker-php-ext-install pdo_mysql zip \
&& a2enmod rewrite
WORKDIR /var/www/html
# アーティファクトのコピー
COPY --from=composer /app /var/www/html
COPY --from=node-build /app/public/build /var/www/html/public/build
# 権限設定
RUN chown -R www-data:www-data /var/www/html && chmod -R 755 /var/www/html/storage
EXPOSE 80
CMD ["apache2-foreground"]
デプロイの手順と Makefile の活用
既存の Makefile ターゲットを利用することで、複雑な CLI コマンドを簡略化できます。
- ECR ログイン & イメージプッシュ
make aws-build # イメージ作成&ECR へのプッシュ make aws-deploy # Cfnを利用したAWSへのデプロイ実行 - インフラ構築・更新CloudFormation でスタックを作成。
ImageTagパラメータでデプロイするイメージを指定します。 - マイグレーションの実行 (ECS Exec)
EnableExecuteCommand: trueを活かし、起動中のコンテナ内でコマンドを実行します。aws ecs execute-command --cluster <ClusterName> \ --task <TaskID> --container app --interactive --command "php artisan migrate --force"
イメージ作成&ECR へのプッシュ
echo "🔐 Logging in to ECR..."
$AWS_CLI_CMD aws ecr get-login-password --region "$AWS_DEFAULT_REGION" | docker login --username AWS --password-stdin "$ECR_DOMAIN"
echo "🏗️ Building Docker image..."
docker build --platform linux/amd64 -t "$APP_NAME" -f "$DOCKER_HOME/app/Dockerfile.ecs" "$BASE_DIR"
echo "🏷️ Tagging image..."
docker tag "${APP_NAME}:latest" "$IMAGE_URI"
echo "🚀 Pushing image to ECR..."
docker push "$IMAGE_URI"
Cfnを利用したAWSへのデプロイ実行
echo "Starting CloudFormation deployment for stack: ${APP_NAME}..."
echo "Using template: ${TEMPLATE_URL}"
$AWS_CLI_CMD aws cloudformation create-stack \
--stack-name "${APP_NAME}-stack" \
--template-body "file://docker/aws/template/main.yml" \
--parameters \
ParameterKey=ProjectName,ParameterValue="$APP_NAME" \
ParameterKey=Environment,ParameterValue=dev \
ParameterKey=TemplateURL,ParameterValue="https://${APP_NAME}-cfm-template.s3.ap-northeast-1.amazonaws.com/" \
ParameterKey=ImageTag,ParameterValue=latest \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM \
--disable-rollback \
--region ap-northeast-1
echo "Deployment process finished. Please check the AWS Console for status."
運用上の注意点とベストプラクティス
- セキュリティ: 現在のテンプレートでは DB 認証情報等が平文で記載されています。本番運用では AWS Secrets Manager への移行を強く推奨します。
- ネットワーク: 運用要件に応じ、RDS をプライベートサブネットへ配置する構成への変更を検討してください。
- クリーンアップ: 不要になったリソースは CloudFormation スタックを削除することで一括削除が可能ですが、S3 バケット内のオブジェクトや ECR イメージは別途削除が必要な場合があります。
まとめ
- IaC (CloudFormation) の活用: ネストスタックで管理し、環境構築のミスを防止。
- Docker イメージの最適化: マルチステージビルドでデプロイ高速化と軽量化を両立。
- ECS Exec による運用: 踏み台サーバー不要で、安全にマイグレーションを実行。