0. はじめに
大阪のLaravel初学者サウナーこと、kazumakishimoto(@kazuma_dev)です!
ACM
でSSL証明書発行→ELB(ALB)
でロードバランサーを設置してEC2を配下に登録する方法です!
(※EC2は1つしか作成していないですが、複数サーバーが設置されていることを想定してロードバランサーを作成)
0-1. 前回記事
- 【AWS】LaravelアプリをEC2デプロイ【まとめ編】
- 【AWS】LaravelアプリをEC2デプロイ①【CloudFormation / EC2 / RDS編】
- 【AWS】LaravelアプリをEC2デプロイ②【Route53編】
0-2. 全体の流れ
0-3. 本記事の対象者
- AWSで独自ドメインをSSL化したい方
0-4. 事前準備
- AWSアカウント作成済み
- リージョンはアジアパシフィック(東京)ap-northeast-1
-
grfl
やhoge
はサンプル名なので適宜変更して下さい - 独自ドメイン取得済み
0-5. 要件
- ACMでSSL証明書発行
- ELB(ALB)でロードバランサーを設置してEC2を配下に登録
- Route53でAレコードのエイリアスを作成
0-6. 本番環境
ツール | バージョン |
---|---|
OS | Amazon Linux 2 |
nginx | 1.12 |
PHP | 7.4.28 |
Laravel | 6.20.44 |
MySQL | 5.7.37 |
Composer | 1.10.26 |
Node.js | 13.14.0 |
0-7. AWS構成図
1. ACM
1-1. SSL証明書発行
1-2. CNAMEレコード作成
-
Route53でレコードを作成
ボタンからCNAMEレコードが作成されてから、約30分でステータス発行済み
に変化
1-3. DNS検証
-
検証保留中
からステータスがすぐに変化しなかったため、下記記事を参照にNSレコードの順番変更(※不要だったかもしれません)
ec2-user
$ dig grfl.work +trace
2. ELB
-
ターゲットグループ/セキュリティグループ/サブネット/ルートテーブル
はELB(ALB)作成中に画面遷移できますが、行ったり来たりが面倒なので先に作成しておきます。
2-1. ターゲットグループ
2-2. セキュリティグループ
2-3. サブネット
2-4. ルートテーブル
2-5. ロードバランサー
2-6. リスナーの追加と編集
- HTTPS化とHTTPでアクセスした際もHTTPSにリダイレクトするように設定
2-6-1. リスナーの追加
2-6-2. リスナーの編集
2-7. ヘルスチェック
3. Route53
4. HTTPS化
- 下記bladeだと、Chromeのデベロッパーツールに下記エラーが発生
resources/views/nav.blade.php
<form method="GET" action="{{ route('articles.search') }}" class="d-flex">
Mixed Content: The page at 'https://grfl.work/' was loaded over a secure connection, but contains a form that targets an insecure endpoint 'http://grfl.work/search'. This endpoint should be made available over a secure connection.
4-1. .env
ec2-user
$ ssh ec2-user@xx.xxx.xxx.xxx -i ~/.ssh/hoge.pem
$ cd /var/www/grfl/src
$ vi .env
.env
- APP_URL=http://xx.xxx.xxx.xxx
- APP_ENV=local
+ APP_URL=https://grfl.work/
+ APP_ENV=production
4-2. 強制HTTPS化
- 開発環境で下記編集
- リモートにpush
- 本番環境でpull
4-2-1. AppServiceProvider.php
AppServiceProvider.php
public function boot()
{
if (\App::environment(['production'])) {
\URL::forceScheme('https');
}
}
4-2-2. ForceHttps.php
ForceHttps.php
public function handle($request, Closure $next)
{
if (\App::environment(['production']) && isset($_SERVER["HTTP_X_FORWARDED_PROTO"]) != 'https') {
return redirect()->secure($request->getRequestUri());
}
return $next($request);
}
4-2-3. Kernel.php
Kernel.php
protected $middleware = [
\App\Http\Middleware\ForceHttps::class,
];
4-2-4. 開発環境でpush
local
$ git push origin hoge
// mergeなどしてリモートに反映
4-2-5. 本番環境でpull
ec2-user
$ cd /var/www/grfl
$ git pull origin master
4-3. migration
ec2-user
$ php artisan migrate:refresh --seed
4-4. 動作確認
4-5. エラーハンドリング
- 本番環境でvi編集などしてpull時にコンフリクトが発生した場合は下記で対処
補足
開発環境(FW/ツールのバージョンなど)
ツール | バージョン |
---|---|
Vue.js | 2.6.14 |
jQuery | 3.4.1 |
PHP | 7.4.1 |
Laravel | 6.20.43 |
MySQL | 5.7.36 |
Nginx | 1.18.0 |
Composer | 2.0.14 |
npm | 6.14.6 |
Git | 2.33.1 |
Docker | 20.10.11 |
docker-compose | v2.2.1 |
PHPUnit | 8.0 |
CircleCI | 2.1 |
heroku | 7.59.4 |
MacBook Air | M1,2020 |
macOS | Monterey 12.3 |
Homebrew | 3.3.8 |
ディレクトリ構造
【ルートディレクトリ】
├─ .circleci
│ └─ config.yml
├─ aws / CloudFormation
│ └─ ec2.yml
├─ docker
│ └─ mysql
│ └─ nginx
│ └─ php
│ └─ phpmyadmin
├─ src
│ └─ 【Laravelのパッケージ】
└─ docker-compose.yml
Reference
次回記事
- 【AWS】LaravelアプリをEC2デプロイ④【CircleCI / CodeDeploy編】
- 【AWS】LaravelアプリをEC2デプロイ⑤【SNS / Chatbot編】
- 【AWS】LaravelアプリをEC2デプロイ⑥【S3編】
- 【AWS】LaravelアプリをEC2デプロイ⑦【API編】
- 【AWS】お役立ちリンク集【随時更新】