Rails APIモードを AWSリソースをTerraformで構築し、 ECS Fargateにデプロイする [ 備考録 ]

# アーキテクチャー図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/0d1f5b24-25ca-4a9a-af33-c5f528c9fd14.png)


# リポジトリ
### Rails APIモード
https://github.com/oyne2561/aws_deploy_rails7.2.2

### Terraform
https://github.com/oyne2561/aws_deploy_terraform_todo_app_api

# 実践
## 1. ドメインを取得する。自分はムームードメインで取得した。
https://muumuu-domain.com/domain/search


## 2. RailsプロジェクトのREADME.mdを読み、起動方法とデプロイの流れを確認。
https://github.com/oyne2561/aws_deploy_rails7.2.2/blob/main/README.md

## 3. TerraformプロジェクトでAWSリソースを構築
`terraform/README.md`通りにリソースを作成。
https://github.com/oyne2561/aws_deploy_terraform_todo_app_api/blob/main/README.md
取得したドメインに置き換えるなど、TODOを確認して対処することに注意。

ACMの証明書を発行してもらうために、ムームードメインにRoute53のNSレコードを同期させることを忘れずに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/64f93b7b-ab83-448d-9520-23acc8b055d9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/29702e0f-289d-47c0-ab6e-136062178e0b.png)

**デプロイ成功の証跡**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/8fe5c455-4075-4ce9-a1d2-e5320e5107ec.png)

## ECSサービスが落ちたら確認すること
以下の下のほうにはまったエラーの対処法が書かれている。
https://github.com/oyne2561/aws_deploy_rails7.2.2/blob/main/README.md

### もしエラーが起きた際に手動でサービスを作成する手順
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/cda4a50a-9cac-42d4-8a62-d866f4720169.png)

ネットワーク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/61d8c037-bbb9-42dd-a3bb-46ec93e4b13d.png)

ロードバランサー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/35be84f4-9697-4684-bd5d-7b74966fe75a.png)

作成をクリック。

デプロイ成功の証跡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/8b196e50-4525-42dd-a6b8-f13737957d1a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/7ed8e1c5-771b-41a2-8b7a-ecd03dd6fa31.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077353/b9dcfb81-9b26-4392-a13b-93f62ded51df.png)


### 次回 Github ActionsでCI/CDパイプライン構築
https://qiita.com/oyne2561/items/7646a5daaf1acf95ebc4


# AWS リソース 一覧

## 🌐 ネットワーキング

### VPC関連
* **aws_vpc.main**: メインVPC（CIDR: 10.0.0.0/16）
* **aws_internet_gateway.main**: インターネットゲートウェイ
* **aws_subnet.public[0]**: パブリックサブネット1（10.0.1.0/24）
* **aws_subnet.public[1]**: パブリックサブネット2（10.0.2.0/24）
* **aws_subnet.private[0]**: プライベートサブネット1（10.0.10.0/24）
* **aws_subnet.private[1]**: プライベートサブネット2（10.0.11.0/24）

### NAT・ルーティング
* **aws_eip.nat**: NAT Gateway用Elastic IP
* **aws_nat_gateway.main**: NAT Gateway（パブリックサブネット1）
* **aws_route_table.public**: パブリック用ルートテーブル
* **aws_route_table.private[0]**: プライベート用ルートテーブル1
* **aws_route_table.private[1]**: プライベート用ルートテーブル2
* **aws_route_table_association.public[0]**: パブリックサブネット1のアソシエーション
* **aws_route_table_association.public[1]**: パブリックサブネット2のアソシエーション
* **aws_route_table_association.private[0]**: プライベートサブネット1のアソシエーション
* **aws_route_table_association.private[1]**: プライベートサブネット2のアソシエーション

## 🔒 セキュリティ

