ECS | さゆフィクション http://it.kensan.net/it aws wordpress などなどゆるーく書いてます Sun, 30 Jun 2024 04:16:49 +0000 ja hourly 1 https://wordpress.org/?v=6.5.2 https://it.kensan.net/wp-content/uploads/2023/03/cropped-icon-32x32.png ECS | さゆフィクション http://it.kensan.net/it 32 32 Laravel11をECS-Fagateにデプロイする https://it.kensan.net/laravel11-ecs-fagate-deploy.html Sun, 12 May 2024 07:14:00 +0000 http://13.231.204.68/it/?p=1888 Laravel11をECS(Amazon Elastic Container Service)-Fagateにデプロイします!!!

以下の順で進めていきます。今回はとりあえずFargate上で動くことをゴールにしますので、MySQLは使いません。

  1. ローカルでLaravel11を立ち上げる
  2. ECR(Amazon Elastic Container Registry)にLaravelイメージをpushする
  3. ECRのイメージを使って、ECS(Amazon Elastic Container Service)-Fagateにデプロイ

まずは、ローカルでLaravel11を起動していきます。

ローカルでLaravel11を起動する

まずは、完成系のディレクトリ構成から記載します。

ディレクトリ構成

以下のような構成となります。


├── docker
│   ├── nginx
│   │   ├── Dockerfile
│   │   └── default.conf
│   └── php
│       └── Dockerfile
└── docker-compose.yml

ディレクトリの作成

上記ディレクトリ構成を作成するためのディレクトリを作成します。

mkdir fargate_laravel
cd fargate_laravel/

準備はできましたので、ディレクトリ構成に記載のディレクトリとファイルを作成していきます。

docker-compose.ymlの作成

docker-compose.ymlを作成します。

vi docker-compose.yml

<ファイルの中身>


version: '3'
services:
  app:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    container_name: app_laravel
    volumes:
      - .:/var/www
  nginx:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    container_name: nginx_laravel
    ports:
      - 8000:80
    working_dir: /var/www
    depends_on:
      - app

nginxのdefault.confを作成

nginxのdefault.confを作成します。

mkdir -p docker/nginx

vi docker/nginx/default.conf

<ファイルの中身>


server {
  listen 80;
  root /var/www/laravel-project/public;
  index index.php;
  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }
  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;   # 正常に動作しない場合は、app:9000に書き換える
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}

nginxのDockerfileの作成

nginxのDockerfileを作成します。

vi docker/nginx/Dockerfile

<ファイルの中身>

FROM nginx:1.25
COPY  docker/nginx/default.conf /etc/nginx/conf.d/

アプリコンテナのDockerfile作成

アプリコンテナのDockerfile作成を作成します。

mkdir docker/php

vi docker/php/Dockerfile

<ファイルの中身>


FROM php:8.3-fpm

RUN apt-get update \
  && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
  && docker-php-ext-install zip pdo_mysql

#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin

COPY ./ /var/www/

RUN chmod -R 777 /var/www/

WORKDIR /var/www


RUN composer global require "laravel/installer"

必要なファイル作成が終わりましたので、コンテナ立ち上げてLaravel11をインストールしていきます。

コンテナ立ち上げ

以下のコマンドでコンテナを立ち上げます。

docker compose up -d

Laravel 11のインストール

アプリコンテナの中に入りLaravel11をインストールします。

# アプリコンテナに入るコマンド
docker compose exec app bash
# Laravel11インストールコマンド
composer create-project --prefer-dist laravel/laravel laravel-project "11.*"

ブラウザで「http://localhost:8000/」 へアクセスして以下の画面が表示されればOK!

 

 

次は、ECRにイメージをpushして行きます。

ECR(Amazon Elastic Container Registry)にLaravelイメージをpush

以下のコマンドで、AWSの接続設定をしておきます。

aws configure

次にECRログインします。


aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com

以下のコマンドでリポジトリを作成します。


aws ecr create-repository \
        --repository-name laravel.test \
        --image-scanning-configuration scanOnPush=true \
        --region ap-northeast-1 

