laravel | さゆフィクション http://it.kensan.net/it aws wordpress などなどゆるーく書いてます Sat, 21 Dec 2024 01:56:12 +0000 ja hourly 1 https://wordpress.org/?v=6.5.2 https://it.kensan.net/wp-content/uploads/2023/03/cropped-icon-32x32.png laravel | さゆフィクション http://it.kensan.net/it 32 32 Laravel 11をAWS Lambdaで動くようにして簡単なAPIを作ってみる https://it.kensan.net/laravel-11-aws-lambda.html Sat, 21 Dec 2024 01:56:12 +0000 http://43.207.185.157/it/?p=2180 Laravel 11をAWS Lambdaで動くようにして簡単なAPIを作ってみます。

ちなみに私は割とPHP初心者です。

初心者ですが、これからAPI作成するならPHPが良いと思っています。

PHPが良い理由は、実装できる人が多いと思っていて、いざとなれば他の人(他の会社)に協力を仰ぎやすそうだからです。インターネット上に情報もいっぱいあるというアドバンテージもあると思います。

フレームワークは、PHPの中で一番ポピュラーという理由からLaravel!と考えています。

まずは、作成する環境について記載していきます。

 

 

作成する環境の構成

以下の構成で動かしてみます。

  • プログラム
    • Laravel
  • AWSリソース
    • API Gateway
    • Lambda

実際に、Laravel 11をAWS Lambdaで動かしてみます!!

Laravel 11をAWS Lambdaで動かしてみる

まずはLaravelプロジェクトを作成します。

Laravelプロジェクトの作成

以下のコマンドでLaravelプロジェクトを作成します。

composer create-project laravel/laravel lambda_test

プロジェクト作成ができたら、Laravelバージョンを確認します

cd lambda_test/
php artisan -V
Laravel Framework 11.36.1

上記のようにLaravelバージョンが確認できればOKです。

AWSにデプロイする準備

以下のコマンドでAWSのアクセスキーとシークレットキーを設定します

aws configure

アクセスキーとシークレットキーを設定後は、以下のような簡単なコマンドを使用して(以下はバケットの一覧を表示する例)、設定に成功しているか確認できます。

aws s3 ls

次にserverless frameworkをインストールします。

npm install -g serverless

次にbrefをインストールします。

composer require bref/bref bref/laravel-bridge --update-with-dependencies

次に serverless.yamlを生成します。

php artisan vendor:publish --tag=serverless-config

serverless.yamlのregionを以下の通り変更しておきます。(これで、デプロイ先を東京リージョンに変更しています。)

region: ap-northeast-1

serverless.yamlのruntimeも以下の通り変更しておきます。

    web:
        runtime: php-84-fpm
    artisan:
        runtime: php-84-console

 

修正後のserverless.yamlの全体は以下です。


service: laravel

provider:
    name: aws
    # The AWS region in which to deploy (us-east-1 is the default)
    region: ap-northeast-1
    # Environment variables
    environment:
        APP_ENV: production # Or use ${sls:stage} if you want the environment to match the stage
        SESSION_DRIVER: cookie # Change to database if you have set up a database

package:
    # Files and directories to exclude from deployment
    patterns:
        - '!node_modules/**'
        - '!public/storage'
        - '!resources/assets/**'
        - '!storage/**'
        - '!tests/**'
        - '!database/*.sqlite'

functions:

    # This function runs the Laravel website/API
    web:
        handler: public/index.php
        runtime: php-84-fpm
        timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds)
        events:
            - httpApi: '*'

    # This function lets us run artisan commands in Lambda
    artisan:
        handler: artisan
        runtime: php-84-console
        timeout: 720 # in seconds
        # Uncomment to also run the scheduler every minute
        #events:
        #    - schedule:
        #          rate: rate(1 minute)
        #          input: '"schedule:run"'

plugins:
    # We need to include the Bref plugin
    - ./vendor/bref/bref

デプロイしてみる

以下のコマンドでデプロイできます

serverless deploy

以下が出てきた場合はLogin/Registerを選択するとWEBブラウザが開くと思うので、ログイン(アカウントを持っていない場合作成)します。


Please login/register or enter your license key: … 
❯ Login/Register
  Get A License
  Enter A License Key
  Explain Licensing Basics

デプロイができると以下のようにエンドポイントが表示されます。

endpoint: ANY - ****************

動作確認

エンドポイントにアクセスし、以下のように画面表示されればOKです。

簡単なAPIを作ってみる

以下のコマンドでコントローラを作成

php artisan make:controller ApiProductController

コントローラを以下のとおり実装


namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ApiProductController extends Controller
{
    public function index()
    {
        $products = [];
        $products['id'] = 1;
        $products['name'] = '商品名';
        return response()->json($products, 200);
    }
}

ルーティング(routes/web.php)ファイルに以下を追加

Route::get('/api', 'App\Http\Controllers\ApiProductController@index');

以下のコマンドでデプロイできます

serverless deploy

「エンドポイント/api」にアクセスして、以下のレスポンスが返って来れば成功です。


{
  "id": 1,
  "name": "商品名"
}

Laravelで作ったAPIをLambdaで動かす際に使うと良さそうAWSサービスは何か

API Gatewayは不要?

まず、Lambda関数URLがあるので、API GatewayはなくてもAPIの公開は可能で、この方がAPI Gateway分のコスト削減が可能とは思います。

しかし、API Gatewayを使用した方が、リクエストの認証(IAM、Cognito、APIキーなど)などが使える点で有利かと思います。

DBは?

RDSなら、RDS Proxy × Aurora Serverless v2という選択肢があると思います。

RDS Proxyを使うことで、データベースへの接続をプロキシすることで、データベースへの負荷を軽減できますが、8ACU分の料金がかかります。

費用を抑えたい場合、かつ同時接続数が少ない場合は、RDS ProxyなしでもOKかな。Aurora Serverless v2はゼロキャパシティのスケーリングをサポートしています。

Amazon Aurora Serverless v2 がゼロキャパシティへのスケーリングをサポート - AWS
AWS の新機能についてさらに詳しく知るには、 Amazon Aurora Serverless v2 がゼロキャパシティへのスケーリングをサポート

ユースケースによっては、Aurora Serverless v2とElastiCacheという組み合わせで、ElastiCacheでRDSの情報をキャッシュしてRDSの負荷を抑えるというのもありかと。

もしくは、DynamoDBという選択肢もあると思いますが、設計の難易度が高い…ですね。

まとめ