### セキュリティグループ
* **aws_security_group.alb**: ALB用セキュリティグループ（HTTP/HTTPS許可）
* **aws_security_group.ecs_tasks**: ECS Fargate用セキュリティグループ（ポート3000許可）
* **aws_security_group.rds**: RDS用セキュリティグループ（PostgreSQL許可）

## 🗄️ データベース

### RDS関連
* **aws_db_subnet_group.main**: RDS用サブネットグループ
* **aws_db_parameter_group.main**: PostgreSQL用パラメータグループ
* **aws_db_instance.main**: PostgreSQL RDSインスタンス（db.t3.micro）

## 📦 パラメータストア

### 環境変数管理
* **aws_ssm_parameter.db_host**: データベースホスト
* **aws_ssm_parameter.db_port**: データベースポート
* **aws_ssm_parameter.db_name**: データベース名
* **aws_ssm_parameter.db_username**: データベースユーザー名（暗号化）
* **aws_ssm_parameter.db_password**: データベースパスワード（暗号化）
* **aws_ssm_parameter.rails_env**: Rails環境設定
* **aws_ssm_parameter.rails_master_key**: Railsマスターキー（暗号化）
* **aws_ssm_parameter.secret_key_base**: Rails秘密鍵ベース（暗号化）
* **aws_ssm_parameter.cors_origins**: CORS設定

## 🌍 DNS・SSL

### Certificate Manager・Route53
* **aws_route53_zone.main**: Route53ホストゾーン
* **aws_acm_certificate.main**: SSL証明書（ワイルドカード証明書含む）
* **aws_route53_record.cert_validation**: SSL証明書のDNS検証レコード
* **aws_acm_certificate_validation.main**: SSL証明書検証リソース
* **aws_route53_record.main**: APIのDNSレコード（Aレコード）

## ⚖️ ロードバランサー

### ALB関連
* **aws_lb.main**: Application Load Balancer
* **aws_lb_target_group.main**: ターゲットグループ（ポート3000、ヘルスチェック：/health）
* **aws_lb_listener.http**: HTTPリスナー（HTTPS リダイレクト）
* **aws_lb_listener.https**: HTTPSリスナー（SSL終端）

## 🐳 コンテナ・コンピューティング

### ECS関連
* **aws_ecs_cluster.main**: ECSクラスター（ECS Exec設定含む）
* **aws_ecr_repository.app**: ECRリポジトリ（Dockerイメージ保存、脆弱性スキャン有効）
* **aws_ecs_task_definition.main**: ECSタスク定義（CPU: 256, Memory: 512MB, ARM64アーキテクチャ）
* **aws_ecs_service.main**: ECSサービス（desired_count: 1）- `desired_count`: ECSサービスが自動的にこの数のタスクを維持しようとします

### IAM・権限
* **aws_iam_role.ecs_task_execution_role**: ECSタスク実行ロール
* **aws_iam_role_policy_attachment.ecs_task_execution_role_policy**: 標準ECS実行ポリシーのアタッチ
* **aws_iam_role_policy.ecs_task_execution_role_ssm_policy**: Parameter Store アクセス用カスタムポリシー
* **aws_iam_role.ecs_task_role**: ECSタスクロール

## 📊 監視・ログ

### CloudWatch
* **aws_cloudwatch_log_group.ecs**: ECS用CloudWatchロググループ（保持期間: 7日）

## 💰 主要な課金対象リソース

### 継続課金
* **ECS Fargate**: CPU/Memory使用時間（ARM64アーキテクチャ）
* **RDS**: インスタンス稼働時間
* **ALB**: 稼働時間 + 処理されたデータ量
* **NAT Gateway**: 稼働時間 + 処理されたデータ量（1個のみ）
* **Elastic IP**: 1個の固定IP
* **Route53**: ホストゾーン維持 + DNSクエリ数

### 従量課金
* **CloudWatch Logs**: ログ保存量
* **ECR**: イメージ保存量
* **Parameter Store**: 暗号化パラメータ数