🦎

LaravelをコマンドのみでFargateにデプロイする

2023/11/27に公開

はじめに

この記事では、コマンドのみでLaravelをAWSのFargateにデプロイする方法について解説しています。

これまで、AWSのリソースをコンソール画面で操作してデプロイしていましたが、画面が頻繁に変更されるため、毎回手動での操作が煩わしく感じられました。
そこで、CloudFormationというサービスを利用し、インフラをコードで管理することにしました。
これにより、インフラの構築をコマンドだけで実行できるようになりました。
この記事が、Laravelを手軽にデプロイしたい方々の役立てば幸いです。

サンプルリポジトリ
https://github.com/yoppyDev/laravel-fargate-cloudformation

完成構築図

事前準備

以下が事前に済んでいることが必要です。

  • AWSCLI のインストールと設定
  • docker のインストール
  • rainのインストール

ディレクトリ構造

プロジェクトルート
├── cloudformation-v2 - AWS CloudFormation設定とスタック
│   ├── output        - CloudFormationの出力
│   ├── stacks        - スタック定義
│   └── main.yml      - メイン設定ファイル
├── src               - ソースコード
├── storage           - コンテナ内のデータ保存場所
├── tools             - プロジェクトツールとスクリプト
│   ├── aws-ecr-login.sh - ECRログインスクリプト
│   └── util.sh       - ユーティリティスクリプト
├── .env.example      - 環境変数のサンプル
├── .gitignore        - Git除外設定
├── README.md         - プロジェクト説明
└── docker-compose.yml - Dockerコンテナ設定

取り敢えずデプロイしてみる

1. リポジトリをクローン

cd <プロジェクトを配置するお好みの場所>

git clone git@github.com:yoppyDev/laravel-fargate-cloudformation.git

2. .envファイルを作成 & 編集

cp .env.example .env

cp src/.env.example src/.env

基本的にAWS_ACCOUNT_IDを設定するだけで動きます。
(好みで他の設定も変更してください。)

.env
PJPrefix=laravel-template  # プロジェクト名
REGIN=ap-northeast-1       # AWSのリージョン設定
AWS_ACCOUNT_ID=            # AWSのアカウントID
REGISTRY_URL=${AWS_ACCOUNT_ID}.dkr.ecr.${REGIN}.amazonaws.com  # ECRのレジストリURL
AWS_PROFILE=default        # 使用するAWSのプロファイル
APP_KEY=base64:3OwLTx5+HLa8OaNVl3rhayWkV4punTPx0WRGXWSAkJo=  # Laravelアプリのキー
DATABASE=laravel           # 使用するデータベース名
DB_USERNAME=master         # データベースのユーザー名
DB_PASSWORD=password       # データベースのパスワード

3. ParameterStore作成

sh tools/util.sh createSystemParameter

4. ECR作成

sh tools/util.sh createEcr

5. buildしてpush

sh tools/aws-ecr-login.sh
sh tools/util.sh baseBuild
sh tools/util.sh basePush
sh tools/util.sh build
sh tools/util.sh push

6. S3バケット作成

sh tools/util.sh createBucket

7. デプロイ

sh tools/util.sh subDeploy -y

デプロイ確認
以下からタスクに移動して、Public IPにアクセスしてみてください
https://ap-northeast-1.console.aws.amazon.com/ecs/v2/clusters

このように表示されれば成功です。

8. migrate

--taskにECSのタスクのARNを指定して以下のコマンドを実行してください。

aws ecs execute-command \
    --cluster laravel-template-cluster \
    --task <ECSタスクのARNを指定する> \
    --container nginx \
    --interactive \
    --command 'php artisan migrate --force'

このようにmigrateのログが表示されれば成功です🎉

環境削除

# スタックを確認
aws cloudformation list-stacks
# スタックを削除
aws cloudformation delete-stack --stack-name <stack名>

ローカルで動作確認

# コンテナ立ち上げ
docker-compose up -d

# コンテナに入る
docker-compose exec nginx bash

---以下コンテナ内で実行---

# composer install
composer install

# npm install & build
npm install
npm run build

# migrate
php artisan migrate

このように表示されれば成功🎉
http://localhost:8080

まとめ

Cloud Formation を使って AWS 上に Laravel の環境を構築する手順でした。
個人で運用するにはAWSは高いですね。。。😇
RDSをPlanetScaleとかに変えたり対策は必要そうです。
また、ECSをPublicサブネットに配置しているのもPrivateサブネットに配置した場合、Nat Gatewayが必要です。
しかし、これを個人で運用する場合かなり高いのでPublicサブネットに配置しています。

次回は設定した内容の解説した記事を書こうと思います。
もし興味があれば閲覧して頂ければ思います。

Discussion