DBの選択肢など迷うことも多くありますが、プログラムとしてはLaravel(PHP)がいいと思っています!!

]]>
LaravelでSendGrid-smtp送信のメール送信をテスト・デバッグする最短の方法ーSendGridの設定方法 https://it.kensan.net/laravel-sendgrid-smtp-mail-send.html Fri, 05 Jul 2024 10:54:47 +0000 http://18.179.19.147/it/?p=2113 LaravelでSendGrid-smtp送信のメール送信をテスト・デバッグする最短の方法について記載します。

こうすれば、SendGridのメール設定ができて、簡単に設定後の動作確認ができるよ、ということを記載していきます。

SendGridのテスト・デバッグ時のメール送信確認の設定周りを中心に記載します。

メール送信のLaravelプログラムの書き方については記載していません。

Laravelのローカル開発環境構築

ローカル開発環境構築は以下の記事をご参照ください。本記事ではローカル開発環境構築が済んでいることを前提に記載します。

DockerでLaravel 11のローカル開発環境を構築する。ついでにphpmyadminも入れてみる。
DockerでLaravel 11のローカル開発環境を構築していきます。 DB確認用に、phpmyadminもインストールします。 コンテナは以下のような構成です。本番環境に応用できるように、あえてSailは使いません。 アプリコンテナ P...

SendGrid側の設定

本記事ではSendGrid側の設定ができていることを前提に記載します。

SendGrid側の設定がまだの場合は以下のステップで設定できます。

  1. 以下の記事を参考に申し込みをする
  2. 申し込みが終わったら、以下の記事を参考に、差出人情報を設定する

LaravelにSendGrid-smtp送信の設定をして動作確認

メールをSendGridで送信するように設定変更

.envファイルでメールをSendGridで送信するように設定します。

以下のコマンドでプロジェクト直下の「.env」ファイルを開きます

vi .env

以下のとおり、「.env」ファイルを編集します。

MAIL_MAILER=smtp 
MAIL_HOST=smtp.sendgrid.net
MAIL_PORT=587
MAIL_USERNAME=apikey
MAIL_PASSWORD=<SendGridで払い出されたAPIキーを設定>
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="<送信元メールアドレスを設定>"
MAIL_FROM_NAME="${APP_NAME}"

MAIL_PASSWORDには「SendGridで払い出されたAPIキー」を設定し、MAIL_FROM_ADDRESSには「送信元メールアドレス」を設定します。

メールを送って受信確認してみる

以下のコマンドでメールを送信可能です。

// コンテナの中に入る
docker compose exec app php artisan tinker
// メール送信
Mail::raw('test mail',function($message){$message->to('<実際に送信する送信先アドレス>')->subject('test');});

送付先のメールアドレスに実際にメールが届いていれば、SendGridの設定完了です。

まとめ

SendGridのメール設定ができて、簡単に設定後の動作確認ができたと思います。

]]>
Laravelのローカル開発環境でメール送信をテスト・デバッグする最短の方法(メール送信のための設定確認方法) https://it.kensan.net/laravel-mail-send-test.html Fri, 05 Jul 2024 10:17:45 +0000 http://18.179.19.147/it/?p=2106 Laravelのローカル開発環境でメール送信をテスト・デバッグする最短の方法について記載します。

以下の2つの方法を記載します。

  • ログで確認する方法
  • mailhog(コンテナ)で確認する方法

こうすれば、テスト時のメール設定ができて、簡単に設定後の動作確認ができるよ、ということを記載していきます。

テスト・デバッグ時のメール送信確認の設定周りを中心に記載します。

メール送信のLaravelプログラムの書き方については記載していません。

Laravelのローカル開発環境構築

ローカル開発環境構築は以下の記事をご参照ください。本記事ではローカル開発環境構築が済んでいることを前提に記載します。

DockerでLaravel 11のローカル開発環境を構築する。ついでにphpmyadminも入れてみる。
DockerでLaravel 11のローカル開発環境を構築していきます。 DB確認用に、phpmyadminもインストールします。 コンテナは以下のような構成です。本番環境に応用できるように、あえてSailは使いません。 アプリコンテナ P...

メール送信をログで確認する方法

メールの内容をログ出力するように設定変更

.envファイルでメールをログに吐き出すように設定します。

以下のコマンドでプロジェクト直下の「.env」ファイルを開きます

vi .env

以下のとおり、「.env」ファイル内のMAIL_MAILERにlogを設定します。

MAIL_MAILER=log

メールを送ってログを確認してみる

以下のコマンドでメールを送信可能です。

// コンテナの中に入る
docker compose exec app php artisan tinker
// メール送信
Mail::raw('test mail',function($message){$message->to('test@example.com')->subject('test');});

以下のようにcatコマンドなどを使ってログを確認します。

cat storage/logs/laravel.log 

以下のようにメールのログが確認できれば成功です。

From: Laravel <hello@example.com>
To: test@example.com
Subject: test
MIME-Version: 1.0
Date: Fri, 05 Jul 2024 09:41:54 +0000
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

test mail  

メール送信をmailhog(コンテナ)で確認する方法

メールをmailhog(コンテナ)に送信する設定変更

.envファイルでメールをmailhogに吐き出すように設定します。

以下のコマンドでプロジェクト直下の「.env」ファイルを開きます

vi .env

以下のとおり、「.env」ファイル内のMAIL_HOSTmailhogを設定します。

ポートは1025を指定します。

MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025

次にdocker-compose.ymlを編集します。

vi docker-compose.yml

ファイルの中身は以下のように記載します。

services:
  mailhog:
    image: mailhog/mailhog
    ports:
      - target: 8025
        published: ${MAILHOG_PUBLISHED_PORT:-8025}
        protocol: tcp
        mode: host

dockerを立ち上げます

// コンテナを立ち上げている場合は一度落とす
docker compose down
// コンテナを立ち上げる
docker compose up

メールを送ってをmailhogで送信内容を確認してみる

以下のコマンドでメールを送信可能です。

// コンテナの中に入る
docker compose exec app php artisan tinker
// メール送信
Mail::raw('test mail',function($message){$message->to('test@example.com')->subject('test');});

http://127.0.0.1:8025/にアクセスして、以下のようにメール受信を確認できればOKです。

まとめ

以下の2通りでのメールの確認方法を記載しました。

  • ログで確認する方法
  • mailhog(コンテナ)で確認する方法

これでメール実装の設定準備はできたと思いますー

]]>
Laravel Adminのgridでの細かい検索とformでの1対多のデータ登録のやり方~todoリストを作成しつつ解説~ https://it.kensan.net/laravel-admin-grid-form.html Sat, 08 Jun 2024 03:22:02 +0000 http://35.78.204.110/it/?p=2052 Laravel Adminのgridとformの使い方について記載していきます。

