📝

【総まとめ】LaravelをAWSへ本番デプロイする全工程|VPC・EC2からS3・RDS連携まで

に公開

はじめに

AWSを触り始め、書籍や参考記事を見ながら進めても、なかなかうまく設定できない——。
そこで「まずはアーキテクチャや細かい構成はいったん置いておいて、最小限の構成で一からデプロイしてみたい💡」
そんな思いから、AWSの全体像を掴むために、自分の思考整理も兼ねてこの記事を残すことにしました。

概要

本記事では、Laravelアプリ(Todo機能付き)をAWS上のEC2にデプロイすることをゴールとし、デプロイに必要な設定を最小限に絞って、VPC構成から構築していきます。

※この記事は、重要なセクションごとに分けて記載しているので、必要な部分だけ読んでいただいても問題ありません。

✅ 実施内容(概要)
1.IAMユーザー作成
👇️
2.VPC、インターネットゲートウェイ、パブリックサブネット、セキュリティーグループ、ルートテーブルの構築
👇️
3.EC2(Amazon Linux 2023)に Nginx・PHP-FPM・PHP・Laravel を構成
👇️
4.DB ※データベースについては、別記事で以下の2パターンを扱います:
① EC2内にMySQLを構築するパターン
② RDSと連携するパターン

構成

使用技術

  • AWS サービス
    • IAM(ユーザー・権限管理)
    • VPC(仮想ネットワーク)
    • Internet Gateway(インターネット接続用)
    • EC2(仮想サーバー)
      • Amazon Linux 2023 AMI を使用
  • EC2内で構築する環境(Web/APサーバー)
    • Nginx 1.26.3(Webサーバー)
    • PHP 8.2(実行環境)
    • Laravel 12.0(Todo機能のCRUDを実装したアプリ)
  • その他
    • Git・Github
    • Linux
  • 環境
    • OS:macOS Sequoia 15.4.1

リージョン

1.IAMの作成

ここでは、AWS操作の入り口となるIAMユーザーを作成します。
ルートユーザーでログイン後、、、

■ダッシュボード「IAM」→「ユーザー」→「ユーザー作成」

  • ユーザー名:aws-user

ユーザーの詳細を指定後「グループを作成」で、ユーザーグループも作成しておきます。
権限は「PowerUserAccess」「IAMFullAccess」の2つの権限を設定。

  • PowerUserAccess・・・AWS内リソースへの全アクセス許可
  • IAMFullAccess・・・IAM関連の全アクセス許可

ルートユーザーを一度サインアウトし、以後作成したIAMユーザーで進めます。

2.VPC

インフラの大枠となるネットワーク環境を作成し、EC2などのサーバーを設置していきます。

■「VPC」→「お使いのVPC」→「VPCを作成」

  • 名前タグ:aws-vpc
  • IPv4 CIDR:10.0.0.0/16

2−1.サブネット

VPCの中にサブネットを作成。
サブネットとは、VPC内のIPアドレスを分割して使うための小さなネットワークです。
この中に後ほどのEC2などのリソースを配置します。

「VPC」「サブネット」「サブネットを作成」へ

  • VPC:「aws-vpc」を選択 ※先ほど作成したVPC
  • サブネット名:aws-subnet-public01
  • アベイラビリティーゾーン:ap-northeast-1a
  • IPv4 VPC CIDR ブロック:10.0.0.0/16
  • IPv4 サブネット CIDR ブロック:10.0.0.0/20

2-2.インターネットゲートウェイ

インターネットゲートウェイを作成します。
インターネットゲートウェイは、外部のアクセスとVPC内のネットワークの通信を連携するものです。

■「VPC」→「インターネットゲートウェイ」→「インターネットゲートウェイを作成」

  • 名前:aws-igw

    作成後「aws-igw」の詳細画面へアクセスし、右上のアクションボタンから「VPCにアタッチ」を選択し、作成したVPCをアタッチします
    これで、インターネットゲートウェイとVPCが紐付きました。

2−3.ルートテーブル

ルートテーブル作成

先ほどインターネットゲートウェイで、外部とVPCとのネットワークの通信の連携ができるようになりました。しかし、VPC内のサブネット同士のやり取りや、サブネットからのインターネットゲートウェイのやり取りが出来ていません。これを可能にするため「ルートテーブル」を作成して、VPCの外と通信できるように設定する
■「VPC」→「ルートテーブル」→「ルートテーブルを作成」

  • 名前:aws-rt
  • VPC:aws-vpcを選択

ルートテーブルとインターネットゲートウェイの連携

作成したルートテーブルに、どこへアクセス出来るか設定します。
デフォルトでは「local(10.0.0.0/16)」のルートが設定されているため、外部のインターネットとやり取りを出来るように、インターネットゲートウェイを追加。
ルートテーブルから、作成したルートテーブルの詳細画面へ移り、ルートタブから「ルートを編集」をクリック。
ルートを追加ボタンで、先程作成したインターネットゲートウェイを選択し追加します。

  • 送信先:0.0.0.0/0
  • ターゲット:インターネットゲートウェイ(aws-igw)