aws ecr create-repository \
        --repository-name nginx \
        --image-scanning-configuration scanOnPush=true \
        --region ap-northeast-1 

以下のコマンドでビルドします。

docker compose up --build 

Laravelアプリのタグ作成します

docker tag fargate_laravel-app:latest {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest

Laravelアプリのpushです

docker push {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest

Nginxのタグ作成します

docker tag nginx:latest {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest

Nginxのpushです

docker push {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest

次に、Fagateにデプロイします!

ECS(Amazon Elastic Container Service)-Fagateにデプロイ

クラスターの作成

以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

  • インフラストラクチャ:AWS Fargate (サーバーレス)

タスク定義の作成

以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

  • インフラストラクチャの要件
    • 起動タイプ:AWS Fargate
    • オペレーティングシステム/アーキテクチャ:自分のPCと一致するもの(基本はx86_64でOK、M1/M2 MacはARM64を選択)
      • この設定に誤りがあると「exec /usr/local/bin/start-container: exec format error」エラーになります。
    • タスクサイズ
      • CPU:.5 vCPU
      • メモリ:1GB
  • コンテナ – 1
    • 名前:app
    • イメージURI:{AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest
  • コンテナ – 2
    • 名前:nginx
    • イメージURI:{AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest
    • コンテナポート:80
    • アプリケーションプロトコル:HTTP

タスク起動

作成したクラスターのタスクタブにある「新しいタスクの実行」を押下

  • コンピューティング設定:起動タイプ
  • デプロイ設定
    • ファミリー:先ほど作成したタスクを設定
    • リビジョン:最新
  • ネットワーキング
    • セキュリティグループ:ポート80の許可を追加

動作確認

作成したクラスターのタスクタブの任意のタスクの詳細を開きます。

パブリックIPが表示されるので、パブリックIPでブラウザからアクセスします。

以下の画面が表示されればOKです。

コンテナ利用時のログ出力に関する記事もありますので、気になる方は以下をクリックくださーい

Laravelをコンテナで運用する際のログ出力は、JSON形式で標準出力した方が良い
Laravelをコンテナで運用する際のログ出力は、JSON形式で標準出力した方が良いということを書いていきます。 Laravelに限らず、コンテナでは、JSON形式で標準出力が良いと思いますが、Laravelでは簡単にログをJSON形式で標...
]]>
Elastic Container Service(ECS) Fargate 高負荷時の対策ーメモリ使用率とCPU使用率 https://it.kensan.net/elastic-container-serviceecs-fargate-load.html Sat, 11 Mar 2023 08:46:45 +0000 http://3.113.9.194/it/?p=793 ECS Fargateの高負荷時の対策について記載します。

高負荷時は、基本的には以下の対応となりますが、基本に通りに進める時間的余裕がないことが多いと思います。

高負荷時の基本的な対応方法
  1. 高負荷の原因となっている処理を特定する
  2. プログラムを修正して、原因を取り除く
  3. 対象機能の負荷試験を行う
  4. 負荷試験にて適切なコンテナタスク数や性能を決める

本記事では、上記を実施する時間的余裕がない場合に、応急処置として、インフラ強化で対応できることを記載していきます。

高負荷状態を放置するとコンテナが落ちて、処理中のデータが失われてしまうこともあるので、緊急時はインフラ強化で対策しておきましょ!

本記事で扱うケース
CPU使用率が高いケース
メモリ使用率が高いケース

上記のケースで、どのように対応すれば良いか記載していきます。

結論

以下の3つ対応を適切に使って対応していきます。
スケールアウト
スケールアップ
新しいデプロイの強制→新しいコンテナを起動し、稼働中のコンテナを停止する

まず、上記の3つの高負荷時の対策について、具体的にどんな対策となるか、対策の中身を記載していきます。

高負荷時の対策

高負荷時の対策について、具体的には以下のような対策となります。

高負荷時の対策を具体的に説明

スケールアウト:タスク数を増やす
スケールアップ:1タスクのCPUやメモリを大きくする
新しいデプロイの強制:タスクを全て入れ替える(新しいコンテナを起動し、稼働中のコンテナを停止する)

 

次に、どんな時にどの対策を行えば良いか考えていきます。

CPU使用率が高いケース

CPU使用率が高い場合は以下の対応が基本となります。

CPU使用率が高い場合の対応

アクセス数が増えて高負荷になっている場合:スケールアウト
重い処理が多くて捌き切れない:スケールアップ

アクセス数が増えて高負荷になっている場合、タスク数を増やすことで、多くのアクセスを捌けるようになるため、スケールアウトすれば良いという考えです。

重い処理が多くて捌き切れない場合、タスク数を増やしても、重い処理が1つのタスクに集中してしまうと捌けなくなってしまうため、スケールアップが効果的であるという考えです。

次は、メモリ使用率が高いケースについて考えていきます。

メモリ使用率が高いケース

メモリ使用率が高い場合は以下の対応が基本となります。

メモリ使用率が高い場合の対応

アクセス数が増えて高負荷になっている場合:スケールアウト
メモリ使用量が多い処理が多くて捌き切れない:スケールアップ
メモリ断片化でメモリ使用率が上がり続ける:新しいデプロイの強制

アクセス数が増えて高負荷になっている場合、タスク数を増やすことで、多くのアクセスを捌けるようになるため、スケールアウトすれば良いという考えです。

メモリ使用量が多い処理が多くて捌き切れない場合、タスク数を増やしても、重い処理が1つのタスクに集中してしまうと捌けなくなってしまうため、スケールアップが効果的であるという考えです。

メモリ断片化でメモリ使用率が上がり続ける場合、タスクの入れ替えをすれば、メモリ断片化されていないタスクのみに切り替わるため、新しいデプロイの強制が有効と考えています。

どのような対策をすべきかわかったところで、具体的に

・スケールアウト

・スケールアップ

・新しいデプロイの強制

の実施方法について記載していきます。

 

スケールアウト・スケールアップ・新しいデプロイの強制を実施する方法

具体的な手順について記載していきます。

まずはスケールアウトから

スケールアウト

AWSマネージメントコンソールのECS画面から、サービスの編集画面を開き、「必要なタスク」を増やして更新します。

「必要なタスク」は以下の画面の赤線の場所から編集できます!

ECS タスク数を増やして、スケールアウトする

ECS タスク数を増やして、スケールアウトする

上記のように、手動でタスク数を変更することも可能ですが、オートスケーリングを設定しておくのがスマートかと思います。

オートスケーリングの設定は以下の記事をご参照ください。

Elastic Container Service(ECS) Fargateの2つのオートスケーリング設定
Elastic Container Service(ECS)のオートスケーリング設定は「リソースの負荷に応じたオートスケーリング設定」「時間に応じたオートスケーリング設定」が設定可能。 「リソースの負荷に応じたオートスケーリング」「時間に応じたオートスケーリング」を組み合わせ、メリットを活かし、注意点を補う設定が可能

スケールアップ

タスク定義からCPU・メモリの性能を更新し、サービスの「新しいデプロイの強制」をONにして更新します。

「CPU」「メモリ」の性能は以下の画面の赤線の場所から編集できます!

新しいデプロイの強制はこちらをご参照ください。

ECS タスクの性能を修正して、スケールアップする

ECS タスクの性能を修正して、スケールアップする

新しいデプロイの強制

サービスの編集画面を開き、「新しいデプロイの強制」のONにして更新します。

「新しいデプロイの強制」は以下の画面の赤線の場所から編集できます!

ONにして更新すると、タスクの入れ替えが行われます。

新しいデプロイの強制

新しいデプロイの強制

「新しいデプロイの強制」は、新しいコンテナを起動し、稼働中のコンテナを停止する挙動になりますが、停止するコンテナの挙動は以下の通りとなります。

更新中にサービススケジューラがタスクを置き換えるとき、サービスはまずロードバランサーからタスクを削除し (使用されている場合)、接続のドレインが完了するのを待ちます。その後、タスクで実行されているコンテナに docker stop と同等のコマンドが発行されます。この結果、SIGTERM 信号と 30 秒のタイムアウトが発生し、その後に SIGKILL が送信され、コンテナが強制的に停止されます。コンテナが SIGTERM 信号を正常に処理し、その受信時から 30 秒以内に終了する場合、SIGKILL 信号は送信されません。

コンソールを使用したサービスの更新 - Amazon Elastic Container Service
Amazon ECS コンソールを使用して、Amazon ECS サービスを更新する方法を説明します。
停止するコンテナの挙動
SIGTERMの送信後、コンテナに30秒の猶予時間が与えられる。
コンテナは30秒の猶予時間の間に、正常に処理を終わらせられるように動く。

 

まとめ

以下の負荷のケースと対策について記載しました。

記載した負荷ケースと対策

CPU使用率が高いケース
対策
:アクセス数が増えて高負荷になっている場合:スケールアウト
対策
:重い処理が多くて捌き切れない:スケールアップ
メモリ使用率が高いケース
対策
:アクセス数が増えて高負荷になっている場合:スケールアウト
対策
:メモリ使用量が多い処理が多くて捌き切れない:スケールアップ
対策:メモリ断片化でメモリ使用率が上がり続ける:新しいデプロイの強制

 

スケールアップ・スケールアウト・新しいデプロイの強制を適切に使って乗り越えていきましょー

 

]]>
Elastic Container Service(ECS) Fargateの2つのオートスケーリング設定 https://it.kensan.net/ecs-autoscaling.html Mon, 06 Mar 2023 00:09:38 +0000 http://3.113.9.194/it/?p=637 Elastic Container Service(ECS)Fargateのオートスケーリング設定について記載します。

Fargateでは、以下の2つのオートスケーリングの設定が可能です。

2つのオートスケーリング設定

リソースの負荷に応じたオートスケーリング設定
時間に応じたオートスケーリング設定

Fargateが高負荷時の対応方法については以下の記事もご参照ください。

Elastic Container Service(ECS) Fargate 高負荷時の対策ーメモリ使用率とCPU使用率
ECS Fargateの高負荷時の対策 「CPU使用率が高いケース」 「メモリ使用率が高いケース」 について記載します。 「スケールアウト:タスク数を増やす」 「スケールアップ:1タスクのCPUやメモリを大きくする」 「新しいデプロイの強制:タスクを全て入れ替える」 といった対策があります。

まずは、リソースの負荷に応じたオートスケーリング設定について、書いていきます!

リソースの負荷に応じたオートスケーリング設定

リソースの負荷に応じたオートスケーリング設定について、以下の順で記載していきます。

記載内容

①設定方法
②設定内容について
③メリット・注意点

まずは、設定方法についてです。

設定方法

以下の流れで設定できます。

  1. AWSマネージメントコンソール画面からECSを選択
  2. スケーリングしたいクラスターを選択
  3. スケーリングしたいサービスを選択
  4. 「サービスを更新」ボタンを押下
  5. 「サービスの Auto Scaling」の設定からスケーリングポリシー(以下の画面)を設定
  6. サービスを更新
ecs 負荷に応じたオートスケール設定

ecs 負荷に応じたオートスケール設定

設定内容について

以下のメトリクスに対して、ターゲット値(閾値)を設定し、オートスケーリングさせることが可能です。

設定可能なメトリクス

CPU使用率
メモリ使用量

メリット・注意点

<メリット>

  • リソースを有効活用できる
    • リソースの負荷に応じてスケーリングするため、負荷が低い場合はコンテナ数を抑え、負荷が高い時のみコンテナを増やすことができる

<注意点>

  • コンテナが起動するまで時間を要する
    • 急激なアクセス増の場合、コンテナの起動が間に合わない可能性がある
      • 急激なアクセス増加が見込まれる場合、次に記載する「時間に応じたオートスケーリング設定」をしておくのがオススメです。

時間に応じたオートスケーリング設定

時間に応じたオートスケーリング設定について、以下の順に記載していきます。

記載内容

①設定方法
②メリット・注意点

まずは、設定方法についてです。

    設定方法

    以下のコマンドにて設定します。

    
    aws application-autoscaling put-scheduled-action \
    --scheduled-action-name {スケジューリング名} \
    --schedule "cron({cron形式で起動タイミングを設定})" \ 
    --service-namespace ecs \
    --resource-id service/{クラスター名}/{サービス名} \
    --scalable-dimension ecs:service:DesiredCount \
    --scalable-target-action MinCapacity=10,MaxCapacity=20
    
    • {スケジューリング名}:管理しやすいスケジューリング名を記載
    • {cron形式で起動タイミングを設定}:cron形式で記載します。時間はUTCです。毎日10時の場合、「cron(0 1 * * ? *)」と記載します。
    • {クラスター名}:クラスター名を記載
    • {サービス名}:サービス名を記載
    • scalable-target-actionで起動させたいタスク数を指定します。

    メリット・注意点

    <メリット>

    • コンテナをあらかじめ用意しておくことができる
      • 急激なアクセス増が予測される場合、コンテナをあらかじめ起動しておくことで、急激なアクセス増に耐えることができる

    <注意点>

    •  設定によっては余分なリソースが生まれる
      • 必要なコンテナ数以上を立ち上げるように設定してしまうと、余分なリソースが生まれることとなります。

    まとめ

    • リソースの負荷に応じたオートスケーリング設定
    • 時間に応じたオートスケーリング設定

    について見てきました。

    それぞれの設定のメリットと注意点を確認し、どちらの設定を行うか検討する必要があると思います。

    また、2つの設定(リソースの負荷に応じたオートスケーリングと時間に応じたオートスケーリング)を組み合わせることで、それぞれのメリットを活かしつつ、注意点を補える設定をすることも可能です。

    ]]>
    Docker上で動くLaravel(PHP)をAWS ECS-Fargateにデプロイする(codecommit/codepipeline/codebuild/codedeploy) https://it.kensan.net/docker%e4%b8%8a%e3%81%a7%e5%8b%95%e3%81%8flaravelphp%e3%82%92aws-ecs%e3%81%ab%e3%83%87%e3%83%97%e3%83%ad%e3%82%a4%e3%81%99%e3%82%8b.html Sat, 12 Sep 2020 05:54:19 +0000 https://itblog.verdy-it.xyz/?p=220

    Docker上で動くLaravel(PHP)をAWS ECS-Fargateにデプロイするということをやっていきます!

    Laravelプログラムをローカル開発環境で開発完了後、

    AWS code4兄弟のcodecommit/codepipeline/codebuild/codedeployとECRを使用して、

    ECS-Fargateへのデプロイする方法を記載していきます。

    ECSへのデプロイ

    <デプロイ対象の環境構成>
    Nginx
    laravel(PHP)
    docker
    <使用するAWSサービス>
    codepipeline
    codecommit
    codebuild
    codedeploy
    ECR
    ECS-Fargate
    <やること>
    codecommitへpushした後のECSへのデプロイを自動化する

    どんな環境?

    以下で構成された環境をECSへデプロイします!

    • Nginx
    • Laravel(PHP)
    • Docker

    どんなAWSサービスを使うの?

    以下でAWSサービスを使用してECS-Fargateへデプロイします!

    • codepipeline
    • codecommit
    • codebuild
    • codedeploy
    • ECR
    • ECS-Fargate

    デプロイフロー

    ローカル開発環境で開発後、codecommitへpushした後のECS-Fargateへのデプロイを自動化していきます!

    デプロイフロー

    ①ローカル開発環境で開発
    ②codecommitへpush
    ③codepipelineが動き出し、codebuildを実行
    ④ビルドが終わったらdockerイメージをECRへ格納
    ⑤codepipelineに処理が戻りECSへのデプロイを実行

    では、ローカル開発環境の作成から始めていきます

    Laravelローカル開発環境の作成

    以下のことをやっていきます!

    ローカル開発環境構築

    ①dockerファイルなど必要なファイルの作成
    ②Laravelプロジェクト作成
    ③dockerコンテナ立ち上げ
    ④動作確認

    まずは、完成系のディレクトリ構成から記載します。

    ディレクトリ構成

    以下のような構成となります。

    
    ├── docker
    │   ├── nginx
    │   │   ├── Dockerfile
    │   │   └── default.conf
    │   └── php
    │       └── Dockerfile
    └── docker-compose.yml

    ディレクトリの作成

    上記ディレクトリ構成を作成するためのディレクトリを作成します。

    mkdir fargate_laravel
    cd fargate_laravel/

    準備はできましたので、ディレクトリ構成に記載のディレクトリとファイルを作成していきます。

    docker-compose.ymlの作成

    docker-compose.ymlを作成します。

    vi docker-compose.yml

    <ファイルの中身>

    
    version: '3'
    services:
      app:
        build:
          context: .
          dockerfile: ./docker/php/Dockerfile
        container_name: app_laravel
        volumes:
          - .:/var/www
      nginx:
        build:
          context: .
          dockerfile: ./docker/nginx/Dockerfile
        container_name: nginx_laravel
        ports:
          - 8000:80
        working_dir: /var/www
        depends_on:
          - app

    nginxのdefault.confを作成

    nginxのdefault.confを作成します。

    mkdir docker/nginx
    
    vi docker/nginx/default.conf

    <ファイルの中身>

    
    server {
      listen 80;
      root /var/www/laravel-project/public;
      index index.php;
      location / {
        try_files $uri $uri/ /index.php?$query_string;
      }
      location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;   # 正常に動作しない場合は、app:9000に書き換える
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      }
    }
    

    nginxのDockerfileの作成

    nginxのDockerfileを作成します。

    vi docker/php/Dockerfile

    <ファイルの中身>

    FROM nginx:1.25
    COPY  docker/nginx/default.conf /etc/nginx/conf.d/

    アプリコンテナのDockerfile作成

    アプリコンテナのDockerfile作成を作成します。

    mkdir docker/php
    
    vi docker/php/Dockerfile

    <ファイルの中身>

    
    FROM php:8.3-fpm
    
    RUN apt-get update \
      && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
      && docker-php-ext-install zip pdo_mysql
    
    #Composer install
    RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    RUN php composer-setup.php
    RUN php -r "unlink('composer-setup.php');"
    RUN mv composer.phar /usr/local/bin/composer
    
    ENV COMPOSER_ALLOW_SUPERUSER 1
    
    ENV COMPOSER_HOME /composer
    
    ENV PATH $PATH:/composer/vendor/bin
    
    COPY ./ /var/www/
    
    RUN chmod -R 777 /var/www/
    
    WORKDIR /var/www
    
    
    RUN composer global require "laravel/installer"
    

    必要なファイル作成が終わりましたので、コンテナ立ち上げてLaravel11をインストールしていきます。

    コンテナ立ち上げ

    以下のコマンドでコンテナを立ち上げます。

    docker compose up -d

    Laravel 11のインストール

    アプリコンテナの中に入りLaravel11をインストールします。

    # アプリコンテナに入るコマンド
    docker compose exec app bash
    # Laravel11インストールコマンド
    composer create-project --prefer-dist laravel/laravel laravel-project "11.*"

    ブラウザで「http://localhost:8000/」 へアクセスして以下の画面が表示されればOK!

    デプロイフローの作成

    まず、codecommitの設定から始めていきます。

    codecommit

    リポジトリ作成

    Codecommit

    リポジトリ名:laravel-docker

    後は設定を変えずに作成

    ソースコードをpush

    HTTPS (GRC)でcodecommitにソースをpushします。

    pip install git-remote-codecommit
    git init
    git add --all
    git commit -m "initial"
    git remote add codecommit codecommit://laravel-docker
    git push codecommit HEAD
    
    

    ECR

    以下の2つのリポジトリを作成します。

    • リポジトリ名:laravel-docker
    • リポジトリ名:laravel-docker-nginx

    codebuild

    まず、プロジェクト直下にbuildspec.ymlを作成します。

    buildspec.ymlの作成

    vi buildspec.yml
    
    version: 0.2
    
    phases:
     pre_build: # commands to be run before build
       commands:
       - AWS_ACCOUNT_ID=<AWSアカウントID>
       - echo Logging in to Amazon ECR....
       - aws --version
       - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
       - REPOSITORY_URI=$AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/laravel-docker
       - REPOSITORY_NGINX_URI=$AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/laravel-docker-nginx
     build:
       commands:
       - echo Build started on `date`
       - echo installing composer..
       - cd laravel-project
       - composer install
       - echo creating .env file..
       - cp .env.example .env
       - echo generating app key
       - php artisan key:generate
       - echo Building the Docker image...
       - cd ../
       - docker build -t laravel-docker . -f  ./docker/php/Dockerfile
       - docker tag laravel-docker:latest $REPOSITORY_URI:latest
       - docker build -t laravel-docker-nginx . -f  ./docker/nginx/Dockerfile
       - docker tag laravel-docker-nginx:latest $REPOSITORY_NGINX_URI:latest
     post_build:
       commands:
         - echo Build completed on `date`
         - echo Pushing the Docker image...
         - docker image ls -a
         - docker push $REPOSITORY_URI:latest
         - docker push $REPOSITORY_NGINX_URI:latest
         - echo Writing image definitions file...
         - printf '[{"name":"app","imageUri":"%s"},{"name":"nginx","imageUri":"%s"}]' $REPOSITORY_URI:latest $REPOSITORY_NGINX_URI:latest > imagedefinitions.json
    artifacts:
      files: imagedefinitions.json
    
    
    

    作成したbuildspec.ymlをHTTPS (GRC)でcodecommitにpushします。

    git add --all
    git commit -m "modify"
    git push codecommit HEAD

    codebuildビルドプロジェクトを作成

    Codebuild

    プロジェクト名:laravel-docker-build

    Codebuild

    ソースプロバイダ:CodeCommit

    リポジトリ:laravel-docker

    イメージ:「x86_64」を含むものを選ぶ

    Buildspec:buildspec ファイルを使用する

    後は設定を変えずに作成

    ロール設定

    ロール「codebuild-laravel-docker-service-role」に「ECRアクセス権」を付与する

    <ECRアクセス権>

    
    {
        "Statement": [
            {
                "Action": [
                    "ecr:BatchCheckLayerAvailability",
                    "ecr:CompleteLayerUpload",
                    "ecr:GetAuthorizationToken",
                    "ecr:InitiateLayerUpload",
                    "ecr:PutImage",
                    "ecr:UploadLayerPart"
                ],
                "Resource": "*",
                "Effect": "Allow"
            }
        ],
        "Version": "2012-10-17"
    }

    ECS

    クラスターの作成

    以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

    • インフラストラクチャ:AWS Fargate (サーバーレス)

    ECSタスクの定義

    以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

    • インフラストラクチャの要件
      • 起動タイプ:AWS Fargate
      • オペレーティングシステム/アーキテクチャ:x86_64
        • この設定に誤りがあると「exec /usr/local/bin/start-container: exec format error」エラーになります。
      • タスクサイズ
        • CPU:.5 vCPU
        • メモリ:1GB
    • コンテナ – 1
      • 名前:app
      • イメージURI:{AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest
    • コンテナ – 2
      • 名前:nginx
      • イメージURI:{AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest
      • コンテナポート:80
      • アプリケーションプロトコル:HTTP

    ECSサービス

    以下の設定で作成します。

    クラスタ:laravel-cluster

    コンピューティング設定:起動タイプ

    タスクの数:1

    タスク定義:作成したタスクを指定

    サービス名:laravel-docker-service

    後は設定を変えずに作成

    codepipeline

    codepipeline作成

    codepipelineを以下の設定で作成します。

    <ソースステージ>

    ソースプロバイダー:AWS CodeCommit

    リポジトリ:laravel-docker

    ブランチ名:master

    <ビルドステージ>

    プロバイダ:AWS CodeBuild

    プロジェクト名:laravel-docker-build

    <デプロイステージ>

    プロバイダー:Amazon ECS

    クラスタ名:laravel-cluster

    サービス名:laravel-docker-service

    後は設定を変えずに作成

     

    作成すると、ビルドが実行され、ECS-Fargateへデプロイされます。

    Laravel動作確認

    タスクのIPをコピーして、ブラウザーに貼り付けアクセスしてみる

    以下の画面が表示されればOKです。

    ]]>