Laravel Adminって何者?という方は以下の記事をご参照ください。

Laravel Adminで効率的に管理画面を作成する。Dockerを使用した環境構築と使い方について記載。
Laravel Adminは、ウェブアプリケーションの管理画面を効率的かつ簡単に作成できるツールです。 この記事では、Laravel Adminの利点と使い方について詳しく記載します。 Laravel Adminを利用すると、データベースの...

gridとformについて簡単に書くと、以下のようになります。gridとformを理解することでLaravel Adminの大部分を使いこなせると思います。

  • grid:一覧表示
  • form:新規登録・編集機能

本記事でやること

  • 登録・編集(formメソッド)
    • セレクトボックスの設置
      • 選択肢はDBから取得
    • 入力ボックスを使わないデフォルト値設定
    • 1対多のテーブルでのデータ登録
  • フィルター・一覧(gridメソッド)
    • デフォルトでの検索条件の指定
    • チェックボックスでor検索の実装
    • 一覧の文字色変更

 

では、todoリストを作成しつつ、説明していきます

Laravel Adminを動作させる環境構築

環境構築は以下の記事をご参照ください。Dockerで簡単に構築できます。

Laravel Adminで効率的に管理画面を作成する。Dockerを使用した環境構築と使い方について記載。
Laravel Adminは、ウェブアプリケーションの管理画面を効率的かつ簡単に作成できるツールです。 この記事では、Laravel Adminの利点と使い方について詳しく記載します。 Laravel Adminを利用すると、データベースの...

テーブルとModelとControllerの準備

テーブルの作成

テーブル構成は以下のようになります。

  • todo情報を格納するtodosテーブル
  • todo情報に対するコメントを格納するcommentsテーブル

では、以下のコマンドでマイグレートファイルを作成します。

php artisan make:migration create_todos_table --create=todos

php artisan make:migration create_comments_table --create=comments

マイグレーションファイルは以下のように修正します。

<todosテーブル>


<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('todos', function (Blueprint $table) {
            $table->increments('id');
            $table->string('todo_name')->nullable(false)->index();    # todoの名前
            $table->string('target_user_id')->nullable(false);    # todoの担当者
            $table->string('regist_user_id')->nullable(true);    # todoの登録者
            $table->integer('status')->nullable(true)->default(0);    # 完了ステータス 0:未完了、1:完了
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('todos');
    }
};

<commentsテーブル>


<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('todo_id');
            $table->text('comment');
            $table->string('regist_user_id')->nullable(true);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('comments');
    }
};

Modelの準備

以下のコマンドでModelを作成します。

php artisan make:model Todo
php artisan make:model Comment

Modelは以下のように修正します。

<Todo.php>


<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Todo extends Model
{
    use HasFactory;
    public function comments()
    {
        return $this->hasMany(comment::class);
    }
}

<Comment.php>


<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    protected $fillable = [
        'todo_id',
        'comment',
        'regist_user_id',
    ];
    use HasFactory;
    
    public function todo()
    {
        return $this->belongsTo(Todo::class);
    }
}

動作確認

http://localhost:8000/admin/todos にアクセスして、以下のようにカラのリスト画面が表示されればOKです。

準備ができましたので、formメソッドを編集しつつ、説明していきます。

Laravel adminのformメソッドの使い方

まずformメソッドについて記載します。

formメソッドとは

以下のような機能を持っています。新規登録・編集用のメソッドですね。

  • 入力フィールド:テキスト、数値、パスワード、セレクトボックス、ラジオボタン、チェックボックスなど。
  • バリデーション:入力データの検証機能。
  • リレーション管理:関連するデータモデルの管理。
  • イベントフック:フォームの保存前後に処理を追加。

それではformメソッドを編集していきます。

formメソッドの編集内容

編集前(コマンドでコントローラ作成直後)は、以下の登録画面になっています。

直したいポイントは以下です。

  1. Target user id(todoの担当者) を選択形式にしたい
  2. Regist user id(todoの作成者)はセッション情報から自動的に登録したい
  3. Statusは「0:未完了」で自動的に登録したい
  4. コメントを登録できるようにしたい(1対多のデータ登録)

完成系の画面イメージは以下のような感じです。

では順番に修正していきます。

Target user id(todoの担当者) を選択形式にしたい

ファイル上部でLaravel-adminのAdminクラスの名前空間を宣言します。

use Encore\Admin\Facades\Admin;

次に以下のように「target_user_id」をテキストからセレクトボックスに変更し、セレクトボックスの選択肢に、Adminユーザを指定します。

// $form->text('target_user_id', __('Target user id'));  //コメントアウト
$form->select('target_user_id', __('Target user id'))->options(Admin::user()->pluck('username', 'id')); //追加

完了です。次にいきます。

Regist user id(todoの作成者)はセッション情報から自動的に登録したい

regist_user_idの入力ボックスをコメントアウトします。

//$form->text('regist_user_id', __('Regist user id'));

次に$form->savingを使ってregist_user_idにログイン中ユーザのIDを登録します。

        $form->saving(function (Form $form) {
            // regist_user_idは「Admin::user()->id」を設定する
            $form->model()->regist_user_id = Admin::user()->id;
        });

完了です。次にいきます。

Statusは「0:未完了」で自動的に登録したい

statusの入力ボックスをコメントアウトします。

//$form->number('status', __('Status'));

次に$form->savingを使ってstatusに「0」を登録します。

        $form->saving(function (Form $form) {
            // regist_user_idは「Admin::user()->id」を設定する
            $form->model()->regist_user_id = Admin::user()->id;
            // statusは「0」を設定する
            $form->model()->status = 0;   //ここを追加
        });

完了です。次はコメントです。

コメントを登録できるようにしたい(1対多のデータ登録)

以下のように記載することで、コメントを登録できるようになります。

        # コメント
        $form->hasMany('comments', 'コメント欄', function (Form\NestedForm $form) {
            $form->hidden('regist_user_id', __('regist_user_id'))->default(Admin::user()->id);
            $form->textarea('comment','コメント');
        });

hasManyメソッドを使い、複数のコメントをフォームに追加できるようにしています。

完成した画面

以下の通り、実現したかった画面が出来上がりましたー

 

編集画面でステータスを完了できるようにする

このままだと、ステータスを完了にできないので、編集画面でステータスを完了できるようにします。

以下のコードを書いてあげれば、ステータス更新可能になります。

        // ステータス更新(編集時のみ更新可能)
        if ($form->isEditing()) {
            $form->switch('status', '完了')->states([
                'on' => ['value' => 1, 'text' => '完了', 'color' => 'success'],
                'off' => ['value' => 0, 'text' => '未完了', 'color' => 'danger'],
            ]);
        }

