パート PHP (Laravel) アプリケーションを Amazon ECS にデプロイする

DDD
リリース: 2024-10-20 06:07:02
オリジナル
171 人が閲覧しました

チュートリアル シリーズの最初の部分では、PHP (Laravel) アプリケーションを Amazon ECS にデプロイする手順を説明します。まず、Docker イメージを作成し、それを Amazon ECR にプッシュし、ECS タスク定義、ECS クラスター、ECS サービスを作成し、ドメイン名をサービスに接続します。

Docker と ECR の使用

Dockerfileとnginx構成を作成する

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 つのファイルを配置します。

  • ドッカー/エントリーポイント.sh
#!/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
ログイン後にコピー
  • docker/default.conf
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 を実行可能にします。

イメージを Amazon ECR にプッシュする

最初のステップは、イメージを ECR にプッシュすることです。アプリケーションを ECS にデプロイする前に、まずこの手順を手動で実行する必要があります。

ECRリポジトリを作成する

ECR リポジトリを作成するには、Amazon ECR コンソール に移動し、リポジトリの作成 をクリックし、リポジトリ名を入力します。この例では、demo-app.

を使用します。

Part  Deploying a PHP (Laravel) application to Amazon ECS

作成したら、リポジトリの URI をコピーします。この URI は後で必要になります。

イメージを ECR にプッシュします

