🎉

Laravel + EC2 + RDS + GitHub ActionsでCD構築した備忘録

に公開

CD環境メモ

Laravel12 + PHP8.2のDocker環境をEC2上に置き、RDS(MySQL) に接続、GitHub Actionsでpushすると自動でCDされる環境を作ったので、その歩みをまとめました。


コンセプト

  • Laravel12 / PHP8.2 (Docker)
  • Amazon EC2 (Amazon Linux 2023)
  • RDS (MySQL 8.0)
  • GitHub Actions

1. EC2にLaravel + Docker環境構築

Docker構成:

docker-compose.yml

services:
  app:
    build: ./infra/php
    volumes:
      - ./src:/data
  web:
    image: nginx:1.20-alpine
    ports:
      - 80:80
    volumes:
      - ./src:/data
      - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: laravel
      MYSQL_USER: phper
      MYSQL_PASSWORD: secret
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

PHP Dockerfile:

FROM php:8.2-fpm-bullseye

RUN apt-get update && \
    apt-get install -y git unzip libzip-dev libicu-dev libonig-dev && \
    docker-php-ext-install pdo_mysql intl zip bcmath

COPY --from=composer:2.2 /usr/bin/composer /usr/bin/composer

2. RDS(MySQL) の構築

  • DBエンジン: MySQL 8.0
  • インスタンスタイプ: db.t3.micro (free tier)
  • セキュリティグループ設定:
    • EC2からRDSの3306ポートへの通信を許可

.env は以下:

DB_CONNECTION=mysql
DB_HOST=<RDSエンドポイント>
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=admin
DB_PASSWORD=<your-password>

検証が終わったら、Secretsに移行


3. Laravelのパーミッション設定

sudo chown -R nginx:nginx storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
php artisan config:clear
php artisan config:cache
php artisan migrate --force

4. GitHub Actions での CD

1) SSH鍵の登録(GitHubからEC2にSSHするための準備)

🔑 秘密鍵/公開鍵の作成手順

ローカル(Macなど)で以下を実行:

ssh-keygen -t ed25519 -C "github-deploy-key"
# ファイル保存場所は例: ~/.ssh/github-ec2

続いて:

cat ~/.ssh/github-ec2.pub

↑ これをコピーして、EC2側の ~/.ssh/authorized_keys に追記

GitHubには秘密鍵の中身を登録:

cat ~/.ssh/github-ec2

🔐 GitHub Secrets に登録する値

  • EC2_SSH_KEY : 上記の秘密鍵の中身すべて
  • EC2_HOST : EC2のパブリックIP
  • EC2_USER : ec2-user

2) deploy.yml

name: Deploy to EC2

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Add SSH key
        uses: webfactory/ssh-agent@v0.7.0
        with:
          ssh-private-key: ${{ secrets.EC2_SSH_KEY }}

      - name: Deploy via SSH
        run: |
          ssh -o StrictHostKeyChecking=no ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << 'EOF'
            cd /var/www/laravel/src
            git pull origin main
            composer install --no-dev --optimize-autoloader
            php artisan migrate --force
          EOF

まとめ

  • LaravelをEC2に置いて、RDSと連携
  • GitHub Actionsでpush すると自動deploy

Discussion