🦓

[Laravel]AWS Beanstalkへデプロイする

2023/10/20に公開

はじめに

Laravelで作成したアプリをAWS Beanstalkへデプロイしていきます。
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/Welcome.html

環境

PHP 8.x
Laravel 10.x
MySQL 8.x
Nginx

tl;dr

AWSルートアカウントを作成した上で進めていきます。

  1. アプリ用IAMユーザーを作成する
  2. SSHキーを作成する
  3. CodeCommit上にリポジトリを作成する
  4. Beanstalkアプリケーションを作成する
  5. Beanstalk用IAMロールを作成する
  6. Beanstalkアプリケーションの環境を設定する
  7. Codepipelineを使ってCodeCommitとBeanstalkを連結させる
  8. Nginxサーバーを設定する
  9. DBを作成する

アプリ用IAMユーザーを作成する

検索フォームからIAMを検索し、IAMのダッシュボードに入ります。
「ユーザーの作成」をクリックします。

ユーザー名を入力し、コンソールへのアクセスを許可します。

パスワードを入力し、「次へ」をクリックします。
許可を設定の「ポリシーを直接アタッチする」を選択します。

許可ポリシーの検索フォームにawscodecommitを入力し、「AWSCodeCommitPowerUser」を選択します。

次の確認画面でユーザーの情報を確認し、「ユーザーの作成」をクリックします。
作成したIAMユーザーのログイン情報が出てきたらOKです。

SSHキーを作成する

PCのコマンドに移動して操作します。

➜  ~ cd ~/.ssh
➜  .ssh ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/***/.ssh/id_rsa): // キーを識別する用名前を入れる
Enter passphrase (empty for no passphrase): // パスワード
Enter same passphrase again: // パスワード確認
Your identification has been saved in larave-job
Your public key has been saved in larave-job.pub
The key fingerprint is:
*******
The key's randomart image is:
*******

lsで先に入力した名前のファイルを名前.pubの二つのファイルを追加されたことを確認します。