$form->isEditing()で登録か更新かの判定をしています。

更新の場合、入力パーツswitchを表示するコードになっています。

編集画面の完成系は以下のようになります!

 

Laravel adminのgridメソッドの使い方

まずgridメソッドについて記載します。

gridメソッドとは

以下のような機能を持っています。一覧ページ表示用のメソッドですね。

  • データ表示:データベースのレコードをテーブル形式で表示。
  • フィルタリング:条件に基づいてデータを絞り込む。
  • ソート:特定のカラムでデータを昇順または降順に並べ替え。

一覧画面の直したいポイント

直したいポイントは以下です。

  1. 自分が登録したtodoまたは自分が担当のtodoで検索したい
  2. 一覧で自分が担当のtodoは赤文字表示したい

自分が登録したtodoまたは自分が担当のtodoで検索したい

以下のコードを書いてあげれば、検索可能になります。

作成者(regist_user_id)と担当者(target_user_id)のor検索になります。

        $grid->filter(function ($filter) {
            $filter->where(function ($query) {
                if(array_search('1', $this->input) !== false) {
                    $query->orWhere('regist_user_id', Admin::user()->id);
                }
                if(array_search('2', $this->input) !== false) {
                    $query->orWhere('target_user_id', Admin::user()->id);
                }
            }, '自分のtodoを表示', 'search_tantou')->checkbox([
                '1' => '作成したtodoを表示',
                '2' => '担当のtodoを表示',
            ]);
        });

デフォルトで(画面アクセス時に)「作成者(regist_user_id)と担当者(target_user_id)のor検索」で絞り込みをしたい場合は、メニュー編集で対応できます。http://localhost:8000/admin/auth/menu にアクセスし、メニューを編集します。編集時に、URIを以下の通り設定します。

todos?&search_tantou%5B%5D=1&search_tantou%5B%5D=2

画面で説明すると、以下の画面のURIに上記の値を入力して保存です。

一覧で自分が担当のtodoは赤文字表示したい

以下のコードで、自分が担当のtodoを赤字で表示できます。

        // 文字色設定
        $grid->rows(function ($row) {
            # 自分が担当のtodoは、赤字にする
            if ($row->target_user_id == Admin::user()->id ) {
                $row->style('color: red');
            }
        });

完成した画面

完成した一覧画面は以下の通りです。

URIを「todos?&search_tantou%5B%5D=1&search_tantou%5B%5D=2」に変更した場合、画面表示直後は、「自分のtodoの表示」のチェックボックスはONになっているはずです。

以下が実現できましたー

  • デフォルトでの検索条件の指定
  • チェックボックスでor検索の実装
  • 一覧の文字色変更

修正後のコントローラの全体ソース

修正後のコントローラの全体ソースは以下の通りです。


<?php

namespace App\Admin\Controllers;

use App\Models\Todo;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Show;
use Encore\Admin\Facades\Admin;

class TodoController extends AdminController
{
    /**
     * Title for current resource.
     *
     * @var string
     */
    protected $title = 'Todo';

    /**
     * Make a grid builder.
     *
     * @return Grid
     */
    protected function grid()
    {
        $grid = new Grid(new Todo());


        $grid->filter(function ($filter) {
            $filter->where(function ($query) {
                if(array_search('1', $this->input) !== false) {
                    $query->orWhere('regist_user_id', Admin::user()->id);
                }
                if(array_search('2', $this->input) !== false) {
                    $query->orWhere('target_user_id', Admin::user()->id);
                }
            }, '自分のtodoを表示', 'search_tantou')->checkbox([
                '1' => '作成したtodoを表示',
                '2' => '担当のtodoを表示',
            ]);
        });

        $grid->column('id', __('Id'));
        $grid->column('todo_name', __('Todo name'));
        $grid->column('target_user_id', __('Target user id'));
        $grid->column('regist_user_id', __('Regist user id'));
        $grid->column('status', __('Status'));
        $grid->column('created_at', __('Created at'));
        $grid->column('updated_at', __('Updated at'));

        // 表示色
        $grid->rows(function ($row) {
            # 自分が担当のtodoは、赤字にする
            if ($row->target_user_id == Admin::user()->id ) {
                $row->style('color: red');
            }
        });

        return $grid;
    }

    /**
     * Make a show builder.
     *
     * @param mixed $id
     * @return Show
     */
    protected function detail($id)
    {
        $show = new Show(Todo::findOrFail($id));

        $show->field('id', __('Id'));
        $show->field('todo_name', __('Todo name'));
        $show->field('target_user_id', __('Target user id'));
        $show->field('regist_user_id', __('Regist user id'));
        $show->field('status', __('Status'));
        $show->field('created_at', __('Created at'));
        $show->field('updated_at', __('Updated at'));

        return $show;
    }

    /**
     * Make a form builder.
     *
     * @return Form
     */
    protected function form()
    {
        $form = new Form(new Todo());

        $form->text('todo_name', __('Todo name'));
//        $form->text('target_user_id', __('Target user id'));
        $form->select('target_user_id', __('Target user id'))->options(Admin::user()->pluck('username', 'id'));
//        $form->text('regist_user_id', __('Regist user id'));
//        $form->number('status', __('Status'));

        # コメント
        $form->hasMany('comments', 'コメント欄', function (Form\NestedForm $form) {
            $form->hidden('regist_user_id', __('regist_user_id'))->default(Admin::user()->id);
            $form->textarea('comment','コメント');
        });

        // ステータス更新(編集時のみ更新可能)
        if ($form->isEditing()) {
            $form->switch('status', '完了')->states([
                'on' => ['value' => 1, 'text' => '完了', 'color' => 'success'],
                'off' => ['value' => 0, 'text' => '未完了', 'color' => 'danger'],
            ]);
        }

        $form->saving(function (Form $form) {
            // regist_user_idは「Admin::user()->id」を設定する
            $form->model()->regist_user_id = Admin::user()->id;
            // statusは「0」を設定する
            $form->model()->status = 0;
        });

        return $form;
    }
}

 

まとめ