ルートテーブルとサブネットの連携

次に作成したルートテーブルに、どのサブネットが使うか設定します。
ルートテーブル画面から、作成したルートテーブルを選択し、「サブネットの関連付け」タブから「サブネットの関連付けを編集」より「aws-subnet-public01」を関連付けます

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

EC2用のセキュリティグループを設定します。
セキュリティグループを適用することで、EC2へのアクセスを、特定のポート番号やIPアドレスのみに制限できます。
設定前の状況はすべてのアクセスが許可されているため、必要最小限に制御します。
※今回はあくまで練習環境のため簡易的な設定としていますが、本番環境では、より厳格で適切なセキュリティ設定を行ってください。

■「VPC」→「セキュリティグループ」→「セキュリティグループを作成」

セキュリティグループの設定内容

  • セキュリティグループ名:aws-sg-public
  • 説明:任意の説明
  • VPC:aws-vpc
  • インバウンドルール
タイプ ポート ソース
HTTP 80 0.0.0.0/0
HTTPS 443 0.0.0.0/0
SSH 22 📌自身のグローバルIP/32

📌 自分のグローバルIPは以下のサイトなどで確認ください
https://www.cman.jp/network/support/go_access.cgi

3.EC2

3−1.キーペア作成

EC2へSSH接続するために必要なキーペア(鍵)を作成

■「EC2」「ネットワーク&セキュリティ(キーペア)」「キーペアを作成」

  • 名前:aws-user-key
  • キーペアのタイプ:RSA
  • プライベートキーファイル形式:.pem
    キーペア作成後「名前.pem」という秘密鍵のファイルがダウンロードされる。

3−2.EC2インスタンス作成

EC2を作成

■「EC2」→「インスタンス」→「インスタンスを起動」

EC2の設定内容は以下

  • 名前:aws-ec2-public
  • OS:Amazon Linux
  • Amazon マシンイメージ:Amazon Linux 2023 AMI
  • アーキテクチャ:64ビット(x86)
  • インスタンスタイプ:t2.micro
  • キーペア:aws-user-key(キーペアで作成したものを選択)
  • ネットワークの設定(編集ボタンから設定)
    • VPC:aws-vpc
    • サブネット:aws-subnet-public01
    • パブリックIPの自動割り当て:有効
    • セキュリティグループ:「default」「aws-sg-public」
  • ストレージ:初期値のまま

インスタンスを起動すると、EC2インスタンスが起動

3-3.EC2へSSH接続

EC2へSSH接続します。
SSH接続するには、キーペアで作成した秘密鍵ファイルを「~/.ssh/」へ配置し接続します
※公開鍵は、上記のEC2の設定で自動的に配置されているため設定は不要です
詳細は以下の記事を参考ください
https://zenn.dev/morikuma/articles/304db0b0cb8501

3-4.Laravel

EC2にLaravelを構築します
詳細は以下の記事を参考ください
https://zenn.dev/morikuma/articles/bb4f6201d83d67

4.DB(MySQL)

DBの設定を行います
DB構成ついては以下のいずれかを参考ください

■EC2にDB(MySQL)を構築する方法
https://zenn.dev/morikuma/articles/83f988a663f597

■RDBを使って構築する方法
https://zenn.dev/morikuma/articles/2e40770b0e73a0

DB設定後は、.envにDB情報を記入ください

vim .env

#DB_CONNECTION=
#DB_HOST=
#DB_PORT=
#DB_DATABASE=
#DB_USERNAME=
#DB_PASSWORD=
php artisan migrate

最後にLogが作成されていかもしれないので、削除してリセットしておきましょう

# storage/logs フォルダを空にする(Log初期化)
rm -f /var/www/プロジェクト名/storage/logs/*.log

アクセス

DB設定が完了したら「http://IPアドレス」へアクセスします👇️
問題なく処理も行われているので正常に機能してますね!
【一覧表示】

【投稿処理】

まとめ

以上となります
初めてのAWSデプロイは長い道のりでした
何度かチャレンジしては挫折することもありましたが、それでも少しずつ知識を深めながら、こうして形にできたことが嬉しいです
この記事が、同じように学んでいる方の参考になれば幸いです

🔗 その他

■SSH化の設定
https://zenn.dev/morikuma/articles/6652e925d5ad5a

■S3へ画像をアップロードする方法
https://zenn.dev/morikuma/articles/ef4f060d6f4ed4

■リソースの削除
デプロイが完了した後は、使い終わったリソースを整理しておくことも大切です。
課金を防ぐための削除手順については、こちらの記事にまとめています👇
https://zenn.dev/morikuma/articles/f1a95074bfe1f5

Discussion