!> 12月10日に開始したばかりです
?> 生成AIも活用して記載しています
!> Important notice with inline code and additional placeholder text used
to force the content to wrap and span multiple lines.
?> Tip notice with inline code and additional placeholder text used to
force the content to wrap and span multiple lines.
!> 簡単にLaravelでプロジェクトを作成し試すことをお勧めします
- マニュアルの目的
- AWS環境を活用し、LaravelアプリケーションをEC2にデプロイする基本的な手順を習得する。
- インフラ構成要素(ALB, EC2, S3, RDS, SES, CloudWatch)の連携を理解する。
- ALBの役割
ALBは、ユーザーから送られてくるリクエスト(HTTP/HTTPS)を複数のEC2インスタンスやコンテナサービス(ECSやEKS)に均等に分散します。これにより、次のようなメリットがあります:
- サーバー負荷のバランスを保つ
- サーバーダウンによるサービス停止のリスクを軽減
- リソースの効率的な利用
ALBはリクエスト内容に基づいて柔軟なルーティングを行えます。
- パスベースルーティング ?> 例:/api/*のリクエストはバックエンドのAPIサーバーへ、/static/*はS3や別のサーバーへ送る。
- ホストベースルーティング ?>例:api.example.comはAPIサーバーに、www.example.comはフロントエンドサーバーにリクエストを振り分ける。
- HTTPヘッダーやメソッドに基づくルーティング
- ヘッダーやクエリパラメータに基づいてターゲットを切り替える。
ALBはAWS Auto Scalingと連携可能です。トラフィックが増加すると自動的に新しいインスタンスを追加し、負荷に応じてサーバーの数を調整します。
ALBには以下のセキュリティ関連の機能があります:
- HTTPSによる通信の暗号化
- SSL証明書を利用して通信を暗号化する。
- AWS WAF(Web Application Firewall)との統合
- 不正なリクエストをブロックする。
- セキュリティグループとの連携
- 特定のIPやポートからの接続を制限する。
ALBはバックエンドのターゲット(EC2インスタンスやコンテナ)が正常に動作しているかを定期的に確認します。
異常なターゲットへのリクエスト送信を停止。 ターゲットが復旧すると、自動的にトラフィックを再開。 6. ログとモニタリング ALBは以下の監視機能を提供し、運用管理を支援します:
アクセスログ リクエストの詳細情報(元のIP、リクエストURI、レスポンスコードなど)を記録。 CloudWatchとの統合 メトリクス(リクエスト数、エラー率、ターゲットの応答時間など)を可視化。 ALBを利用するメリット 高可用性 負荷分散により、サーバー障害が発生してもサービスを継続できる。 スケーラビリティ トラフィック量に応じた動的なスケーリングが可能。 運用効率 自動化されたヘルスチェックやルーティングによる管理の簡略化。 柔軟性 アプリケーションの構造やリクエスト内容に応じたきめ細かいルーティング設定。 実際の利用例 ECサイト 高トラフィック時に複数のEC2インスタンスで負荷を分散。 特定のサブドメインで異なるサービスを提供。 マイクロサービス APIゲートウェイとして機能し、各サービスにリクエストを振り分ける。 SaaSアプリケーション エンドユーザーに対する高可用性の提供。
- ALBの設定とLaravelアプリとの連携方法
ALB(Application Load Balancer)を使ってLaravelアプリを公開するには、以下の手順を行います。ALBの役割は、ユーザーのリクエストを適切に分散し、Laravelアプリが効率的に動作するようにサポートすることです。
- AWS Management Consoleにログイン。
- サービスメニューからEC2 > ロードバランサーを選択。
- ロードバランサーの作成をクリックし、次を設定:
- 種類: Application Load Balancer(ALB)を選択。
- リスナー: HTTP(ポート80)またはHTTPS(ポート443)。
- サブネット: アプリが展開されるリージョン内で、最低2つのサブネットを選択(異なるアベイラビリティゾーンから選択する)。
- ターゲットグループは、ALBがリクエストを送る宛先(EC2インスタンス)を定義します。
- ターゲットグループの作成:
- タイプ: インスタンスを選択。
- ターゲットの健康状態チェック: HTTPを選択し、パスに
/または/health-checkを設定(後述のLaravel設定でこのパスが動作するようにする)。
- 作成後、ターゲットグループにEC2インスタンスを登録。
- ALB作成時に、ターゲットグループを選択します。
- リスナー(HTTP/HTTPS)ごとにターゲットグループを割り当てます。
- EC2インスタンスを起動し、必要な環境(PHP、Composer、Laravel)をセットアップ。
- LaravelアプリをEC2インスタンスにデプロイ。
- デプロイ方法として
Deployerや手動アップロードを利用可能。
- デプロイ方法として
.envファイルでアプリケーションの設定を更新:- 必要に応じて以下を設定:
APP_ENV=production APP_DEBUG=false APP_URL=http://<ALBドメイン名>
- 必要に応じて以下を設定:
ALBはターゲットの健康状態をチェックします。Laravelでヘルスチェック用のルートを用意します。
routes/web.phpに以下を追加:Route::get('/health-check', function () { return response()->json(['status' => 'OK'], 200); });
- ターゲットグループの健康チェックパスを
/health-checkに設定。
- EC2インスタンスのセキュリティグループでALBからのトラフィックを許可します。
- ポート80(HTTP)または443(HTTPS)をALBのセキュリティグループからのみ許可。
HTTPSを有効化する場合、SSL証明書が必要です。AWSでは**AWS Certificate Manager(ACM)**を利用して無料の証明書を取得できます。
- ACMから証明書を作成し、ALBに適用。
- ALBのリスナーでポート443を設定し、SSL証明書を適用。
.envファイルで以下を設定:
FORCE_HTTPS=true
AppServiceProviderでHTTPSリダイレクトを有効化:
use Illuminate\Support\Facades\URL;
public function boot()
{
if (env('FORCE_HTTPS', false)) {
URL::forceScheme('https');
}
}- ブラウザでALBのドメイン(例:
http://<ALBドメイン名>)にアクセス。 - Laravelアプリが表示されるか確認。
/health-checkにアクセスし、{"status":"OK"}が返されるか確認。
- ALBのアクセスログやCloudWatchのログを確認し、問題がないかチェック。
- セッションの共有:
- ALBを使う場合、複数のEC2インスタンスでセッションを共有する必要があります。LaravelではRedisやDynamoDBを使ってセッションを保存できます。
.envで設定:SESSION_DRIVER=redis
- キャッシュの設定:
- キャッシュも共有することで、複数のインスタンス間で一貫性を保ちます。
- EC2の役割
EC2(Amazon Elastic Compute Cloud)は、AWSが提供する仮想サーバーサービスで、Laravelのようなアプリケーションを動作させるための「基盤」となるサーバーで、アプリのコードや必要なソフトウェアをインストールする場所です。ALBと連携することで、ユーザーからのリクエストを効率よく処理し、スムーズにアプリケーションを運用できます。スケーラブルで柔軟な環境を提供するため、Laravelアプリの運用には最適です。
-
アプリケーションを動かすためのサーバー
EC2は、Laravelアプリケーションを動作させるための「コンピュータ」としての役割を果たします。- 例)Laravelアプリのコードや、PHP、MySQLなどのソフトウェアをインストールする場所。
-
カスタマイズ可能なサーバー環境
- 必要なOS(Amazon Linux、Ubuntuなど)やソフトウェアを自由にインストールできます。
- Laravelが必要とする環境(PHP, Composer, Webサーバー)を構築できます。
-
スケーラブルなサーバー
- サーバーの性能(CPUやメモリ)をアプリの規模に応じて柔軟に変更可能。
- トラフィックが増えた場合に新しいEC2インスタンスを追加することで負荷分散ができます。
-
ALBと連携するバックエンド
- ALB(ロードバランサー)が受け取ったリクエストをEC2に振り分け、Laravelアプリが処理を行います。
LaravelアプリケーションをEC2上で動作させる流れを解説します。
- EC2インスタンスを起動してサーバー環境を用意します。
- OSの選択(Amazon LinuxやUbuntuが一般的)。
- 必要なソフトウェアのインストール(例:PHP, Composer, MySQL, Nginx/Apache)。
- EC2にLaravelアプリをアップロードします。
- 方法例:SSHで接続してコードを手動アップロードする、またはGitを使ってデプロイ。
.envファイルを設定し、アプリケーションの環境を構成します。
- Laravelアプリが動作するよう、Webサーバー(NginxまたはApache)を設定します。
- 例)Nginxの場合、以下のような設定を追加:
server { listen 80; server_name your-ec2-public-ip; root /path/to/laravel/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
- 例)Nginxの場合、以下のような設定を追加:
- EC2をターゲットグループに登録し、ALBがEC2へのリクエストを振り分けるよう設定します。
- ヘルスチェック用のエンドポイントをLaravelで用意(例:
/health-check)。
- ブラウザでALBのドメイン名(またはEC2のIPアドレス)にアクセスし、Laravelアプリが正しく表示されるか確認します。
- 柔軟性
自由にサーバー環境をカスタマイズ可能。 - コスト効率
必要な性能に応じてインスタンスサイズを選べる。 - スケーラビリティ
トラフィックが増えた場合にインスタンスを追加することで負荷分散が可能。 - AWSサービスとの連携
ALB、RDS(データベース)、S3(ストレージ)などと連携して、効率的な運用ができる。
- EC2インスタンスのセットアップ手順
- Amazon Linux 2またはUbuntuの選定
- 必要なパッケージ(PHP, Composer, Gitなど)のインストール
- S3の利用目的
- 静的ファイル(画像やCSS)の管理
- S3バケットの作成と設定方法
- RDSのセットアップ
- MySQLまたはPostgreSQLの設定
- Laravelの環境ファイル(
.env)との接続設定
- SESのセットアップ
- メール送信ドメインの認証
- Laravelアプリケーションとの統合
- CloudWatchの役割
- ログの統合とSlack通知設定
- ALBログの収集と分析
- SSHの基本操作
- 秘密鍵・公開鍵の生成
- EC2への接続方法
- Deployerのインストール
- Deployerの設定ファイル(
deploy.php)の作成方法
- GitHub Actionsの基本構造
- ワークフロー(
.github/workflows)の作成
- ワークフロー(
- サーバーへの接続設定
- シークレット(Secrets)の利用
- Laravelアプリケーションのローカル開発環境構築
.envファイルの設定
- ローカル環境でのデプロイ実行
- SSH接続を利用したサーバーへの簡易デプロイテスト
- GitHubリポジトリで必要な環境変数の登録
- SSH鍵
- AWSの認証情報(Access Key, Secret Key)
- LaravelプロジェクトをデプロイするGitHub Actionsのワークフロー作成
- Deployerコマンドの自動実行設定
- Deployerを使用したテストデプロイ手順
- エラー対応例
- ワークフロー実行方法
- 成功時・失敗時の対応方法
- ログ収集とアラート設定
- Slack通知の実装方法
- 新たなエラー発生時のトラブルシューティング方法
- 新機能追加時のデプロイ手順更新