Laravel adminで以下の修正をしてみました。結構短時間でできたと思います。Laravel admin素晴らし〜

  • 登録・編集(formメソッド)
    • セレクトボックスの設置
      • 選択肢はDBから取得
    • 入力ボックスを使わないデフォルト値設定
    • 1対多のテーブルでのデータ登録
  • フィルター・一覧(gridメソッド)
    • デフォルトでの検索条件の指定
    • チェックボックスでor検索の実装
    • 一覧の文字色変更
]]>
Laravelをコンテナで運用する際のログ出力は、JSON形式で標準出力した方が良い https://it.kensan.net/laravel11-log.html Sun, 02 Jun 2024 00:51:23 +0000 http://18.181.252.126/it/?p=2004 Laravelをコンテナで運用する際のログ出力は、JSON形式で標準出力した方が良いということを書いていきます。

Laravelに限らず、コンテナでは、JSON形式で標準出力が良いと思いますが、Laravelでは簡単にログをJSON形式で標準出力可能ですので、設定しておいた方が良いと思います!

なぜ、ログをJSON形式で標準出力するのか

なぜJSON形式か

JSON形式はデータを構造化し、分析や監視ツールで扱いやすい形式です。

また、新しい情報を追加するのも容易なため、ログ出力はJSON形式が良いと考えています。

JSON化しておけば、たとえば、AWSのCloudWatchでログ検索する際などで便利です。

なぜ標準出力か

多くのクラウドプロバイダーは、コンテナの標準出力からログを収集し、そのログを分析や可視化するためのツールやサービスを提供しているためです。

AWSで言うと、Fargateでのコンテナでログを標準出力すると、CloudWatchログの1つのロググループにまとまってくれて、簡単にログ検索できます。

これにより、運用やデバッグがスムーズに行えます。

以下の記事のようなメトリクスフィルターも簡単に作れたりします。

CloudWatchLogsのメトリクスフィルターの使い方ーログデータをメトリクス化して監視する
メトリクスフィルターを使いCloudWatchLogsのログデータを 「CloudWatchのメトリクスで見える化する」「メトリクスを監視してアラートをあげる」ということをやってみます。JSONログデータのメトリクス化も可能です。メトリクス化ができれば監視は通常のアラーム設定と同様となります

では、Laravel11を例にログをJSON形式で標準出力する方法を記載します。

Laravel11でログをJSON形式で標準出力する

config/logging.phpの修正

  • config/logging.phpの2箇所修正します
    •  「use Monolog\Formatter\JsonFormatter;」を追加
    • channelsの中に以下のようにstdoutを追加


use Monolog\Formatter\JsonFormatter;   // これを追加
:
:
:



    'channels' => [
        // 以下を追加
        'stdout' => [
            'driver' => 'monolog',
            'level' => env('LOG_LEVEL', 'debug'),
            'handler' => StreamHandler::class,
            'with' => [
                'stream' => 'php://stdout',
            ],
            'formatter' => JsonFormatter::class,
        ],

.envの修正

.envを修正します。

以下のように、LOG_CHANNEL=stackをコメントアウトして、LOG_CHANNEL=stdoutを追加します。


#LOG_CHANNEL=stack  // コメントアウト
LOG_CHANNEL=stdout  // 追加

 

動作確認

routes/web.phpでログ出力するようにして動作確認します。

  •  routes/web.phpの2箇所を修正します
    • 「use Illuminate\Support\Facades\Log;」を追加する
    • 「Log::debug(‘test’);」を追加する
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Log;   // 追加

Route::get('/', function () {
    Log::debug('json_log_test');   // 追加
    return view('welcome');
});

Laravelアプリにアクセスし、以下のようにターミナル上に出力されれば、JSON形式でログを標準出力できています。


{"message":"json_log_test","context":{},"level":100,"level_name":"DEBUG","channel":"local","datetime":"2024-06-02T00:27:24.540572+00:00","extra":{}}

まとめ

Laravelをコンテナで運用する際には、ログをJSON形式で標準出力することで、運用やデバッグを効率化できます。設定方法も簡単です!

]]>
Laravel Adminで効率的に管理画面を作成する。Dockerを使用した環境構築と使い方について記載。 https://it.kensan.net/laravel-admin.html Sun, 26 May 2024 03:12:23 +0000 http://35.78.232.10/it/?p=1959
Laravel Adminは、ウェブアプリケーションの管理画面を効率的かつ簡単に作成できるツールです。
この記事では、Laravel Adminの利点と使い方について詳しく記載します。
Laravel Adminを利用すると、データベースのCRUD(作成、読み取り、更新、削除)操作を簡単に実行でき、管理画面の作成がより柔軟で効率的になります。

多機能なデータテーブルやグラフなどの便利な機能もあり、Laravel Adminを使用することで、データの可視化や分析も簡単に行えます!!

Laravel Adminとは

Laravel Adminは、Laravelフレームワークで作成されたパッケージです。

このパッケージを使用すると、管理画面を簡単に作成することができます。

Laravel Adminは、Laravelの特徴であるシンプルさと柔軟性を活かして、効率的な管理画面を作成するためのツールとなっています。

データベースの管理画面を作成するための機能が豊富に揃っていて、さまざまなデータ型やリレーションシップをサポートし、関連するデータの管理も容易に行うことができます。さらに、Laravel Adminは、データの表示や操作に関する多くのオプションを提供しています。

Laravel Adminの利点

Laravel Adminを使用することには、以下のような利点があります。

1. 開発効率UP

Laravel Adminを使用すると、データベースのテーブル設計やCRUD操作のためのコードの記述が不要になります。これにより、開発者は時間と労力を節約することができます。

2. 柔軟性と拡張性

Laravel Adminは、カスタムフィールドやフィルタリングオプションの追加が容易です。

これにより、開発者は管理画面の作成において柔軟性と拡張性を持つことができます。

必要な機能や要件に応じて、Laravel Adminをカスタマイズすることができます。

3. 直感的なインターフェり効果的な管理画面を作成することができます。

Laravel Adminには、以下のような機能と機能があります。

CRUD操作

Laravel Adminは、CRUD操作(作成、読み取り、更新、削除)を自動化するためのツールです。データベースのテーブルと関連するフォームやリストを簡単に作成することができます。CRUD操作は、直感的なインターフェースを使用して行うことができます。

カスタムフィールドとフィルタリングオプション

Laravel Adminでは、カスタムフィールドやフィルタリングオプションの追加が容易です。開発者は、データベースのテーブルにさまざまなフィールドを追加することができます。また、データのフィルタリングや検索を行うためのオプションも提供されています。

パーミッションとロールの管理

Laravel Adminは、パーミッションとロールの管理をサポートしています。開発者は、ユーザーに対して特定の操作やデータへのアクセス権を設定することができます。これにより、セキュリティを強化し、適切なアクセス制御を実現することができます。

Dockerを使用したLaravel-adminのインストール方法

Docker上でLaravelを動くようにしてから、Laravel-adminをインストールしていきます。

