ちなみに私は割とPHP初心者です。
初心者ですが、これからAPI作成するならPHPが良いと思っています。
PHPが良い理由は、実装できる人が多いと思っていて、いざとなれば他の人(他の会社)に協力を仰ぎやすそうだからです。インターネット上に情報もいっぱいあるというアドバンテージもあると思います。
フレームワークは、PHPの中で一番ポピュラーという理由からLaravel!と考えています。
まずは、作成する環境について記載していきます。
以下の構成で動かしてみます。
実際に、Laravel 11をAWS Lambdaで動かしてみます!!
まずは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 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です。
以下のコマンドでコントローラを作成
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": "商品名"
}
まず、Lambda関数URLがあるので、API GatewayはなくてもAPIの公開は可能で、この方がAPI Gateway分のコスト削減が可能とは思います。
しかし、API Gatewayを使用した方が、リクエストの認証(IAM、Cognito、APIキーなど)などが使える点で有利かと思います。
RDSなら、RDS Proxy × Aurora Serverless v2という選択肢があると思います。
RDS Proxyを使うことで、データベースへの接続をプロキシすることで、データベースへの負荷を軽減できますが、8ACU分の料金がかかります。
費用を抑えたい場合、かつ同時接続数が少ない場合は、RDS ProxyなしでもOKかな。Aurora Serverless v2はゼロキャパシティのスケーリングをサポートしています。
ユースケースによっては、Aurora Serverless v2とElastiCacheという組み合わせで、ElastiCacheでRDSの情報をキャッシュしてRDSの負荷を抑えるというのもありかと。
もしくは、DynamoDBという選択肢もあると思いますが、設計の難易度が高い…ですね。
DBの選択肢など迷うことも多くありますが、プログラムとしてはLaravel(PHP)がいいと思っています!!
]]>こうすれば、SendGridのメール設定ができて、簡単に設定後の動作確認ができるよ、ということを記載していきます。
SendGridのテスト・デバッグ時のメール送信確認の設定周りを中心に記載します。
メール送信のLaravelプログラムの書き方については記載していません。
ローカル開発環境構築は以下の記事をご参照ください。本記事ではローカル開発環境構築が済んでいることを前提に記載します。
本記事ではSendGrid側の設定ができていることを前提に記載します。
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のメール設定ができて、簡単に設定後の動作確認ができたと思います。
]]>以下の2つの方法を記載します。
こうすれば、テスト時のメール設定ができて、簡単に設定後の動作確認ができるよ、ということを記載していきます。
テスト・デバッグ時のメール送信確認の設定周りを中心に記載します。
メール送信のLaravelプログラムの書き方については記載していません。
ローカル開発環境構築は以下の記事をご参照ください。本記事ではローカル開発環境構築が済んでいることを前提に記載します。
.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
.envファイルでメールをmailhogに吐き出すように設定します。
以下のコマンドでプロジェクト直下の「.env」ファイルを開きます
vi .env
以下のとおり、「.env」ファイル内のMAIL_HOST
にmailhog
を設定します。
ポートは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
以下のコマンドでメールを送信可能です。
// コンテナの中に入る 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通りでのメールの確認方法を記載しました。
これでメール実装の設定準備はできたと思いますー
]]>Laravel Adminって何者?という方は以下の記事をご参照ください。
gridとformについて簡単に書くと、以下のようになります。gridとformを理解することでLaravel Adminの大部分を使いこなせると思います。
本記事でやること
では、todoリストを作成しつつ、説明していきます
環境構築は以下の記事をご参照ください。Dockerで簡単に構築できます。
テーブル構成は以下のようになります。
では、以下のコマンドでマイグレートファイルを作成します。
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を作成します。
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メソッドを編集しつつ、説明していきます。
まずformメソッドについて記載します。
以下のような機能を持っています。新規登録・編集用のメソッドですね。
それではformメソッドを編集していきます。
編集前(コマンドでコントローラ作成直後)は、以下の登録画面になっています。
直したいポイントは以下です。
完成系の画面イメージは以下のような感じです。
では順番に修正していきます。
ファイル上部で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
の入力ボックスをコメントアウトします。
//$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の入力ボックスをコメントアウトします。
//$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; //ここを追加
});
完了です。次はコメントです。
以下のように記載することで、コメントを登録できるようになります。
# コメント
$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
を表示するコードになっています。
編集画面の完成系は以下のようになります!
まずgridメソッドについて記載します。
以下のような機能を持っています。一覧ページ表示用のメソッドですね。
直したいポイントは以下です。
以下のコードを書いてあげれば、検索可能になります。
作成者(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を赤字で表示できます。
// 文字色設定
$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になっているはずです。
以下が実現できましたー
修正後のコントローラの全体ソースは以下の通りです。
<?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素晴らし〜
Laravelに限らず、コンテナでは、JSON形式で標準出力が良いと思いますが、Laravelでは簡単にログをJSON形式で標準出力可能ですので、設定しておいた方が良いと思います!
JSON形式はデータを構造化し、分析や監視ツールで扱いやすい形式です。
また、新しい情報を追加するのも容易なため、ログ出力はJSON形式が良いと考えています。
JSON化しておけば、たとえば、AWSのCloudWatchでログ検索する際などで便利です。
多くのクラウドプロバイダーは、コンテナの標準出力からログを収集し、そのログを分析や可視化するためのツールやサービスを提供しているためです。
AWSで言うと、Fargateでのコンテナでログを標準出力すると、CloudWatchログの1つのロググループにまとまってくれて、簡単にログ検索できます。
これにより、運用やデバッグがスムーズに行えます。
以下の記事のようなメトリクスフィルターも簡単に作れたりします。
では、Laravel11を例にログをJSON形式で標準出力する方法を記載します。
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を修正します。
以下のように、LOG_CHANNEL=stack
をコメントアウトして、LOG_CHANNEL=stdout
を追加します。
#LOG_CHANNEL=stack // コメントアウト
LOG_CHANNEL=stdout // 追加
routes/web.phpでログ出力するようにして動作確認します。
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を使用することで、データの可視化や分析も簡単に行えます!!
Laravel Adminは、Laravelフレームワークで作成されたパッケージです。
このパッケージを使用すると、管理画面を簡単に作成することができます。
Laravel Adminは、Laravelの特徴であるシンプルさと柔軟性を活かして、効率的な管理画面を作成するためのツールとなっています。
データベースの管理画面を作成するための機能が豊富に揃っていて、さまざまなデータ型やリレーションシップをサポートし、関連するデータの管理も容易に行うことができます。さらに、Laravel Adminは、データの表示や操作に関する多くのオプションを提供しています。
Laravel Adminを使用することには、以下のような利点があります。
Laravel Adminを使用すると、データベースのテーブル設計やCRUD操作のためのコードの記述が不要になります。これにより、開発者は時間と労力を節約することができます。
Laravel Adminは、カスタムフィールドやフィルタリングオプションの追加が容易です。
これにより、開発者は管理画面の作成において柔軟性と拡張性を持つことができます。
必要な機能や要件に応じて、Laravel Adminをカスタマイズすることができます。
Laravel Adminには、以下のような機能と機能があります。
Laravel Adminは、CRUD操作(作成、読み取り、更新、削除)を自動化するためのツールです。データベースのテーブルと関連するフォームやリストを簡単に作成することができます。CRUD操作は、直感的なインターフェースを使用して行うことができます。
Laravel Adminでは、カスタムフィールドやフィルタリングオプションの追加が容易です。開発者は、データベースのテーブルにさまざまなフィールドを追加することができます。また、データのフィルタリングや検索を行うためのオプションも提供されています。
Laravel Adminは、パーミッションとロールの管理をサポートしています。開発者は、ユーザーに対して特定の操作やデータへのアクセス権を設定することができます。これにより、セキュリティを強化し、適切なアクセス制御を実現することができます。
Docker上でLaravelを動くようにしてから、Laravel-adminをインストールしていきます。
まずはDocker周りから準備していきます。
コンテナは以下のような構成です。DB確認用に、phpmyadminもインストールします。
では実際にローカル開発環境を構築していきます。
各コマンドをコピペで環境構築できます!
まずは、完成系のディレクトリ構成から記載します。
以下のような構成となります。
├── 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を作成します。
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を作成します。
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を作成します。
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作成を作成します。
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
アプリコンテナの中に入り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をインストールします。
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は、カスタマイズによりさまざまな要件に対応することができます。開発者は、自分のプロジェクトに応じてLaravel Adminをカスタマイズすることができます。そのため、柔軟性と拡張性を持つ管理画面を作成することができます。
Laravel Adminの基本的な操作方法は以下の通りです。
Laravel Adminは、直感的なインターフェースを使用してこれらの操作を行うことができます。開発者は、簡単にデータの操作や表示を行うことができます。
Laravel Adminを使用すると、データの管理と表示が容易になります。データベースのテーブルと関連するデータを簡単に管理することができます。また、データの表示や操作に関する多くのオプションを提供しています。
Laravel Adminでは、データの追加、編集、削除などの操作を直感的なインターフェースで行うことができます。さらに、データの表示やフィルタリング、検索なども簡単に行うことができます。これにより、開発者はデータを効率的に管理することができます。
Laravel Adminは、パーミッションとロールの管理をサポートしています。開発者は、ユーザーに対して特定の操作やデータへのアクセス権を設定することができます。これにより、セキュリティを強化し、適切なアクセス制御を実現することができます。
Laravel Adminでは、データのフィルタリングと検索が容易に行えます。開発者は、データベースのテーブルにフィルタリングオプションを追加することができます。これにより、特定の条件に一致するデータのみを表示することができます。
実際にCRUD(作成、読み込み、更新、削除)できる画面を作成してみます。
Postテーブルを作成して、Postテーブルに対するCRUDをできるようにします。
以下で作成した環境で試してみます!
以下のコマンドでマイグレーションファイルを作成します。
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;
}
}
上記プログラムの各メソッドの役割を以下に記載します。
Encore\Admin\Grid
クラスを使用して、データの表示やフィルタリング、ソートなどの機能を設定します。Encore\Admin\Show
クラスを使用して、レコードの各フィールドを表示します。Encore\Admin\Form
クラスを使用して、レコードの作成・編集のためのフォームを設定します。<カスタマイズの概要>
上記のカスタマイズをする場合のソースコードは以下のようになります。
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;
}
以下、カスタマイズ後の画面です。
<カスタマイズの概要>
user_id
項目のコメントアウト:
user_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という管理画面を作成するのに便利なツールを紹介させていただきました!!
以下の順で進めていきます。今回はとりあえずFargate上で動くことをゴールにしますので、MySQLは使いません。
まずは、ローカルでLaravel11を起動していきます。
まずは、完成系のディレクトリ構成から記載します。
以下のような構成となります。
├── docker
│ ├── nginx
│ │ ├── Dockerfile
│ │ └── default.conf
│ └── php
│ └── Dockerfile
└── docker-compose.yml
上記ディレクトリ構成を作成するためのディレクトリを作成します。
mkdir fargate_laravel
cd fargate_laravel/
準備はできましたので、ディレクトリ構成に記載のディレクトリとファイルを作成していきます。
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を作成します。
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を作成します。
vi docker/nginx/Dockerfile
<ファイルの中身>
FROM nginx:1.25
COPY docker/nginx/default.conf /etc/nginx/conf.d/
アプリコンテナの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
アプリコンテナの中に入りLaravel11をインストールします。
# アプリコンテナに入るコマンド
docker compose exec app bash
# Laravel11インストールコマンド
composer create-project --prefer-dist laravel/laravel laravel-project "11.*"
ブラウザで「http://localhost:8000/」 へアクセスして以下の画面が表示されればOK!
次は、ECRにイメージを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にデプロイします!
以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。
以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。
作成したクラスターのタスクタブにある「新しいタスクの実行」を押下
作成したクラスターのタスクタブの任意のタスクの詳細を開きます。
パブリックIPが表示されるので、パブリックIPでブラウザからアクセスします。
以下の画面が表示されればOKです。
コンテナ利用時のログ出力に関する記事もありますので、気になる方は以下をクリックくださーい
DB確認用に、phpmyadminもインストールします。
コンテナは以下のような構成です。本番環境に応用できるように、あえてSailは使いません。
では実際にローカル開発環境を構築していきます。
各コマンドをコピペで環境構築できます!
まずは、完成系のディレクトリ構成から記載します。
以下のような構成となります。
├── 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を作成します。
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を作成します。
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を作成します。
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作成を作成します。
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
アプリコンテナの中に入り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
以上で環境が出来上がりましたので、最後に動作確認します!
以下のコマンドでプロジェクトインストールします。
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にデプロイするということをやっていきます!
Laravelプログラムをローカル開発環境で開発完了後、
AWS code4兄弟のcodecommit/codepipeline/codebuild/codedeployとECRを使用して、
ECS-Fargateへのデプロイする方法を記載していきます。
<デプロイ対象の環境構成>
Nginx
laravel(PHP)
docker
<使用するAWSサービス>
codepipeline
codecommit
codebuild
codedeploy
ECR
ECS-Fargate
<やること>
codecommitへpushした後のECSへのデプロイを自動化する
以下で構成された環境をECSへデプロイします!
以下でAWSサービスを使用してECS-Fargateへデプロイします!
ローカル開発環境で開発後、codecommitへpushした後のECS-Fargateへのデプロイを自動化していきます!
①ローカル開発環境で開発
②codecommitへpush
③codepipelineが動き出し、codebuildを実行
④ビルドが終わったらdockerイメージをECRへ格納
⑤codepipelineに処理が戻りECSへのデプロイを実行
では、ローカル開発環境の作成から始めていきます
以下のことをやっていきます!
①dockerファイルなど必要なファイルの作成
②Laravelプロジェクト作成
③dockerコンテナ立ち上げ
④動作確認
まずは、完成系のディレクトリ構成から記載します。
以下のような構成となります。
├── docker
│ ├── nginx
│ │ ├── Dockerfile
│ │ └── default.conf
│ └── php
│ └── Dockerfile
└── docker-compose.yml
上記ディレクトリ構成を作成するためのディレクトリを作成します。
mkdir fargate_laravel
cd fargate_laravel/
準備はできましたので、ディレクトリ構成に記載のディレクトリとファイルを作成していきます。
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を作成します。
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を作成します。
vi docker/php/Dockerfile
<ファイルの中身>
FROM nginx:1.25
COPY docker/nginx/default.conf /etc/nginx/conf.d/
アプリコンテナの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
アプリコンテナの中に入りLaravel11をインストールします。
# アプリコンテナに入るコマンド
docker compose exec app bash
# Laravel11インストールコマンド
composer create-project --prefer-dist laravel/laravel laravel-project "11.*"
ブラウザで「http://localhost:8000/」 へアクセスして以下の画面が表示されればOK!
まず、codecommitの設定から始めていきます。
リポジトリ名:laravel-docker
後は設定を変えずに作成
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
以下の2つのリポジトリを作成します。
まず、プロジェクト直下に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
プロジェクト名:laravel-docker-build
ソースプロバイダ: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"
}
以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。
以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。
以下の設定で作成します。
クラスタ:laravel-cluster
コンピューティング設定:起動タイプ
タスクの数:1
タスク定義:作成したタスクを指定
サービス名:laravel-docker-service
後は設定を変えずに作成
codepipelineを以下の設定で作成します。
<ソースステージ>
ソースプロバイダー:AWS CodeCommit
リポジトリ:laravel-docker
ブランチ名:master
<ビルドステージ>
プロバイダ:AWS CodeBuild
プロジェクト名:laravel-docker-build
<デプロイステージ>
プロバイダー:Amazon ECS
クラスタ名:laravel-cluster
サービス名:laravel-docker-service
後は設定を変えずに作成
作成すると、ビルドが実行され、ECS-Fargateへデプロイされます。
タスクのIPをコピーして、ブラウザーに貼り付けアクセスしてみる
以下の画面が表示されればOKです。
まず試したことです。以下のことを試してみました。
WordPress単体インストール
WordPress複数インストール
Laravel(PHPフレームワーク)
CakePHP(PHPフレームワーク)
プランは「ライトプラン:月額220円」契約です!
結論としては、月額220円でWordPress複数起動できて、Laravel/CakePHPも使え、PHPであれば何でも使い放題という感想です。安くPHPのプログラムをサーバ上で動かしたい方にオススメです。
また、WordPressが簡単に使えて、とにかく早くて安い印象ですので、Wordpressを手軽に始めたい方にもオススメです。
まず、スターサーバーの特徴からみていきます!
スターサーバーの特徴として、以下の点を記載していきます。
7つのメリットを記載します。
①安価
②10日間無料お試しが可能です!
③高速サーバー環境が利用できる
④高い安定性
⑤無料SSLがある
⑥不正なアクセスに対するセキュリティを強化する機能もあり
⑦Cron設定も可能
DBを使用する場合でも月額220円(ライトプラン)で利用できる
→WordPressが月額220円(ライトプラン)で始められます
→WordPressだけではなくPHPで作られたプログラムは動作可能です
迷ったらお試しができます!試しに使ってみましょ!
お試しの際はこちらから
スターサーバーは、オールSSDの高速サーバー環境です。
→WordPressも高速です!高速であることはSEO的にも有利です。
急なアクセス増加時も即時プラン変更可能です。
→詳細は以下をご参照くださーい
無料でサイトをSSL化できます(httpsでアクセスできます)。
SSL化することで、SEO的に有利になります。
また、アクセスする人にとって安心感のあるサイトになります。
セキュリティ強化機能があり安心して使用可能
以下公式からの引用です
ご利用のWordPressにおいて、管理者ツール(ダッシュボード)に対する国外IPアドレスからの接続を制限したり、パスワード総当り(ブルートフォースアタック)による第三者のログインを防止するなど、不正なアクセスに対するセキュリティを強化する機能です。
WordPressセキュリティ設定 | レンタルサーバー【スターサーバー】レンタルサーバー「スターサーバー」のご利用マニュアル | ご利用のWordPressのセキュリティを強化する「WordPressセキュリティ設定」機能のご説明です。本機能によって国外IPのアクセスを制限したり、ログイン試行回数を制限するなどの設定が可能です。
プログラムの定期実行が可能です。
次はデメリットについて記載していきます
2つのデメリットについて記載していきます。
①自動バックアップ機能は用意されていない
②ネット上の情報はあまり多くない
基本的に手動バックアップですので、忘れずにバックアップ取りましょう!
他のレンタルサーバと比べてネット上の情報はあまり多くない印象です。
自分で使いこなせそうか、まずはお試ししてみるのがオススメです。お試しの際はこちらから!
次はプランについてです!
WordPressが使えるプランとして
ライト
スタンダード
ハイスピード
エンタープライズ
があり、アクセス数等によってプランを柔軟に選ぶことができます。
ライトプランが月額:220円で色々できるのでオススメです。具体的に何ができるかはこちらをご参照ください。
月額550円のハイスピードプランも「独自ドメイン永久無料特典付き」などお得な特典があるのでオススメです。
次は実際にスターサーバーを使ってみます!
①WordPress単体インストール
②WordPress複数インストール
③Laravel(PHPフレームワーク)
④CakePHP(PHPフレームワーク)
まずは、WordPressを試してみます。
GUI操作で設定可能なので簡単!!下のページ参考に簡単に使えるようになります。
WordPressを複数インストールして、複数サイトの運用を試してみます。
下の5ステップでできるので簡単!!
①1つ目のWordPressはGUI操作で立ち上げる(下記ページ参照)
②WordPress公式ページから自分のPCにWordPressをダウンロードする
③FTPソフトを使用してサーバにWordPressアップロード用のフォルダを作成する。
④作成したフォルダにWordPressをアップロードする。
⑤「http://ドメイン/③で作成したフォルダ」にアクセスしてインストールをする。その際、「テーブル接頭辞」は、すでにインストールしてあるものと被らないよう設定する。被ると既に作っているブログが上書きされてしまう事態に陥りおます。
以上でインストール完了。
次にLaravelを動かしてみます。
こちらは下記の3ステップでできるので簡単!!
①自分のPCローカルで開発する
②①で出来上がったソースコード全てをスターサーバーにアップロードする。
③DBを使用する場合「.env」ファイルのDB設定箇所をスターサーバーのDB情報に書き換える。
以下公式ページを参考にLaravelプロジェクト作成から、スターサーバ上で動かすとこまでやってみます!
①ローカルで(PC上で)プロジェクトを作成します
composer create-project laravel/laravel example-app
②ローカルでLaravelを立ち上げます。
cd example-app
php artisan serve
③ブラウザで「http://localhost:8000」にアクセスして以下の画面が出ればOKです。
laravel+starserver
④ソースコードをftpソフトでスターサーバー へアップロードします。
⑤「http://{ドメイン}/public/index.php」にアクセスし、再度以下の画面が表示され、スターサーバ上でLaravelが動いていることがわかります。
laravel+starserver
次はCakePHPです。以下公式ページを参考にCakePHPプロジェクト作成から、スターサーバ上で動かすとこまでやってみます!
①ローカルで(PC上で)プロジェクトを作成します
composer self-update && composer create-project --prefer-dist cakephp/app:^3.8 my_app_name
②ソースコードをftpソフトでスターサーバー へアップロードします。
③「http://{ドメイン}/index.php」にアクセスし、再度以下の画面が表示され、スターサーバ上でCakePHPが動いていることがわかります。
CakePHP+StarServer
PHP系は結構何でもできるので満足している。
Laravel/CakePHPも使えるし、wordpressの複数起動も簡単。
そして安くて早い!
次は、スターサーバーを10日間試しに使う方法を記載します。
試しに使ってみたい方はご参照ください。
スターサーバーをお試しで使う方法を記載します。
スターサーバー(Star Server)の「ライトプラン:月額220円」で、以下のことをできることが確認できました。
WordPress単体インストール
WordPress複数インストール
Laravel(PHPフレームワーク)
CakePHP(PHPフレームワーク)
コスパ最高ではないかと!
]]>