LoginSignup
1
1

More than 1 year has passed since last update.

【AWS】LaravelアプリをEC2デプロイ③【ACM / ELB編】

Last updated at Posted at 2022-05-26

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. 全体の流れ

1.ACM
2.ELB
3.Route53
4.HTTPS化
補足
Reference
次回記事

0-3. 本記事の対象者

  • AWSで独自ドメインをSSL化したい方

0-4. 事前準備

  • AWSアカウント作成済み
  • リージョンはアジアパシフィック(東京)ap-northeast-1
  • grflhogeはサンプル名なので適宜変更して下さい
  • 独自ドメイン取得済み

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構成図

aws

1. ACM

1-1. SSL証明書発行

image.png
image.png
image.png

1-2. CNAMEレコード作成

image.png
image.png
image.png
image.png

  • Route53でレコードを作成ボタンからCNAMEレコードが作成されてから、約30分でステータス発行済みに変化

1-3. DNS検証

  • 検証保留中からステータスがすぐに変化しなかったため、下記記事を参照にNSレコードの順番変更(※不要だったかもしれません)

ec2-user
$ dig grfl.work +trace

image.png
image.png

2. ELB

  • ターゲットグループ/セキュリティグループ/サブネット/ルートテーブルはELB(ALB)作成中に画面遷移できますが、行ったり来たりが面倒なので先に作成しておきます。

2-1. ターゲットグループ

image.png
image.png
image.png

2-2. セキュリティグループ

image.png
image.png

2-3. サブネット

  • ※CloudFormationにて作成済みのため不要(パブリックサブネットが一つしかない場合は作成)
    image.png
    image.png

2-4. ルートテーブル

image.png
image.png

2-5. ロードバランサー

image.png
image.png
image.png

2-6. リスナーの追加と編集

  • HTTPS化とHTTPでアクセスした際もHTTPSにリダイレクトするように設定

2-6-1. リスナーの追加

image.png
image.png

2-6-2. リスナーの編集

image.png
image.png
image.png

2-7. ヘルスチェック

image.png

3. Route53

  • Aレコードエイリアス作成
    image.png
    image.png
    image.png

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.

image.png

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化

  1. 開発環境で下記編集
  2. リモートにpush
  3. 本番環境で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. 動作確認

image.png

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】お役立ちリンク集【随時更新】

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1