まずはDocker周りから準備していきます。

用意するコンテナ

コンテナは以下のような構成です。DB確認用に、phpmyadminもインストールします。

  • アプリコンテナ
    • PHP:8.3をインストールして、Laravel 10をインストールする
  • Nginxコンテナ
    • 最新のNginxをインストール
  • DBコンテナ
    • MySQL:8.0.36をインストール
  • phpmyadminコンテナ
    • 最新のphpmyadminをインストール(現時点の最新バージョン5.2.1をインストール)

では実際にローカル開発環境を構築していきます。

各コマンドをコピペで環境構築できます!

Laravelのローカル開発環境構築

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

ディレクトリ構成

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


├── docker
│   ├── db  # MySQL(DB)コンテナの設定ファイル等を入れるディレクトリ
│   │   └── my.cnf
│   ├── nginx  # nginxコンテナの設定ファイル等を入れるディレクトリ
│   │   └── default.conf
│   └── php  # アプリ(PHP)コンテナの設定ファイル等を入れるディレクトリ
│       └── Dockerfile
└── docker-compose.yml

ディレクトリの作成

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

mkdir test_laravel
cd test_laravel/

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

docker-compose.ymlの作成

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

vi docker-compose.yml

<ファイルの中身>


version: '3'
services:
  app:
    container_name: app_laravel  
    build: ./docker/php
    volumes:
      - .:/var/www
  nginx:
    image: nginx 
    container_name: nginx
    ports:
      - 8000:80 
    volumes:
      - .:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    working_dir: /var/www
    depends_on:
      - app
  db:
    image: mysql:8.0.36
    container_name: db
    environment: 
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: database 
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:  
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf 
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
  # phpMyAdmin
  phpmyadmin:
    container_name: test_phpmyadmin
    image: phpmyadmin
    environment:
    - PMA_USER=root
    - PMA_PASSWORD=password
    ports:
    - 8080:80

MySQLのmy.confを作成

MySQLのmy.confを作成します。

mkdir docker

mkdir docker/db

vi docker/db/my.conf

<ファイルの中身>


[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_authentication_plugin=mysql_native_password

[client]
default-character-set=utf8mb4

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 / {
    root /var/www/laravel-project/public;
    index index.php;
    try_files $uri $uri/ /index.php?$query_string;
  }
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass app:9000; 
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

アプリコンテナの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


WORKDIR /var/www

RUN composer global require "laravel/installer"

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

コンテナ立ち上げ

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

docker compose up -d

Laravel 10のインストール

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

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

DBの接続先をsqlliteからmysqlに変更します。

vi laravel-project/.env

<ファイルの中身(DB設定箇所を編集します)>

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=password

以下のコマンドでマイグレーションを実行します。

cd laravel-project/
php artisan migrate

laravel-admin のインストール

以下のコマンドでLaravel-adminをインストールします。

composer require encore/laravel-admin

chmod -R 777 ./*

./artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"

./artisan admin:install

http://localhost:8000/admin/auth/loginにアクセスして、ログイン画面が表示されれば成功です。

一番最初は、ユーザー名:admin、パスワード:admin でログイン可能です。

Laravel Adminのカスタマイズ方法

Laravel Adminをカスタマイズする方法は以下の通りです。

  1. コントローラのカスタマイズ
  2. ビューのカスタマイズ
  3. ルーティングのカスタマイズ
  4. テーマのカスタマイズ

Laravel Adminは、カスタマイズによりさまざまな要件に対応することができます。開発者は、自分のプロジェクトに応じてLaravel Adminをカスタマイズすることができます。そのため、柔軟性と拡張性を持つ管理画面を作成することができます。

Laravel Adminの基本操作

Laravel Adminの基本的な操作方法は以下の通りです。

  1. テーブルの作成
  2. データの追加・編集・削除
  3. データの表示・検索・フィルタリング
  4. ページネーションの設定

Laravel Adminは、直感的なインターフェースを使用してこれらの操作を行うことができます。開発者は、簡単にデータの操作や表示を行うことができます。

Laravel Adminでのデータの管理と表示

Laravel Adminを使用すると、データの管理と表示が容易になります。データベースのテーブルと関連するデータを簡単に管理することができます。また、データの表示や操作に関する多くのオプションを提供しています。

Laravel Adminでは、データの追加、編集、削除などの操作を直感的なインターフェースで行うことができます。さらに、データの表示やフィルタリング、検索なども簡単に行うことができます。これにより、開発者はデータを効率的に管理することができます。

Laravel Adminでのパーミッションとロールの管理

Laravel Adminは、パーミッションとロールの管理をサポートしています。開発者は、ユーザーに対して特定の操作やデータへのアクセス権を設定することができます。これにより、セキュリティを強化し、適切なアクセス制御を実現することができます。

Laravel Adminでのデータのフィルタリングと検索

Laravel Adminでは、データのフィルタリングと検索が容易に行えます。開発者は、データベースのテーブルにフィルタリングオプションを追加することができます。これにより、特定の条件に一致するデータのみを表示することができます。

実際にCRUD画面を作成してみる

実際にCRUD(作成、読み込み、更新、削除)できる画面を作成してみます。

Postテーブルを作成して、Postテーブルに対するCRUDをできるようにします。

以下で作成した環境で試してみます!

Laravel Adminで効率的に管理画面を作成する。Dockerを使用した環境構築と使い方について記載。
Laravel Adminは、ウェブアプリケーションの管理画面を効率的かつ簡単に作成できるツールです。 この記事では、Laravel Adminの利点と使い方について詳しく記載します。 Laravel Adminを利用すると、データベースの...

 

マイグレーション

以下のコマンドでマイグレーションファイルを作成します。

php artisan make:migration create_staffs_table --create=posts

database/migrations配下にマイグレーションファイルが作成されたので、作成されたファイルを以下の通り編集します。


<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up(): void { Schema::create('posts', function (Blueprint $table) { $table->id();
            $table->string('name');
            $table->text('post');
            $table->integer('user_id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};

以下のコマンドでマイグレーションを実行して、テーブルを作成します。

php artisan migrate

以下のコマンドでモデルとコントローラを作成します。

php artisan make:model Post

php artisan admin:make PostController --model=App\\Models\\Post

ルーティング追加

app/Admin/routes.phpを以下の通り編集します。HomeControllerの記述の下に「$router->resource(‘posts’, PostController::class);」を追加です。

$router->get('/', 'HomeController@index')->name('home');
$router->resource('posts', PostController::class);   // これを追加!!

メニューの追加

http://localhost:8000/admin/auth/menuにアクセスして、以下の設定でメニューを追加します。

Title:投稿

RUI:posts

Role:Administrator

Permission:All Permission

画面的には以下のようになります。入力してSubmitです!

動作確認

http://localhost:8000/admin/postsにアクセスすると、以下のように、Postテーブルに対するCRUDができる画面が出来上がっています。

プログラムの中身についてみてみる

以下のコマンドでモデルとコントローラを作成しましたが、作成されたプログラムについてみていきます。

php artisan make:model Post 
php artisan admin:make PostController --model=App\\Models\\Post
モデル

作成されたプログラムは以下の通りです。


<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;
}

特殊な記載はありません。モデルは通常のLaravelと同様の記載となります。

コントローラ

作成されたプログラムは以下の通りです。


<?php 
namespace App\Admin\Controllers; 

use App\Models\Post; 
use Encore\Admin\Controllers\AdminController; 
use Encore\Admin\Form; 
use Encore\Admin\Grid; 
use Encore\Admin\Show; 

class PostController extends AdminController { 
    /** * Title for current resource. 
     * 
     * @var string 
    */ 
    protected $title = 'Post'; 
    /** 
    * Make a grid builder. 
    * 
    * @return Grid 
    */ 
    protected function grid() { 
        $grid = new Grid(new Post()); 
        $grid->column('id', __('Id'));
        $grid->column('name', __('Name'));
        $grid->column('post', __('Post'));
        $grid->column('user_id', __('User id'));

        return $grid;
    }

    /**
     * Make a show builder.
     *
     * @param mixed $id
     * @return Show
     */
    protected function detail($id)
    {
        $show = new Show(Post::findOrFail($id));

        $show->field('id', __('Id'));
        $show->field('name', __('Name'));
        $show->field('post', __('Post'));
        $show->field('user_id', __('User id'));

        return $show;
    }

    /**
     * Make a form builder.
     *
     * @return Form
     */
    protected function form()
    {
        $form = new Form(new Post());

        $form->text('name', __('Name'));
        $form->textarea('post', __('Post'));
        $form->number('user_id', __('User id'));

        return $form;
    }
}