作成したばかりのリポジトリを選択し、プッシュ コマンドの表示 をクリックして、ターミナルでコマンドを実行します。コマンドは次のようになります (必ず正しいリージョンを選択し、正しいアカウント 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 で正常にプッシュされたことを確認します。

Part  Deploying a PHP (Laravel) application to Amazon ECS

Amazon ECS の使用

ECS タスク定義の作成

次のステップは、ECR にプッシュしたばかりの Docker イメージを使用して ECS タスク定義を作成することです。
まず、Amazon ECS コンソール に移動し、タスク定義 で、新しいタスク定義の作成 をクリックします。

タスク定義に一意の名前を選択し (デモアプリを使用します)、起動タイプとして Fargate が選択されていることを確認します。現時点では、このセクションの他の内容は何も変更しないでください。

Container - 1 セクションまで下にスクロールし、次の値を入力します。

  • 名前: デモアプリ
  • 画像: 123456789012.dkr.ecr.us-east-1.amazonaws.com/demo-app:latest (前にコピーした独自の ECR URI に置き換えます)

後で、アプリケーションに応じてメモリと CPU の設定を調整することになるでしょう。必要に応じて、ここで環境変数と EFS ボリュームを追加することもできます。これについては別のチュートリアルで説明します。

Part  Deploying a PHP (Laravel) application to Amazon ECS

今のところ、このセクションの他の部分は何も変更しないでください。一番下までスクロールし、作成 をクリックします。

ECS クラスターを作成する

次に、ECS クラスターを作成する必要があります。クラスターは、作成したばかりのタスク定義で定義されたサービスを実行する場所です。

Amazon ECS コンソール に移動し、クラスタークラスターの作成 をクリックし、クラスター名を入力して、必ず AWS を選択しますインフラストラクチャとしての Fargate (サーバーレス):

Part  Deploying a PHP (Laravel) application to Amazon ECS

クラスターの作成には数分かかります。特に新しいアカウントの場合、クラスターの作成が失敗することがあります。数分待ってから、別のクラスター名を選択して再試行してください。

ECSサービスを作成する

作成したクラスターを開き、サービス テーブルまで下にスクロールし、作成 をクリックして、次の値を入力します。

  • ファミリー: デモアプリ
  • リビジョン: 1 (このままにしておきます)
  • サービス名: デモアプリ

Part  Deploying a PHP (Laravel) application to Amazon ECS

まだ 作成 をクリックしないでください。

ロードバランサを追加する

おそらく HTTPS 経由でアプリケーションを提供しているため、ロード バランサーを追加する必要があります。これを後で行うことはできません。

ネットワーク セクションまで下にスクロールし、サービスをデプロイする VPC を選択します。 VPC に、インターネット ゲートウェイ が接続された パブリック サブネット があることを確認してください。 VPC がない場合は、[新しい VPC の作成] をクリックし、ウィザードに従って VPC を作成できます。

VPC を選択したら、読み続けてください。

ロード バランシング セクションまで下にスクロールし、Application Load Balancer を選択し、新しいロード バランサーの作成 オプションを選択します。

このオプションが利用できない場合は、前のステップで VPC を選択しなかった可能性があります。

次の値を調整します:

  • ロードバランサ名:demo-app-alb
  • ヘルスチェック猶予期間: 300 (アプリが起動して安定するように、これを 300 秒、つまり 5 分に設定することをお勧めします)

リスナー セクションで、新しいリスナーの作成 オプションを選択したままにしますが、ポート 443 と HTTPS プロトコルを使用するように値を調整します。この選択を確認するには、使用するドメインの ACM 証明書が必要です。入手方法の詳細については、AWS ドキュメントを参照してください。

Part  Deploying a PHP (Laravel) application to Amazon ECS

ターゲット グループ セクションで、次の値を調整します:

  • プロトコル: HTTP (デフォルトです。nginx コンテナはポート 80 でリッスンしているため、必ずこれを維持してください)
  • 登録解除遅延: 60 (展開を少し速くするために、デフォルトの 5 分ではなく、これを 60 秒に設定することをお勧めします)
  • ヘルスチェックパス: / (アプリ内で特別に作成した /healthcheck などのルートにこれを設定することをお勧めします。今のところはデフォルトのままで構いません)

Part  Deploying a PHP (Laravel) application to Amazon ECS

作成をクリックします。

サービスステータスを確認する

サービスが サービス テーブルに表示されるまでに数分かかる場合があります。新しいサービスがすぐに表示されない場合は、少し待ってページを更新してください。

すべてがうまくいけば、サービス テーブルにサービスがリストされ、アクティブデプロイメントとタスク が 1/1 を示していることがわかります。実行中のタスク。

デプロイメントエラーは次のように表示されます:

Part  Deploying a PHP (Laravel) application to Amazon ECS

デプロイメント エラーをデバッグするには、サービスを開いて、Deployments タブをクリックします。 イベント セクションまで下にスクロールし、最後に開始したタスクの ID をクリックします。タスク実行の ログ セクションには、何が問題だったかの詳細が表示されます。

Laravel は通常、ストレージフォルダー構造が不完全である (例: フレームワーク、キャッシュ、セッションのいずれかが欠落している) と文句を言います。この問題を解決するために EFS ボリュームをタスク定義にアタッチする方法については、別のチュートリアルで説明します。

ドメイン名をサービスに接続する

おそらく、デプロイしたばかりのサービスにドメイン名を接続したいと考えているでしょう。前のステップで、インターネット トラフィックをサービスにルーティングする役割を担う AWS コンポーネントである Application Load Balancer をすでに作成しました。

エンドユーザーとロードバランサー間のトラフィックの暗号化に使用される ACM 証明書もすでにプロビジョニングされています。

プロセスを完了し、公共のインターネットから HTTPS 経由でアプリケーションにアクセスできるようにするには、ドメイン名がロード バランサーを指す DNS レコードを作成する必要があります。このプロセスは、使用している DNS プロバイダーによって異なります。詳細については、ドキュメントを参照してください。

まず、Application Load Balancer の DNS 名を取得します。 AWS コンソールの検索バー (macOS ではオプション S) に移動し、「ロード バランサー」と入力して、ロード バランサー (EC2 機能) を選択します。ドメイン名を接続するために必要なロード バランサーのテーブルが表示されます:

Part  Deploying a PHP (Laravel) application to Amazon ECS

ロード バランサーの DNS 名をコピーします。

Route 53 を使用している場合は、次の手順に従ってください:

  • Route 53 コンソール に移動し、ホスト ゾーン をクリックして、ドメイン名を選択します。
  • レコードの作成 ボタンをクリックします。
  • レコード タイプを A に設定します。
  • エイリアス オプションをチェックします。
  • トラフィックのルーティング先フィールドで、アプリケーションおよびクラシック ロード バランサーへのエイリアスを選択し、ロード バランサーのリージョンを選択します。
  • ロード バランサーの選択 ドロップダウンから、ドメイン名を接続する必要があるロード バランサーを選択します。複数のロード バランサーがある場合は、ドロップダウンから選択したロード バランサーが、前にコピーしたロード バランサーの DNS 名と一致する必要があることを確認してください。
  • ターゲットの健康状態の評価をオフにします。
  • レコードの作成をクリックします。

Route 53 を使用していない場合:

詳細については、DNS プロバイダーのドキュメントを参照してください。おそらく、ターゲット/値としてロード バランサーの DNS 名を持つ CNAME レコードを作成する必要があります。

おめでとう

DNS レコードを作成したら、それが伝播されるまで数分待ってから、ドメイン名を介してアプリケーションにアクセスしてみます。

おめでとうございます! これで、PHP (Laravel) アプリケーションが AWS ECS に正常にデプロイされました。

このチュートリアル シリーズで近日公開予定

  • Laravel のストレージフォルダー構造の問題を修正するために EFS ボリュームをタスク定義にアタッチする
  • AWS CodePipeline を使用して新しいコードをサービスに自動的にデプロイする
  • AWS CDK を使用したインフラストラクチャのプロビジョニングの自動化

以上がパート PHP (Laravel) アプリケーションを Amazon ECS にデプロイするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!