チュートリアル シリーズの最初の部分では、PHP (Laravel) アプリケーションを Amazon ECS にデプロイする手順を説明します。まず、Docker イメージを作成し、それを Amazon ECR にプッシュし、ECS タスク定義、ECS クラスター、ECS サービスを作成し、ドメイン名をサービスに接続します。
git リポジトリのルートに、次の内容の Dockerfile を作成します。
# Use the official PHP-FPM image as the base FROM public.ecr.aws/docker/library/php:fpm # Define a user variable ARG user=www-data # Install system dependencies and PHP extensions RUN apt-get update && apt-get install -y \ git curl \ libpng-dev \ libonig-dev \ libxml2-dev \ zip unzip libzip-dev \ nginx \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && docker-php-ext-install \ pdo_mysql \ mbstring \ exif \ pcntl \ bcmath \ gd \ zip # Install Composer COPY --from=public.ecr.aws/composer/composer:latest-bin /usr/bin/composer /usr/bin/composer # Create a system user for running Composer and Artisan commands RUN mkdir -p /home/$user/.composer && \ chown -R $user:$user /home/$user # Copy Nginx configuration and entrypoint script COPY ./docker/default.conf /etc/nginx/sites-enabled/default COPY ./docker/entrypoint.sh /etc/entrypoint.sh # Make the entrypoint script executable RUN chmod +x /etc/entrypoint.sh # Set the working directory WORKDIR /var/www # Copy the application code COPY --chown=www-data:www-data . /var/www # Install PHP dependencies RUN composer install # Expose port 80 EXPOSE 80 # Define the entrypoint ENTRYPOINT ["/etc/entrypoint.sh"]
docker という名前の新しいフォルダーを作成し、その中に次の 2 つのファイルを配置します。
#!/usr/bin/env bash # Start Nginx service service nginx start # Run Laravel migrations php artisan migrate --force # Create symbolic link for storage php artisan storage:link # Clear and optimize the application cache php artisan optimize:clear php artisan optimize # Start PHP-FPM php-fpm
server { listen 80 default_server; index index.php index.html; server_name localhost; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/public; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_hide_header X-Powered-By; # Tells PHP we're using a reverse proxy with TLS termination fastcgi_param HTTPS on; fastcgi_param HTTP_X_FORWARDED_PROTO $scheme; fastcgi_param HTTP_X_FORWARDED_SSL on; add_header Content-Security-Policy "upgrade-insecure-requests" always; } location / { try_files $uri $uri/ /index.php?$query_string; } }
そして、chmod x docker/entrypoint.sh を実行して、entrypoint.sh を実行可能にします。
最初のステップは、イメージを ECR にプッシュすることです。アプリケーションを ECS にデプロイする前に、まずこの手順を手動で実行する必要があります。
ECR リポジトリを作成するには、Amazon ECR コンソール に移動し、リポジトリの作成 をクリックし、リポジトリ名を入力します。この例では、demo-app.
を使用します。作成したら、リポジトリの URI をコピーします。この URI は後で必要になります。
作成したばかりのリポジトリを選択し、プッシュ コマンドの表示 をクリックして、ターミナルでコマンドを実行します。コマンドは次のようになります (必ず正しいリージョンを選択し、正しいアカウント ID を使用してください):
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com docker build -t demo-app . docker tag demo-app:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/demo-app:latest docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/demo-app:latest
コマンドが正常に実行されたら、Amazon ECR コンソール に戻り、リポジトリに入り、イメージがタグlatest で正常にプッシュされたことを確認します。
次のステップは、ECR にプッシュしたばかりの Docker イメージを使用して ECS タスク定義を作成することです。
まず、Amazon ECS コンソール に移動し、タスク定義 で、新しいタスク定義の作成 をクリックします。
タスク定義に一意の名前を選択し (デモアプリを使用します)、起動タイプとして Fargate が選択されていることを確認します。現時点では、このセクションの他の内容は何も変更しないでください。
Container - 1 セクションまで下にスクロールし、次の値を入力します。
後で、アプリケーションに応じてメモリと CPU の設定を調整することになるでしょう。必要に応じて、ここで環境変数と EFS ボリュームを追加することもできます。これについては別のチュートリアルで説明します。
今のところ、このセクションの他の部分は何も変更しないでください。一番下までスクロールし、作成 をクリックします。
次に、ECS クラスターを作成する必要があります。クラスターは、作成したばかりのタスク定義で定義されたサービスを実行する場所です。
Amazon ECS コンソール に移動し、クラスター で クラスターの作成 をクリックし、クラスター名を入力して、必ず AWS を選択しますインフラストラクチャとしての Fargate (サーバーレス):
クラスターの作成には数分かかります。特に新しいアカウントの場合、クラスターの作成が失敗することがあります。数分待ってから、別のクラスター名を選択して再試行してください。
作成したクラスターを開き、サービス テーブルまで下にスクロールし、作成 をクリックして、次の値を入力します。
まだ 作成 をクリックしないでください。
おそらく HTTPS 経由でアプリケーションを提供しているため、ロード バランサーを追加する必要があります。これを後で行うことはできません。
ネットワーク セクションまで下にスクロールし、サービスをデプロイする VPC を選択します。 VPC に、インターネット ゲートウェイ が接続された パブリック サブネット があることを確認してください。 VPC がない場合は、[新しい VPC の作成] をクリックし、ウィザードに従って VPC を作成できます。
VPC を選択したら、読み続けてください。
ロード バランシング セクションまで下にスクロールし、Application Load Balancer を選択し、新しいロード バランサーの作成 オプションを選択します。
このオプションが利用できない場合は、前のステップで VPC を選択しなかった可能性があります。
次の値を調整します:
リスナー セクションで、新しいリスナーの作成 オプションを選択したままにしますが、ポート 443 と HTTPS プロトコルを使用するように値を調整します。この選択を確認するには、使用するドメインの ACM 証明書が必要です。入手方法の詳細については、AWS ドキュメントを参照してください。
ターゲット グループ セクションで、次の値を調整します:
作成をクリックします。
サービスが サービス テーブルに表示されるまでに数分かかる場合があります。新しいサービスがすぐに表示されない場合は、少し待ってページを更新してください。
すべてがうまくいけば、サービス テーブルにサービスがリストされ、アクティブ と デプロイメントとタスク が 1/1 を示していることがわかります。実行中のタスク。
デプロイメントエラーは次のように表示されます:
デプロイメント エラーをデバッグするには、サービスを開いて、Deployments タブをクリックします。 イベント セクションまで下にスクロールし、最後に開始したタスクの ID をクリックします。タスク実行の ログ セクションには、何が問題だったかの詳細が表示されます。
Laravel は通常、ストレージフォルダー構造が不完全である (例: フレームワーク、キャッシュ、セッションのいずれかが欠落している) と文句を言います。この問題を解決するために EFS ボリュームをタスク定義にアタッチする方法については、別のチュートリアルで説明します。
おそらく、デプロイしたばかりのサービスにドメイン名を接続したいと考えているでしょう。前のステップで、インターネット トラフィックをサービスにルーティングする役割を担う AWS コンポーネントである Application Load Balancer をすでに作成しました。
エンドユーザーとロードバランサー間のトラフィックの暗号化に使用される ACM 証明書もすでにプロビジョニングされています。
プロセスを完了し、公共のインターネットから HTTPS 経由でアプリケーションにアクセスできるようにするには、ドメイン名がロード バランサーを指す DNS レコードを作成する必要があります。このプロセスは、使用している DNS プロバイダーによって異なります。詳細については、ドキュメントを参照してください。
まず、Application Load Balancer の DNS 名を取得します。 AWS コンソールの検索バー (macOS ではオプション S) に移動し、「ロード バランサー」と入力して、ロード バランサー (EC2 機能) を選択します。ドメイン名を接続するために必要なロード バランサーのテーブルが表示されます:
ロード バランサーの DNS 名をコピーします。
Route 53 を使用している場合は、次の手順に従ってください:
Route 53 を使用していない場合:
詳細については、DNS プロバイダーのドキュメントを参照してください。おそらく、ターゲット/値としてロード バランサーの DNS 名を持つ CNAME レコードを作成する必要があります。
DNS レコードを作成したら、それが伝播されるまで数分待ってから、ドメイン名を介してアプリケーションにアクセスしてみます。
おめでとうございます! これで、PHP (Laravel) アプリケーションが AWS ECS に正常にデプロイされました。
以上がパート PHP (Laravel) アプリケーションを Amazon ECS にデプロイするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。