上記プログラムの各メソッドの役割を以下に記載します。

  1. grid()メソッド
    • 管理画面の一覧表示を設定するメソッドです。Encore\Admin\Gridクラスを使用して、データの表示やフィルタリング、ソートなどの機能を設定します。
  2. detail($id)メソッド
    • 単一のレコードの詳細表示を設定するメソッドです。Encore\Admin\Showクラスを使用して、レコードの各フィールドを表示します。
  3. form()メソッド
    • フォームの設定を行うメソッドです。Encore\Admin\Formクラスを使用して、レコードの作成・編集のためのフォームを設定します。
コントローラのgridメソッドをカスタマイズしてみる

<カスタマイズの概要>

  • 一覧にソートとコピー機能を追加
  • フィルタにpostの内容を部分一致検索する項目を追加

上記のカスタマイズをする場合のソースコードは以下のようになります。



    protected function grid()
    {
        $grid = new Grid(new Post());

        // ソート追加
        $grid->column('id', __('Id'))->sortable();
        // コピー機能追加
        $grid->column('name', __('Name'))->copyable();
        // ソートとコピー機能追加
        $grid->column('post', __('Post'))->copyable()->sortable();
        $grid->column('user_id', __('User id'));

        // フィルタ
        $grid->filter(function ($filter) {
            // postの内容を部分一致検索
            $filter->like('post',  __('Post'));
        });

        return $grid;
    }

以下、カスタマイズ後の画面です。

 

コントローラのformメソッドをカスタマイズしてみる

<カスタマイズの概要>

  1. user_id項目のコメントアウト:
    • ログイン中のユーザー情報から設定するためにコメントアウト
  2. 保存時のコールバック:
    • フォームが保存される前に実行されるコールバックを定義
    • フォームが新規作成の場合、user_id項目に、現在ログイン中のユーザーのIDが設定されます。
    • 投稿時に投稿者のユーザーIDを自動的に設定することで、投稿が誰によって作成されたかを追跡できるようにしています。

上記のカスタマイズをしたソースコードは以下のようになります。


    protected function form()
    {
        $form = new Form(new Post());

        $form->text('name', __('Name'));
        $form->textarea('post', __('Post'));
        
        // user_idはログイン情報から設定するため、コメントアウト
        //$form->number('user_id', __('User id'));

        $form->saving(function (Form $form) {
            // 登録時、user_idを設定
            if ($form->isCreating()) {
                $form->model()->user_id = Admin::user()->id;
            }
        });

        return $form;
    }

以下、カスタマイズ後の画面です。

まとめ

Laravel Adminという管理画面を作成するのに便利なツールを紹介させていただきました!!

]]>
Laravel11をEC2で動かす https://it.kensan.net/ec2-laravel11.html Tue, 14 May 2024 22:56:28 +0000 http://43.207.159.108/it/?p=1917 Laravel11をEC2で動かしてみます。

なるべくお金をかけずに、かつ、高速なLaravel環境を構築したいので、CPUはArm、WEBサーバはNginxを使っていきます

まずは具体的な構成を記載していきます!

構成

  • EC2を使用
    • インスタンスはt4g.mediumを使用
      • t4gは、Arm ベースの AWS Graviton2 のインスタンスです
      • T3 インスタンスよりも価格パフォーマンスが最大で 40% 高いようです
Amazon EC2 T4g インスタンス – Amazon Web Services
AWS Graviton2 プロセッサを搭載した T4g インスタンスは、Amazon EC2 のバースト可能な汎用ワークロードとしては最高のコストパフォーマンスを提供します。
  • OS
    • Amazon Linux 2023
  •  Webサーバ
    • Nginxを使用
    • Apacheより高速
  • PHP
    • バージョン:8.2.15
    • Laravelを動かすのに必要なもの
  • Webサーバで動かすもの
    • Laravel

では実際にEC2起動からLaravelインストールまでやっていきます!

EC2起動

  • 以下の設定でEC2を起動します
    • Amazon マシンイメージ (AMI)でAmazon Linux 2023を指定する
    • アーキテクチャで64ビット(Arm)を指定する
    • インスタンスタイプでt4g.mediumを指定する
    • ネットワーク設定で「からの SSH トラフィックを許可」「インターネットからの HTTP トラフィックを許可」を指定する
      • セキュリティを考慮して、アクセス元は絞った方がいい
    • EC2へはEC2 Instance Connectで接続するため、キーペアはなしでOK