➜  .ssh cat ~/.ssh/***.pub 
// ssh-rsaから始まった生成されたキーを表示されます

キーをコピーしてAWS IAMユーザーへ移動します。
作成したユーザーのページに入って、「セキュリティ認証情報」をクリックします。

「AWS CodeCommit の SSH 公開キーへスクロールし、「SSH 公開キーのアップロード」をクリックします。コピーしたキーをペストします。

「SSHキーID」を作成されました。

「SSHキーID」コピーし、PC環境へ戻します。
sshに作成したキーIDを追加します。

➜  .ssh vi config
// 追加する
Host git-codecommit.*.amazonaws.com
  User // SSHキーIDペスト
  IdentityFile ~/.ssh/キーの名前
  
// read&write権限をユーザーに与える
➜  .ssh chmod 600 config

:wqで保存します。

ルートユーザーをログアウトし、作成したIAMユーザーでログインします。

CodeCommit上にリポジトリを作成する

検索フォームからCode Commitを検索し、Code Commitのダッシュボードに入ります。
「リポジトリを作成」をクリックします。

リポジトリ名を入力し、「作成」をクリックします。

接続のステップが表示されます。
「SSH」をクリックします。
ステップ1~3が完了したのでステップ4に移します。

リモートリポジトリをコピーし、PCに移動します。
laravelアプリのルートディレクトリに移動し、リモートリポジトリを追加し、コードをプッシュします。

➜  laravel git:(main)git remote add origin ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/*******
➜  laravel git:(main)git add .
➜  laravel git:(main)git commit -m "laravelアプリを初期化する"
[main 72f40de] laravelアプリを初期化する
 1 file changed, 870 insertions(+)
 create mode 100644 yarn.lock
➜  laravel git:(main) git push --set-upstream origin main
Enumerating objects: 449, done.
Counting objects: 100% (449/449), done.
Delta compression using up to 16 threads
Compressing objects: 100% (424/424), done.
Writing objects: 100% (449/449), 228.79 KiB | 7.15 MiB/s, done.
Total 449 (delta 198), reused 0 (delta 0), pack-reused 0
remote: Validating objects: 100%
...

Code Commitコンソールへ移動し、ページをリロードします。
プッシュしたコードを表示されたらOKです。

Beanstalkアプリケーションを作成する

AWSコンソールに入って、右上のリージョンを「東京」に設定します。
検索フォームからElastics Beanstalkを検索し、Beanstalkのダッシュボードに入ります。「アプリケーションを作成する」をクリックします。

「アプリ名」を入力し、「作成」をクリックします。

Beanstalk用IAMロールを作成する

IAMコンソールのナビゲーションから、「(ロール)」 を選択します。
「ロールの作成」を選択します。
「信頼されたエンティティタイプ」 から、「AWS サービス」 を選択します。
「ユースケース」で、「EC2」を選択します。
「次へ」をクリックします。

適切な管理ポリシーをアタッチします:

  • AWSElasticBeanstalkWebTier
  • AWSElasticBeanstalkWorkerTier
  • AWSElasticBeanstalkMulticontainerDocker

「次へ」をクリックします。
ロールの名前を入力します。
「ロールの作成」を選択します。

Beanstalkアプリケーションの環境を設定する

「環境を作成」をクリックします。

環境を設定

以下の設定で作成します:

  • 環境枠:ウェブサーバー環境
  • アプリケーション情報:自分のアプリの情報
  • 環境情報
    • 環境名、ドメイン、環境の説明:自分のアプリに合わせて入力する
  • プラットフォーム
  • アプリケーションコード:サンプルアプリケーション
  • プリセット:単一インスタンス (無料利用枠の対象)

設定が完了したら「次へ」をクリックします。

サービスアクセスの設定ページが表示されます。

「サービスロール」 に 「既存のサービスロールを使用」 を選択します。
「EC2 インスタンスプロファイル」を先に作成したIAMロールを選択します。
「レビュまでスキップ」をクリックし、環境を作成します。

環境の設定を編集することができるので一旦スキップしても大丈夫です。

Codepipelineを使ってCodeCommitとBeanstalkを連結させる

Code Commitダッシュボードに移動し、左のメニューから「パイプライン・CodePipeline」をクリックし、「パイプラインの作成」をクリックします。

左にステップが表示されています。ステップ通りに進めていきます。

「パイプライン名」を入力し、「次に」クリックします。

ソースステージを追加する

プールダウンメニューからCode Commitを選択し、リポジトリとブランチを選択し、「次に」をクリックします。

「ビルドステージをスキップ」をクリックします。

デプロイステージを追加する

プールダウンメニューからElastic Beanstalkを選択し、リージョンを「東京」に設定し、作成したBeanstalkアプリケーションと環境を追加します。
リポジトリとブランチを選択し、「次に」をクリックします。
「パイプラインを作成する」をクリックします。

Nginxサーバーを設定する

Beanstalk環境へ移動し、「設定」を選択します。
「更新、モニタリング、ログ」の設定カテゴリで、「編集」を選択します。
「ドキュメントのルート」に「/public」と入力します。
ページの最下部で 「適用」 を選択し変更を保存します。

環境の更新が完了したら一度サイトへアクセスし、500エラーが表示されます。
アプリの環境変数がないためです。

「設定」の「更新、モニタリング、ログ」の一番下に、.env内の環境変数を追加していきます。

アプリに環境変数の設定を編集します。

config/app.php
- 'key' => env('APP_KEY'),
+ 'key' => array_key_exists('APP_KEY', $_SERVER) ? $_SERVER['APP_KEY'] : env('APP_KEY'),

編集をコミットし、リモートレポジトリにプッシュします。

他の設定に関して公式ドキュメントを参考しました。
https://laravel.com/docs/10.x/deployment

DBを設定する

「設定」の「ネットワーキング、データベース、タグを設定」を編集します。
「データベース」を有効します。
「ユーザー名」と「パスワード」を入力し、「適用」をクリックします。

検索フォームからRDSを検索し、RDSのダッシュボードに入ります。
「データベース」をクリックし、DBを作成されたことを確認します。
DBの情報を.envとBeanstalk環境の環境変数に入れます。

DB_HOST:「エンドポイント」にあるアドレス
DB_PORT:3306
DB_NAMEebdb(設定から確認できます。)
DB_USERNAMEDB_PASSWORDはDBを作成する時に設定したものです。

アプリのDB情報も修正し、リモートリポジトリにプッシュします。

config/dabase.php
'mysql' => [
        'driver' => 'mysql',
        'url' => array_key_exists('DATABASE_URL', $_SERVER) ? $_SERVER['DATABASE_URL'] : env('DATABASE_URL'),
        'host' => array_key_exists('DB_HOST', $_SERVER) ? $_SERVER['DB_HOST'] : env('DB_HOST'),
        'port' => array_key_exists('DB_PORT', $_SERVER) ? $_SERVER['DB_PORT'] : env('DB_PORT'),
        'database' => array_key_exists('DB_DATABASE', $_SERVER) ? $_SERVER['DB_DATABASE'] : env('DB_DATABASE'),
        'username' => array_key_exists('DB_USERNASME', $_SERVER) ? $_SERVER['DB_USERNASME'] : env('DB_USERNASME'),
        'password' => array_key_exists('DB_PASSWORD', $_SERVER) ? $_SERVER['DB_PASSWORD'] : env('DB_PASSWORD'),
...
        ]) : [],
],

終わりに

ディプロイができ他ので作成したリソースを削除していきます。
AWS Beanstalk公式にデプロイのチュートリアルがあるのでそちらもチェックしてみてくださいー
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/php-laravel-tutorial.html

Discussion