Terraformを使用してECS環境構築し、Laravelサイトを立ち上げてみた。

# はじめに

naritomoと申します。

最近Terraformによるコードでのインフラ作成にハマっていて、
色んなところで使用されているGitHubActionsによるCI/CDにも気になっていたため、
とりあえず一通りの構築ができるTerraform/Laravelソースを公開してみました。

いろいろアドバイスいただけると嬉しいです。

## 立ち上げ概要

以下のことを実施しています。

* TerraformによるECSインフラ環境構築

* Laravelサイトのローカル環境構築/ブランチ更新によるGitHubActionを使用したECS環境への自動デプロイ実施

必要なソースは以下にまとめてあります。

https://github.com/naritomo08/laravel-fargate-infra-public

https://github.com/naritomo08/laravel-fargate-app-public

## 構成図

構築される構成は以下になります。

Terraform(IaC)にてAWS内に構成図のインフラを構築し、
GitHubActionを使用してECS Fargateへlaravelサイトをデプロイします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/4a428fdc-e229-6c28-3878-4118c7b4ad54.png)

## 動作確認済みのOS

* Windows11(wsl2上のUbuntuから稼働)

## 参考書籍

[TerraformでFargateを構築してGitHub Actionsでデプロイ！Laravel編](https://www.amazon.co.jp/gp/product/B09GFB67X1/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)

[TerraformでFargateを構築してGitHub Actionsでデプロイ！Laravel編 同人版](https://booth.pm/ja/items/3096761)

本書籍により、かなり理解が進みました。
ありがとうございます。

## 参考サイト

[UbuntuでAWS CLIを使えるようにする](https://qiita.com/SSMU3/items/ce6e291a653f76ddcf79)

[ubuntuにHomebrewをインストール](https://zenn.dev/akgcog/articles/2e63b33ee3001a)

[【初心者向け】MacにTerraform環境を導入してみた](https://dev.classmethod.jp/articles/beginner-terraform-install-mac/)

[【Route53】AWS上で独自ドメインを取得する方法について解説](https://engineer-life.dev/aws-route53-domain/)

[Docker Desktop インストール手順](https://qiita.com/R_R/items/a09fab09ce9fa9e905c5)

[nodejs、npm の最新版をインストールする（Ubuntu）](https://www.softel.co.jp/blogs/tech/archives/6487)

## 参考動画

本サイトを構築した後、本動画を見るとよりコンテナサービスについてイメージが
つくかと思います。

https://youtu.be/L4bLDNRSYC8

## 事前作業

以下のコマンドを利用できている状態になっていること。(参考サイト参照)

```bash
git
→githubアカウント準備までできてること。
docker-compose
aws
→awsアカウント設定まで実施していること。
npm
brew
tfenv
```

AWSアカウント作成後、Route53にてドメイン取得すること。

またはお名前ドットコム(又は外部サービス)でドメイン取得し、
Route53に結び付けることもできます。

https://engineer-life.dev/aws-route53-domain/

https://tech.hippo-lab.com/post-17700/

## 構築方法(インフラ)

### ソースを入手する。

以下のgitコマンドで入手する。

```bash
git clone https://github.com/naritomo08/laravel-fargate-infra-public.git laravel-fargate-infra
cd laravel-fargate-infra
rm -rf .git
```

### 指定バージョン(1.1.3)のterraformを導入する。

```bash
tfenv install
```

### ドメイン名設定

Rout53にて外向けドメインを入手し、
以下のファイル内のドメイン名設定を実施する。

```bash
vi envs/prod/routing/appfoobar_link/route53.tf
name = "<外向けドメイン名>"を書き換える。
```

#### サブドメインを使用したい場合

xxx.<外向けドメイン名>のように使用したい場合、
以下の設定も行うこと。

今後の設定では、xxx.<外向けドメイン名>でドメイン名設定を
実施すること。

```bash
envs/prod/network/routing/appfoobar_link/route53.tf

以下の部分を"xxx.<ドメイン名>"に変更する。

name    = data.aws_route53_zone.this.name

envs/prod/network/routing/appfoobar_link/acm.tf

以下の部分を"xxx.<ドメイン名>"に変更する。

domain_name = data.aws_route53_zone.this.name
```

### s3バケット名、dynamodb名変更

全てのソースから以下の名前になっているS3バケット名/dynamodb名を置換する。
特にs3については他の方が使用していない名前にする必要がある。

```bash
S3:
terraform-state

dynamodb:
terraform_state_lock
```

### インフラモジュール構築

以下の順番で構築すること。

```bash
tfstate用S3
cd tfstate
terraform init
terraform plan
terraform apply

ネットワーク周り
cd ../envs/prod/network/main
terraform init
terraform plan
terraform apply

ALB用ログ取得S3作成
cd ../../log/alb
terraform init
terraform plan
terraform apply

DBロググループ
cd ../../log/db_foobar
terraform init
terraform plan
terraform apply

Laravelロググループ
cd ../../log/app_foobar
terraform init
terraform plan
terraform apply

SSL証明書/DNSCNAME/ALB作成
cd ../../routing/appfoobar_link
terraform init
terraform plan
terraform apply
*6分かかる

ECR/ECS/.env用S3作成
*ECSキャパシティープランナーのエラーが出ても、もう一回行う。
cd ../../app/foobar
terraform init
terraform plan
terraform apply

AIMユーザ/ポリシー/ecspresso設定作成
cd ../../cicd/app_foobar
terraform init
terraform plan
terraform apply
```

作成コマンド解説:
```bash
terraform init
*初回構築実行のみ

terraforn plan
*作成前の確認コマンド
*確認失敗が出た場合適宜対応すること。

terraform apply
terraform apply -target <モジュール名>
*作成失敗が出た場合適宜対応すること。
```

### RDSを作成する

```bash
cd ../../db/foobar
terraform init
terraform plan
terraform apply
*12分近くかかる。
```

### RDS/SystemsManagerへのDBパスワード登録

```bash
＊DB起動時に実施すること。
aws rds modify-db-instance \
--db-instance-identifier "example-prod-foobar" \
--master-user-password "Passw0rd"

＊以下のコマンドは初期構築のみでよい。
aws ssm put-parameter \
--name "/example/prod/foobar/DB_PASSWORD" \
--type "SecureString" \
--value "Passw0rd"
```

### Redisを作成する

```bash
cd ../../cache/foobar
terraform init
terraform plan
terraform apply
*14分近くかかる。
```

### Redis/RDS CNAMEレコードを作成する
```bash
cd ../../routing/foobar_internal
terraform init
terraform plan
terraform apply
```

### EFSを作成する。
```bash
EFS作成
cd ../../efs/foobar
terraform init
terraform plan
terraform apply

作成結果から以下の値を控える。
efs_id
efs_point_id
```

### アプリ側の構築実施

続けてアプリ側の構築を実施する。

## 構築方法(アプリ)

### ソースを入手する。

ホームディレクトリにて、
以下のgitコマンドで入手する。

```bash
cd
git clone https://github.com/naritomo08/laravel-fargate-app-public.git laravel-fargate-app
cd laravel-fargate-app
rm -rf .git
```

### ローカルdocker立ち上げ

```bash
docker-compose build --no-cache --force-rm
docker-compose up -d
```

### .envファイルコピー

```bash
cd backend
cp .env.example .env
```

### Laravelコマンド実施

```bash
docker-compose exec app composer install -n --prefer-dist --no-dev
docker-compose exec app php artisan key:generate
docker-compose exec app php artisan storage:link
docker-compose exec app chmod -R 777 storage bootstrap/cache
```

### 権限設定(macでは不要)

```bash
cd ..
sudo chown -R $USER:$USER backend
sudo chgrp -R www-data backend/storage backend/bootstrap/cache
sudo chmod -R ug+rwx backend/storage backend/bootstrap/cache
```

### npmコマンド実施

```bash
cd backend
npm ci
npm run prod
```

### DBマイグレート実施

```bash
docker-compose exec app php artisan migrate --force
```

### ローカルでのサイト確認

http://localhost

### ソースのGit登録

githubでの新規リポジトリを作成していること。

以下のコマンドを入力してソースをgithubに登録する。

[name]は自身のユーザ名,[email]は自身のメールアドレスを入れる。

```bash
cd ..
git init
git config --local user.name [name]
git config --local user.email [email]
git add .
git commit -m "first commit"
git branch -M main
git remote add origin <作成したリポジトリパス>
git push -u origin main
```

### .env.prodファイルを更新する。

```bash
vi backend/.env.prod

ファイル内容
---------------------

APP_URL=https://<外向けドメイン名>

外向けドメイン名を編集すること。
---------------------
```

### デプロイ設定実施

デプロイ実施ファイルを編集する。

```bash
cd .github/workflows
mv deploy.yml.org deploy.yml
vi deploy.yml
```

修正箇所
```bash
run: aws s3 cp .env.$ENV_NAME s3://terraform-state-$SYSTEM_NAME-$ENV_NAME-$SERVICE_NAME-env-file/$IMAGE_TAG/.env
→"terraform-state"のS3バケット名を編集する。
```

デプロイ設定ファイルも更新する。

```bash
cd ../../ecspresso
vi config_prod.yml
```

修正箇所
```bash
url: s3://terraform-state/example/prod/cicd/app_foobar_v1.0.0.tfstate
→"terraform-state"のS3バケット名を編集する。
```

### GitHubへのAWS ID登録

作業実施する前に以下の値を控える。

AWS IAMユーザ一覧から、example-prod-foobar-githubユーザの
アクセスキーを新規作成し、
アクセスキー/シークレットアクセスキーを控える。

GitHubリポジトリページに入り、Settings→secrets→Actionより、
以下の値を追加する。

```bash
名前:
PROD_AWS_ACCESS_KEY_ID
→控えたアクセスキーを入れる。
PROD_AWS_SECRET_ACCESS_KEY
→控えたシークレットアクセスキーを入れる。
PROD_AWS_ASSUME_ROLE_ARN
→arn:aws:iam::[AWSアカウントID]:role/example-prod-foobar-deployer
```
### SystemsManagerでのLaravel APP_KEY登録

laravel-fargate-appフォルダで以下のコマンドで入力して出力結果を控える。

```bash
docker-compose up -d
docker-compose exec app php artisan key:generate --show
→出てくるコマンド結果を全て控える(base64:も含む。)
```

AWS SystemsManagerに入り、パラメータストアにて
以下の値を登録する。

```bash
名前:
/example/prod/foobar/APP_KEY
値:
先程控えた出力結果。
```

利用枠は標準とする。
タイプは安全な文字列とする。
KMSキーソースは現在のアカウントとする。
KMSキーIDは「alias/aws/ssm」とする。

以下のコマンドでも登録が可能

```bash
aws ssm put-parameter \
--name "/example/prod/foobar/APP_KEY" \
--type "SecureString" \
--value "<前の手順で控えた結果>"
```

### EFS情報登録

以下のコマンドを実施し、EFS情報の登録を実施する。

本ファイルの上の方にそれぞれのコンテナのマウント先を指定しているが、必要に応じ変更すること。

```bash
vi ecspresso/ecs-task-def.json

以下の部分について、EFSのパラメータに書き換える。(ファイル最後の部分)
"fileSystemId": "<efs_idの値>",
"accessPointId": "<efs_point_idの値>",
```

### GitHubAction実施

mainブランチへのコミット/プッシュを実施して、
正常にGitHubActionが稼働することを確認する。

稼働状況はgithubの対象リポジトリのActionタブから確認できる。

コミットするものがない場合、以下のコマンドで実施が可能。

```bash
git commit --allow-empty -m "empty commit"
git push
```

失敗した場合は、何回かジョブ再実施してみて、同じところで失敗する場合、
構築している手順に漏れが無いか確認すること。

以降はmainブランチ更新で自動的にデプロイされる。

### ECSサイト確認

以下のURLサイトを参照する。

https://<外向けドメイン名>

## サービス一時削除/起動方法(インフラソースで実施)

一時削除の際は次の項目から実施し、起動の際は反対から行う。

余計な課金を防ぐため、なるべく環境を使用しない際は本作業で削除しておくとよい。

状況によってはRDS/Redis/CNAMEレコードを残してもよい。

### ECSサービス削除/起動

サービス起動後、タスクが自動的に起動しないため、
アプリブランチでのmainブランチコミット/プッシュ
でタスクを立ち上げること。

またはgithubのActionページから最近実行したActionを動かすこと。

```bash
cd laravel-fargate-infra/envs/prod/app/foobar
terraform destroy -target aws_ecs_service.this
terraform apply
```

### Redis/RDS CNAMEレコード削除/起動
```bash
cd laravel-fargate-infra/envs/prod/routing/foobar_internal
terraform destroy
terraform apply
```

### Redis削除/起動

```bash
cd laravel-fargate-infra/envs/prod/cache/foobar
terraform destroy
terraform apply
*14分近くかかる。
```

### RDS削除/起動

```bash
cd laravel-fargate-infra/envs/prod/db/foobar
terraform destroy
terraform apply
*12分近くかかる。
```

### RDS/SystemsManagerへのDBパスワード登録

```bash
＊RDS起動時に実施すること。
aws rds modify-db-instance \
--db-instance-identifier "example-prod-foobar" \
--master-user-password "Passw0rd"

＊以下のコマンドは初期構築のみでよい。
aws ssm put-parameter \
--name "/example/prod/foobar/DB_PASSWORD" \
--type "SecureString" \
--value "Passw0rd"
```

### ALB削除/起動

```bash
cd laravel-fargate-infra/envs/prod/routing/appfoobar_link
terraform apply -var='enable_alb=false'
terraform apply
```

### NAT削除/起動

```bash
cd laravel-fargate-infra/envs/prod/network/main
terraform apply -var='enable_nat_gateway=false'
terraform apply
```

## 別ソースから本環境に入れてのECS立ち上げ(アプリソースで実施)

以下の手順で別途立ち上げているLaravelソースを立ち上げることができます。

新規作成の場合、予めインフラリソースを作成していること。

### アプリベースソース入れ直し（Laravel9/10の場合）

以下の操作でphp8.2版アプリベースソースを入手する。

```bash
cd
git clone -b main2 https://github.com/naritomo08/laravel-fargate-app-public.git laravel-fargate-app
cd laravel-fargate-app
rm -rf .git
```

上記作業実施後新たにリポジトリを作成しプッシュしておくこと。

```bash
git init
git config --local user.name [name]
git config --local user.email [email]
git add .
git commit -m "first commit"
git branch -M main
git remote add origin <作成したリポジトリパス>
git push -u origin main
```

### mainソースから別ブランチを作る。

ブランチ名はsitetestにしておく。

### backendフォルダを削除する。

```bash
sudo rm -rf backend
```

### backendフォルダでgit cloneを実施する。

```bash
git clone <gitソースURL> backend
cd backend
rm -rf .git
```

### .env.prodファイルを作成する。

```bash
vi backend/.env.prod

ファイル内容
下記以外必要なパラメータがあれば随時追記すること。
---------------------
APP_NAME=foobar
APP_ENV=production
# APP_KEY=parameter_store
APP_DEBUG=false
APP_URL=https://<外向けドメイン名>←編集すること。

LOG_CHANNEL=stderr
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=db.foobar.internal
DB_PORT=3306
DB_DATABASE=foobar
DB_USERNAME=foobar
# DB_PASSWORD=parameter_store

SESSION_DRIVER=redis
SESSION_LIFETIME=120

REDIS_HOST=cache.foobar.internal
REDIS_PASSWORD=null
REDIS_PORT=6379
---------------------
```

### deploy.shファイルを作成する。

```bash
cd backend
mkdir scripts
vi deploy.sh

ファイル内容
ECSコンテナ立ち上げるコマンドになるため、
他に必要なものがあれば追加すること。
---------------------
#!/bin/bash

set -eu

php artisan storage:link
php artisan config:cache

chown -R www-data:www-data /work/backend/storage

php-fpm
---------------------

chmod +x deploy.sh
```

### ローカル立ち上げ直し

```bash
docker-compose build --no-cache --force-rm
docker-compose up -d
```

### .envファイル作成

```bash
cd backend
cp ../.env.example .env

* cpコマンド前に編集が必要なところあれば編集すること。
```

### Laravelコマンド実施

```bash
docker-compose exec app composer install -n --prefer-dist --no-dev
docker-compose exec app php artisan key:generate
docker-compose exec app php artisan storage:link
docker-compose exec app chmod -R 777 storage bootstrap/cache
```

### 権限設定（macでは不要）

```bash
sudo chown -R $USER:$USER backend
sudo chgrp -R www-data backend/storage backend/bootstrap/cache
sudo chmod -R ug+rwx backend/storage backend/bootstrap/cache
```

### npmコマンド実施

```bash
cd backend
npm ci
npm run prod
```

合わせて、以下のフォルダについて"backend/.gitignore"でコメントアウトすること。
```bash
/public/css
/public/js
/public/mix-manifest.json
```

### httpsアクセス許可

```bash
cd backend/app/Http/Middleware
vi TrustProxies.php

protected $proxies;
protected $proxies = "*";
→上記を下記に修正する。
```

### DBマイグレート実施

```bash
docker-compose exec app php artisan migrate --force
```

### ローカルでのサイト確認

http://localhost

### デプロイ設定実施

デプロイ実施ファイルを編集する。

```bash
cd .github/workflows
mv deploy.yml.org deploy.yml
vi deploy.yml
```

修正箇所
```bash
on:
  push:
    branches:
      - main
      - sitetest ←追記する

  if: github.ref == 'refs/heads/main'
  if: github.ref == 'refs/heads/sitetest'
  →2箇所ある上記記載について、上から下に修正する。

run: aws s3 cp .env.$ENV_NAME s3://terraform-state-$SYSTEM_NAME-$ENV_NAME-$SERVICE_NAME-env-file/$IMAGE_TAG/.env
→"terraform-state"のS3バケット名を編集する。
```

デプロイ設定ファイルも更新する。

```bash
cd ../../ecspresso
vi config_prod.yml
```

修正箇所
```bash
url: s3://terraform-state/example/prod/cicd/app_foobar_v1.0.0.tfstate
→"terraform-state"のS3バケット名を編集する。
```

### GitHubへのAWS ID登録

作業実施する前に以下の値を控える。

AWS IAMユーザ一覧から、example-prod-foobar-githubユーザの
アクセスキーを新規作成し、
アクセスキー/シークレットアクセスキーを控える。

GitHubリポジトリページに入り、Settings→secrets→Actionより、
以下の値を追加する。

```bash
名前:
PROD_AWS_ACCESS_KEY_ID
→控えたアクセスキーを入れる。
PROD_AWS_SECRET_ACCESS_KEY
→控えたシークレットアクセスキーを入れる。
PROD_AWS_ASSUME_ROLE_ARN
→arn:aws:iam::[AWSアカウントID]:role/example-prod-foobar-deployer
```
### SystemsManagerでのLaravel APP_KEY登録

laravel-fargate-appフォルダで以下のコマンドで入力して出力結果を控える。

```bash
docker-compose up -d
docker-compose exec app php artisan key:generate --show
→出てくるコマンド結果を全て控える
```

AWS SystemsManagerに入り、パラメータストアにて
以下の値を登録する。

```bash
名前:
/example/prod/foobar/APP_KEY
値:
先程控えた出力結果。
```

利用枠は標準とする。
タイプは安全な文字列とする。
KMSキーソースは現在のアカウントとする。
KMSキーIDは「alias/aws/ssm」とする。

以下のコマンドでも登録が可能

```bash
aws ssm put-parameter \
--name "/example/prod/foobar/APP_KEY" \
--type "SecureString" \
--value "<前の手順で控えた結果>"
```

### EFS情報登録

以下のコマンドを実施し、EFS情報の登録を実施する。

本ファイルの上の方にそれぞれのコンテナのマウント先を指定しているが、必要に応じ変更すること。

```bash
vi ecspresso/ecs-task-def.json

以下の部分について、EFSのパラメータに書き換える。(ファイル最後の部分)
"fileSystemId": "<efs_idの値>",
"accessPointId": "<efs_point_idの値>",
```

### GitHubAction実施

mainブランチへのコミット/プッシュを実施して、
正常にGitHubActionが稼働することを確認する。

稼働状況はgithubの対象リポジトリのActionタブから確認できる。

コミットするものがない場合、以下のコマンドで実施が可能。

```bash
git commit --allow-empty -m "empty commit"
git push
```

失敗した場合は、何回かジョブ再実施してみて、同じところで失敗する場合、
構築している手順に漏れが無いか確認すること。


編集後”sitetest"へのコミット/プッシュを実施して、
正常にGitHubActionが稼働することを確認する。

### ECSサイト確認

以下のサイトを参照する。

https://<外向けドメイン名>

## ECSタスク数変更方法(アプリソースで実施)

標準ではタスク数が1つしか立ち上がらないが、
以下の方法で増やすことができる。

```bash
cd ecspresso
vi ecs-service-def.json

変更箇所:

"desiredCount": 2,

→"desiredCount"の数字を変更する。
```

mainブランチにコミットしてタスクを更新後、
ECSのタスク数が変更されることを確認する。

## 環境削除(アプリ)

### デプロイ設定実施

```bash
cd .github/workflows
mv deploy.yml deploy.yml.org
```

コミット・デプロイを実施してActionが稼働しないことを確認する。

### docker環境の削除を実施する。

```bash
docker-compose down
```

### 作業フォルダ削除する。

```bash
sudo rm -rf laravel-fargate-app
```

### GitHubへのAWS情報登録解除
GitHubリポジトリページに入り、Settings→secrets→Actionより、
以下の値を削除する。

```bash
名前:
PROD_AWS_ACCESS_KEY_ID
PROD_AWS_SECRET_ACCESS_KEY
PROD_AWS_ASSUME_ROLE_ARN
```
### SystemsManagerでのLaravel APP_KEY/DB_PASS削除

AWS SystemsManagerに入り、パラメータストアにて
以下の値を削除する。

```bash
名前:
/example/prod/foobar/APP_KEY
/example/prod/foobar/DB_PASS
```

## 環境削除(インフラ)

### ECSサービスを削除する。

```bash
cd laravel-fargate-infra/envs/prod/app/foobar
terraform destroy -target aws_ecs_service.this
```

### Redis/RDS CNAMEレコードを削除する。
```bash
cd ../../routing/foobar_internal
terraform destroy
terraform state list
```

### Redisを削除する。

```bash
cd ../../cache/foobar
terraform destroy
→6分かかる
terraform state list
```

### RDSを削除する。

```bash
cd ../../db/foobar
terraform destroy
→6分かかる
terraform state list
```

### ALBを削除する。

```bash
cd ../../routing/appfoobar_link
terraform apply -var='enable_alb=false'
```
### NATを削除する。

```bash
cd ../../network/main
terraform apply -var='enable_nat_gateway=false'
```

### ECSデプロイ用アカウントアクセスキー削除

AWS IAM管理画面から、example-prod-foobar-githubユーザの
アクセスキーを削除する。

### その他モジュール削除(Terraform)

以下の順番で削除すること。

```bash
EFS
cd ../../efs/foobar
terraform destroy
terraform state list

AIMユーザ/ポリシー/ecspresso設定
cd ../../cicd/app_foobar
terraform destroy
terraform state list

Laravelロググループ
cd ../../log/app_foobar
terraform destroy
terraform state list

DBロググループ
cd ../../log/db_foobar
terraform destroy
terraform state list

ECR/ECS/.env用S3
手動でECR内のリポジトリを削除する。
*ECSキャパシティープランナーのエラーが出ても、もう一回行う。
cd ../../app/foobar
terraform destroy
terraform state list

SSL証明書/DNSCNAME/ALB
cd ../../routing/appfoobar_link
terraform destroy
terraform state list

ALB用ログ取得S3
*バケットエラーが出ても、もう一度行う。
cd ../../log/alb
terraform destroy
terraform state list

ネットワーク周り
cd ../../network/main
terraform destroy
terraform state list

tfstate用S3
cd
cd laravel-fargate-infra/tfstate
terraform destroy
terraform state list
```

削除コマンド解説
```bash
terraform destroy
terraform destroy -target <モジュール名>

以下のコマンドを入力して、残っているモジュールがないことも確認すること。

terraform state list
リスト確認
結果で残っているモジュールがないか確認できる。
残っているものがある場合"aws_"で始まるモジュールを削除するか、
管理コンソール画面から手動で削除すること。
```

### 削除しきれていないモジュールの削除

AWS IAM管理画面に入り、以下の設定を削除する。

```bash
ロール:
AWSServiceRoleForECS
AWSServiceRoleForElastiCache
AWSServiceRoleForElasticLoadBalancing
AWSServiceRoleForRDS
AWSServiceRoleForAmazonElasticFileSystem
```

### 作業フォルダ削除する。

```bash
sudo rm -rf laravel-fargate-infra
```

### 課金確認

1日放置して、課金されているところがないか確認する。

## 書籍からの手順修正箇所

参考書籍の内容で構築して私が引っかかった部分を記載します。

### 1.5.1 Larabel Breezeインストールコマンド

```bash
docker-compose exec app composer require laravel/breeze:1.10 --dev
```

### 1.5.5 トランスコンパイル実行

コンテナでのnpm系コマンド実施前に、以下のコマンドを直前に行うこと。

macでは必要ない。

```bash
sudo chown -R root:root backend
```

作業後は以下のコマンドを入力して使用できるようにする。

```bash
sudo chown -R $USER:$USER backend
sudo chgrp -R www-data backend/storage backend/bootstrap/cache
sudo chmod -R ug+rwx backend/storage backend/bootstrap/cache
```

コンテナでのnpm系コマンド実施しなくても、いきなり上記の権限修正後
backendフォルダ内で"npm run prod"を稼働しても良い。

#### ログイン確認した際に画面がおかしくなった場合

vite使用箇所の修正をする。

以下のコマンドを入れる。

```bash
sudo rm -f backend/vite.config.js
cd /backend/resource/views/layouts/
sudo vi app.blade.php
sudo vi guest.blade.php
```

書き換え内容

変更前
```bash
        <!-- Scripts -->
        @vite(['resources/css/app.css', 'resources/js/app.js'])
```

変更後
```bash
        <!-- Styles -->
        <link rel="stylesheet" href="{{ asset('css/app.css') }}">

        <!-- Scripts -->
        <script src="{{ asset('js/app.js') }}" defer></script>
```

make npm-devを実施して、正常に画面表示されるか確認すること。

参照先URL

http://localhost/

### 4.16 トランスコンパイル実行

deploy.ymlでの以下行はなぜかgithubAction上の環境では動かないため、
対象コマンドはコメントアウトすること。

```bash
- run: docker-compose exec -T web npm run prod
```

合わせて、以下のフォルダについて"backend/.gitignore"でコメントアウトすること。
```bash
/public/css
/public/js
/public/mix-manifest.json

git rm -r --cached .
→コメントアウト後上記コマンドを入力しコミット/プッシュすること。
```

### 7.11.2 ECSサービスの作成

参考書籍を参考中ではそのままで問題ないが、
ECSタスクをecspressoで管理するようになったときは、
以下の書き換えを行いスクが自動稼働しないようにすること。

```bash
vi laravel-fargate-infra/envs/prod/app/foobar/variables.tf

以下の部分を書き換える(1を0にする。)
default = 0
```

ECSサービスヘルスチェックについて、
現状の設定の60秒ではタスクを5などに増やしたとき、
ヘルスチェックに間に合わずタスク再起動が発生し
デプロイし直しが繰り返し発生するため
以下の修正を初回設定時点で行うとよい。

```bash
vi laravel-fargate-infra/envs/prod/app/foobar/ecs.tf

以下の部分を書き換える(60を3600にする。)
health_check_grace_period_seconds = 3600
```

### 8.6 GitHub Actionによるデプロイ

デプロイ部分追記について以下の内容に修正する。

```bash
- name: Download ecspresso
        uses: kayac/ecspresso@v1
        with:
          version: latest
```

### 8.7 サービスとタスク定義をTerraform管理外にする。

管理外にすると、ECSサービス削除が行えなくなるため、
実施しなくてもよい。

# おわりに

本サイトについて駆け足で作成しているところもあるため、
自分でも誤りや問題に気づきましたら修正いたします。

気になるところなどありましたら、色々コメント頂けますと
嬉しいです。