EC2の中に入る

  • 諸々設定するため、以下の流れで起動したEC2の中に入ります
    • AWSコンソールのEC2の一覧で、該当のEC2を選択して、接続を押下
      • EC2 Instance Connectタブの接続を押下

もろもろインストール

パッケージ最新化

  • パッケージ最新化
sudo dnf update -y

Nginxインストール〜設定

  • Nginxインストール
sudo dnf -y install nginx
  • Nginx設定変更
sudo vi /etc/nginx/nginx.conf

serverの箇所を以下通り修正


    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html/public;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        index index.php;
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php-fpm/www.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
            include        fastcgi_params;

       }
    }
  • Nginx起動
sudo systemctl start nginx
  • Nginx自動起動をON
sudo systemctl enable nginx
  • ブラウザでNginxが正常に動作していることを確認
    • EC2に割り当てられているパブリックIPにhttpでアクセスする
      • Welcome to nginx!」が出れば、Nginxが起動できているので問題なし

PHPインストール

  • PHPをインストールする
sudo dnf install -y php-fpm php-mysqli php-json php php-devel

php-fpm起動

  • php-fpmを起動します
sudo systemctl start php-fpm.service

 

composerをインストールする

    • composerインストールします
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    php composer-setup.php
    php -r "unlink('composer-setup.php');"
    sudo mv composer.phar /usr/local/bin/composer

     

    Laravel11をインストール

    • Laravel11をインストールします。
    composer create-project --prefer-dist laravel/laravel laravel-project "11.*"
    • 出来上がったファイルをNginxのルートディレクトリにコピー
    sudo cp -r laravel-project/* /usr/share/nginx/html/
    • storageディレクトリの権限設定
    cd /usr/share/nginx/html/
    chmod -R 777 storage
    • .envファイルの作成
    
    vi .env
    
    <ファイルの中身>
    APP_KEY={APIキー}
    DB_CONNECTION=sqlite
    
    APIキーは
    php artisan key:generate
    で発行可能
    •  以下のコマンドでsqlite用ファイルを作成し権限を付与します。
    
    touch database/database.sqlite
    chmod 777 database/database.sqlite
    

    動作確認

    • 動作確認
      • 「http://{EC2のIPアドレス}」にアクセスして、以下の画面表示されればOK〜〜

      ]]>
      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形式で標...
      ]]>
      DockerでLaravel 11のローカル開発環境を構築する。ついでにphpmyadminも入れてみる。 https://it.kensan.net/docker-laravel-11-phpmyadmin.html Mon, 06 May 2024 02:07:18 +0000 http://13.112.45.21/it/?p=1844 DockerでLaravel 11のローカル開発環境を構築していきます。

      DB確認用に、phpmyadminもインストールします。

      コンテナは以下のような構成です。本番環境に応用できるように、あえてSailは使いません。

      • アプリコンテナ
        • PHP:8.3をインストールして、Laravel 11をインストールする
      • Nginxコンテナ
        • 最新のNginxをインストール
      • DBコンテナ
        • MySQL:8.0.36をインストール
      • phpmyadminコンテナ
        • 最新のphpmyadminをインストール(現時点の最新バージョン5.2.1をインストール)

      では実際にローカル開発環境を構築していきます。

      各コマンドをコピペで環境構築できます!

      Laravelのローカル開発環境構築

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

      ディレクトリ構成

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

      
      ├── docker
      │   ├── db  # MySQL(DB)コンテナの設定ファイル等を入れるディレクトリ
      │   │   └── my.cnf
      │   ├── nginx  # nginxコンテナの設定ファイル等を入れるディレクトリ
      │   │   └── default.conf
      │   └── php  # アプリ(PHP)コンテナの設定ファイル等を入れるディレクトリ
      │       └── Dockerfile
      └── docker-compose.yml

      ディレクトリの作成

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

      mkdir test_laravel
      cd test_laravel/

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

      docker-compose.ymlの作成

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

      vi docker-compose.yml

      <ファイルの中身>

      
      version: '3'
      services:
        app:
          container_name: app_laravel  
          build: ./docker/php
          volumes:
            - .:/var/www
        nginx:
          image: nginx 
          container_name: nginx
          ports:
            - 8000:80 
          volumes:
            - .:/var/www
            - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
          working_dir: /var/www
          depends_on:
            - app
        db:
          image: mysql:8.0.36
          container_name: db
          environment: 
            MYSQL_ROOT_PASSWORD: password
            MYSQL_DATABASE: database 
          command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
          volumes:  
            - ./docker/db/data:/var/lib/mysql
            - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf 
            - ./docker/db/sql:/docker-entrypoint-initdb.d
          ports:
            - 3306:3306
        # phpMyAdmin
        phpmyadmin:
          container_name: test_phpmyadmin
          image: phpmyadmin
          environment:
          - PMA_USER=root
          - PMA_PASSWORD=password
          ports:
          - 8080:80

      MySQLのmy.confを作成

      MySQLのmy.confを作成します。

      mkdir docker
      
      mkdir docker/db
      
      vi docker/db/my.conf

      <ファイルの中身>

      
      [mysqld]
      character-set-server=utf8mb4
      collation-server=utf8mb4_unicode_ci
      default_authentication_plugin=mysql_native_password
      
      [client]
      default-character-set=utf8mb4

      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$ {
          try_files $uri =404;
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass app:9000; 
          fastcgi_index index.php;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param PATH_INFO $fastcgi_path_info;
        }
      }
      

      アプリコンテナの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
      
      
      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.*"

      DBの接続先をsqlliteからmysqlに変更します。

      vi laravel-project/.env

      <ファイルの中身(DB設定箇所を編集します)>

      DB_CONNECTION=mysql
      DB_HOST=db
      DB_PORT=3306
      DB_DATABASE=laravel
      DB_USERNAME=root
      DB_PASSWORD=password

      以下のコマンドでマイグレーションを実行します。

      cd laravel-project/
      php artisan migrate

      以上で環境が出来上がりましたので、最後に動作確認します!

      動作確認

      • http://localhost:8000/にアクセスして
        • 以下のLaravelの画面が見れればOK
      • http://localhost:8080/にアクセスして
        • phpmyadminが見れればOK

      sailを使う場合

      以下のコマンドでプロジェクトインストールします。

      curl -s "https://laravel.build/example-app" | bash

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

      cd プロジェクト名 && ./vendor/bin/sail up

      ブラウザで「http://localhost/」 へアクセスすると以下のエラーが出ます。

      SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.sessions' doesn't exist

      「RUN MIGRATIONS」をクリックした後、「Refresh now」をクリックするとLaravelのスタート画面が表示されます。成功〜〜

      ]]>
      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です。

      ]]>