@k2works/claude-code-booster 1.12.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/claude-code-booster +5 -7
- package/lib/assets/.claude/README.md +73 -19
- package/lib/assets/.claude/agents/xp-architect.md +250 -0
- package/lib/assets/.claude/agents/xp-executive.md +207 -0
- package/lib/assets/.claude/agents/xp-interaction-designer.md +239 -0
- package/lib/assets/.claude/agents/xp-product-manager.md +245 -0
- package/lib/assets/.claude/agents/xp-programmer.md +268 -0
- package/lib/assets/.claude/agents/xp-project-manager.md +229 -0
- package/lib/assets/.claude/agents/xp-technical-writer.md +224 -0
- package/lib/assets/.claude/agents/xp-tester.md +265 -0
- package/lib/assets/.claude/agents/xp-user-representative.md +204 -0
- package/lib/assets/.claude/skills/ai-agent-guidelines/SKILL.md +49 -57
- package/lib/assets/.claude/skills/analyzing-architecture/SKILL.md +54 -58
- package/lib/assets/.claude/skills/analyzing-business/SKILL.md +52 -74
- package/lib/assets/.claude/skills/analyzing-data-model/SKILL.md +50 -53
- package/lib/assets/.claude/skills/analyzing-domain-model/SKILL.md +56 -56
- package/lib/assets/.claude/skills/analyzing-inception-deck/SKILL.md +56 -109
- package/lib/assets/.claude/skills/analyzing-non-functional/SKILL.md +61 -57
- package/lib/assets/.claude/skills/analyzing-operation/SKILL.md +61 -57
- package/lib/assets/.claude/skills/analyzing-requirements/SKILL.md +57 -55
- package/lib/assets/.claude/skills/analyzing-tech-stack/SKILL.md +66 -67
- package/lib/assets/.claude/skills/analyzing-test-strategy/SKILL.md +58 -56
- package/lib/assets/.claude/skills/analyzing-ui-design/SKILL.md +51 -57
- package/lib/assets/.claude/skills/analyzing-usecases/SKILL.md +45 -60
- package/lib/assets/.claude/skills/creating-adr/SKILL.md +38 -40
- package/lib/assets/.claude/skills/developing-backend/SKILL.md +49 -55
- package/lib/assets/.claude/skills/developing-frontend/SKILL.md +47 -50
- package/lib/assets/.claude/skills/developing-release/SKILL.md +60 -95
- package/lib/assets/.claude/skills/generating-slides/SKILL.md +58 -100
- package/lib/assets/.claude/skills/git-commit/SKILL.md +27 -52
- package/lib/assets/.claude/skills/killing-processes/SKILL.md +16 -70
- package/lib/assets/.claude/skills/operating-backup/SKILL.md +59 -0
- package/lib/assets/.claude/skills/operating-cicd/SKILL.md +54 -0
- package/lib/assets/.claude/skills/operating-deploy/SKILL.md +67 -0
- package/lib/assets/.claude/skills/{managing-docs → operating-docs}/SKILL.md +1 -1
- package/lib/assets/.claude/skills/operating-provision/SKILL.md +77 -0
- package/lib/assets/.claude/skills/operating-setup/SKILL.md +63 -0
- package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +65 -95
- package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +60 -155
- package/lib/assets/.claude/skills/orchestrating-operation/SKILL.md +158 -0
- package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +60 -119
- package/lib/assets/.claude/skills/planning-releases/SKILL.md +63 -168
- package/lib/assets/.claude/skills/syncing-github-project/SKILL.md +62 -266
- package/lib/assets/.claude/skills/tracking-progress/SKILL.md +49 -122
- package/lib/assets/CLAUDE.md +7 -2
- package/lib/assets/README.md +3 -34
- package/lib/assets/docs/development/index.md +14 -8
- package/lib/assets/docs/index.md +1 -0
- package/lib/assets/docs/reference/SonarQube/343/203/255/343/203/274/343/202/253/343/203/253/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +640 -0
- package/lib/assets/docs/reference/index.md +1 -0
- package/lib/assets/docs/reference//351/201/213/347/224/250/343/202/271/343/202/257/343/203/252/343/203/227/343/203/210/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +421 -0
- package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +69 -5
- package/lib/assets/docs/template/AWS/343/202/271/343/203/206/343/203/274/343/202/270/343/203/263/343/202/260/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +1366 -0
- package/lib/assets/docs/template/AWS/343/203/227/343/203/255/343/203/200/343/202/257/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +634 -0
- package/lib/assets/docs/template//343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +547 -0
- package/lib/assets/docs/template//343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/350/250/210/347/224/273.md +123 -1
- package/lib/assets/docs/template//350/250/255/350/250/210.md +12 -2
- package/lib/assets/docs/template//351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +688 -0
- package/lib/assets/gulpfile.js +2 -0
- package/lib/assets/mkdocs.yml +1 -0
- package/lib/assets/ops/docker/sonarqube-local/docker-compose.yml +57 -0
- package/lib/assets/ops/scripts/sonar_local.js +726 -0
- package/package.json +1 -1
- package/lib/assets/.claude/SKILLS_TEMPLATE.md +0 -100
- package/lib/assets/.claude/agents/roles/.gitkeep +0 -0
- package/lib/assets/.claude/skills/managing-operations/DEPLOY.md +0 -77
- package/lib/assets/.claude/skills/managing-operations/SETUP_CSHARP.md +0 -80
- package/lib/assets/.claude/skills/managing-operations/SETUP_FRONTEND.md +0 -84
- package/lib/assets/.claude/skills/managing-operations/SETUP_JAVA.md +0 -75
- package/lib/assets/.claude/skills/managing-operations/SKILL.md +0 -156
|
@@ -0,0 +1,1366 @@
|
|
|
1
|
+
# AWS ステージング環境セットアップ手順書
|
|
2
|
+
|
|
3
|
+
## 概要
|
|
4
|
+
|
|
5
|
+
Terraform を使用して AWS 上に{プロジェクト名}のステージング環境を構築するための手順を説明します。
|
|
6
|
+
|
|
7
|
+
Infrastructure as Code(IaC)により、インフラストラクチャの一貫性、再現性、バージョン管理を保証します。
|
|
8
|
+
|
|
9
|
+
| サービス | 略称 | コンテナイメージ | ポート | 説明 |
|
|
10
|
+
|---------|------|----------------|--------|------|
|
|
11
|
+
| {サービス名} | {略称} | {イメージ名} | {ポート} | {説明} |
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## アーキテクチャ
|
|
16
|
+
|
|
17
|
+
```plantuml
|
|
18
|
+
@startuml
|
|
19
|
+
|
|
20
|
+
title ステージング環境構成図
|
|
21
|
+
|
|
22
|
+
cloud "AWS Cloud" as aws {
|
|
23
|
+
|
|
24
|
+
node "Route 53" as route53 {
|
|
25
|
+
component "DNS" as dns
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
rectangle "VPC" as vpc {
|
|
29
|
+
|
|
30
|
+
rectangle "Public Subnet" as pub_subnet {
|
|
31
|
+
component "NAT Gateway" as natgw
|
|
32
|
+
component "ALB" as alb
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
rectangle "Private Subnet" as priv_subnet {
|
|
36
|
+
component "ECS Task\n{サービス名} ({ポート})\n/{パス}/*" as ecs_svc
|
|
37
|
+
database "RDS\n({DB エンジン})" as rds
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
node "ECR" as ecr {
|
|
42
|
+
artifact "{イメージ名}" as img
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
node "Systems Manager" as ssm {
|
|
46
|
+
component "Parameter Store" as params
|
|
47
|
+
component "Application Manager" as appmgr
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
node "AWS Backup" as backup {
|
|
51
|
+
component "Backup Vault" as vault
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
node "S3" as s3 {
|
|
55
|
+
component "Terraform State" as tfstate
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
node "DynamoDB" as dynamo {
|
|
59
|
+
component "State Lock" as tflock
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
actor "ユーザー" as user
|
|
64
|
+
actor "開発者" as dev
|
|
65
|
+
|
|
66
|
+
user --> dns : HTTPS
|
|
67
|
+
dns --> alb : HTTPS
|
|
68
|
+
|
|
69
|
+
alb --> ecs_svc : "/{パス}/*"
|
|
70
|
+
|
|
71
|
+
ecs_svc --> rds : JDBC
|
|
72
|
+
|
|
73
|
+
priv_subnet --> natgw : アウトバウンド
|
|
74
|
+
|
|
75
|
+
ecr --> ecs_svc : イメージプル
|
|
76
|
+
|
|
77
|
+
params --> ecs_svc : 設定値
|
|
78
|
+
|
|
79
|
+
vault --> rds : スナップショット
|
|
80
|
+
|
|
81
|
+
dev --> tfstate : terraform apply
|
|
82
|
+
dev --> tflock : 状態ロック
|
|
83
|
+
|
|
84
|
+
@enduml
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### AWS サービス構成
|
|
88
|
+
|
|
89
|
+
| サービス | 用途 |
|
|
90
|
+
|---------|------|
|
|
91
|
+
| Route 53 | DNS 管理・カスタムドメイン設定 |
|
|
92
|
+
| ECS (Fargate) | コンテナベースのアプリケーション実行(ALB 連携・パスベースルーティング) |
|
|
93
|
+
| ALB | ECS タスクへのトラフィック分散 |
|
|
94
|
+
| ECR | Docker イメージレジストリ |
|
|
95
|
+
| RDS ({DB エンジン}) | データベース |
|
|
96
|
+
| VPC | ネットワーク分離(パブリック / プライベートサブネット) |
|
|
97
|
+
| NAT Gateway | プライベートサブネットからのアウトバウンド通信 |
|
|
98
|
+
| Systems Manager | パラメータストア(DB 認証情報等) |
|
|
99
|
+
| CloudWatch Logs | ECS タスクのコンテナログ |
|
|
100
|
+
| S3 | Terraform 状態ファイル管理 |
|
|
101
|
+
| DynamoDB | Terraform 状態ロック |
|
|
102
|
+
| Resource Groups | Application Manager 用リソースグループ(タグベース) |
|
|
103
|
+
| AWS Backup | RDS スナップショットの自動取得 |
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 前提条件
|
|
108
|
+
|
|
109
|
+
- AWS アカウント(適切な IAM 権限)
|
|
110
|
+
- パッケージマネージャー
|
|
111
|
+
- Windows: [Scoop](https://scoop.sh/)
|
|
112
|
+
- macOS: [Homebrew](https://brew.sh/)
|
|
113
|
+
- Terraform >= 1.0.0, < 2.0.0
|
|
114
|
+
- AWS CLI v2
|
|
115
|
+
- aws-vault(開発環境での認証管理)
|
|
116
|
+
- Node.js >= 18 / npm(タスクランナー実行用)
|
|
117
|
+
- Docker Desktop(LocalStack テスト用)
|
|
118
|
+
- Go >= 1.21(Terratest 実行時)
|
|
119
|
+
- Git
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## インストール
|
|
124
|
+
|
|
125
|
+
### 1. AWS CLI のセットアップ
|
|
126
|
+
|
|
127
|
+
#### 1.1 AWS CLI のインストール
|
|
128
|
+
|
|
129
|
+
**Windows(Scoop)**:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
scoop install aws
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**macOS(Homebrew)**:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
brew install awscli
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
インストール確認:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
aws --version
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
#### 1.2 aws-vault のインストール
|
|
148
|
+
|
|
149
|
+
aws-vault は AWS の認証情報を OS のキーチェーンに安全に保存し、一時的なセッション認証情報を自動生成するツールです。
|
|
150
|
+
|
|
151
|
+
**Windows(Scoop)**:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
scoop install aws-vault
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**macOS(Homebrew)**:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
brew install aws-vault
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
インストール確認:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
aws-vault --version
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
#### 1.3 開発環境の認証設定(aws-vault 使用)
|
|
170
|
+
|
|
171
|
+
1. マネジメントコンソールからアクセスキーを作成します
|
|
172
|
+
2. aws-vault にプロファイルを登録します
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
aws-vault add <profile_name>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
3. `~/.aws/config` にプロファイルのリージョンを設定します
|
|
179
|
+
|
|
180
|
+
```text
|
|
181
|
+
[profile <profile_name>]
|
|
182
|
+
region={リージョン}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
> **重要**: リージョンが設定されていないと `aws-vault exec` 実行時にエラーが発生します。
|
|
186
|
+
|
|
187
|
+
4. 登録後、AWS リソースへのアクセスを確認します
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
aws-vault exec <profile_name> -- aws s3 ls
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
5. `~/.aws/credentials` に以下を追加します
|
|
194
|
+
|
|
195
|
+
```text
|
|
196
|
+
[<profile_name>]
|
|
197
|
+
credential_process=aws-vault exec <profile_name> --json --prompt=wincredui
|
|
198
|
+
region={リージョン}
|
|
199
|
+
output=json
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
> **補足**: macOS の場合は `--prompt=osascript` に変更してください。
|
|
203
|
+
|
|
204
|
+
#### 1.4 手動で実行する場合
|
|
205
|
+
|
|
206
|
+
手動で Terraform や AWS CLI コマンドを実行する場合は、必ず `aws-vault exec` 経由で実行してください。
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# Terraform の初期化
|
|
210
|
+
aws-vault exec <profile_name> -- terraform init --backend-config=backend.hcl
|
|
211
|
+
|
|
212
|
+
# Terraform の plan / apply
|
|
213
|
+
aws-vault exec <profile_name> -- terraform plan
|
|
214
|
+
aws-vault exec <profile_name> -- terraform apply
|
|
215
|
+
|
|
216
|
+
# AWS CLI コマンド
|
|
217
|
+
aws-vault exec <profile_name> -- aws s3 ls
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
#### 1.5 マネジメントコンソールにログイン
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
# aws-vault login(推奨)
|
|
224
|
+
aws-vault login <profile_name>
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 設定
|
|
230
|
+
|
|
231
|
+
### 2. Terraform ディレクトリ構成
|
|
232
|
+
|
|
233
|
+
Terraform コードは `ops/terraform/` 配下に以下の構成で配置します。
|
|
234
|
+
|
|
235
|
+
```text
|
|
236
|
+
ops/terraform/
|
|
237
|
+
├── live/
|
|
238
|
+
│ ├── global/
|
|
239
|
+
│ │ ├── variables/ # プロジェクト共通変数
|
|
240
|
+
│ │ ├── s3/ # Terraform 状態管理用 S3 バケット
|
|
241
|
+
│ │ └── iam/ # OIDC 認証用 IAM ロール
|
|
242
|
+
│ ├── stage/
|
|
243
|
+
│ │ ├── ssm/
|
|
244
|
+
│ │ │ ├── paramstore/ # SSM パラメータストア
|
|
245
|
+
│ │ │ └── appmanager/ # Application Manager リソースグループ
|
|
246
|
+
│ │ ├── vpc/ # VPC・サブネット・NAT Gateway
|
|
247
|
+
│ │ ├── data-stores/
|
|
248
|
+
│ │ │ └── rds/ # RDS
|
|
249
|
+
│ │ ├── backup/ # AWS Backup
|
|
250
|
+
│ │ ├── repository/
|
|
251
|
+
│ │ │ └── ecr/ # ECR リポジトリ(サービスごと)
|
|
252
|
+
│ │ ├── services/
|
|
253
|
+
│ │ │ └── ecs/ # ECS (Fargate + ALB)
|
|
254
|
+
│ │ └── variables/ # ステージ変数
|
|
255
|
+
│ └── mgmt/
|
|
256
|
+
│ └── stage/
|
|
257
|
+
│ └── bastion/ # 踏み台サーバー
|
|
258
|
+
├── modules/
|
|
259
|
+
│ ├── iam/
|
|
260
|
+
│ │ └── ecs/ # ECS タスクロール / タスク実行ロール
|
|
261
|
+
│ ├── networking/
|
|
262
|
+
│ │ └── vpc/ # VPC モジュール
|
|
263
|
+
│ ├── data-stores/
|
|
264
|
+
│ │ └── rds/ # RDS モジュール
|
|
265
|
+
│ ├── backup/ # AWS Backup モジュール
|
|
266
|
+
│ ├── repository/
|
|
267
|
+
│ │ └── ecr/ # ECR モジュール
|
|
268
|
+
│ └── services/
|
|
269
|
+
│ └── ecs/ # ECS モジュール(クラスター・ALB・サービス)
|
|
270
|
+
└── test/
|
|
271
|
+
├── unit/ # 単体テスト
|
|
272
|
+
└── integration/ # 結合テスト
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### 3. Terraform 状態管理用 S3 バケットの作成
|
|
276
|
+
|
|
277
|
+
Terraform の状態ファイル(`.tfstate`)を S3 に保存し、DynamoDB テーブルで状態ロック(同時実行防止)を行います。他のすべてのリソースのバックエンドとなるため、最初に作成する必要があります。
|
|
278
|
+
|
|
279
|
+
#### 3.1 リソース定義
|
|
280
|
+
|
|
281
|
+
```hcl
|
|
282
|
+
resource "aws_s3_bucket" "terraform_state" {
|
|
283
|
+
bucket = "${local.project_name}-staging-terraform-state"
|
|
284
|
+
|
|
285
|
+
lifecycle {
|
|
286
|
+
prevent_destroy = false
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
resource "aws_s3_bucket_versioning" "enabled" {
|
|
291
|
+
bucket = aws_s3_bucket.terraform_state.bucket
|
|
292
|
+
versioning_configuration {
|
|
293
|
+
status = "Enabled"
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
resource "aws_s3_bucket_public_access_block" "public_access" {
|
|
298
|
+
bucket = aws_s3_bucket.terraform_state.id
|
|
299
|
+
block_public_acls = true
|
|
300
|
+
block_public_policy = true
|
|
301
|
+
ignore_public_acls = true
|
|
302
|
+
restrict_public_buckets = true
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
resource "aws_dynamodb_table" "terraform_locks" {
|
|
306
|
+
name = "${local.project_name}-staging-terraform-state-locks"
|
|
307
|
+
billing_mode = "PAY_PER_REQUEST"
|
|
308
|
+
hash_key = "LockID"
|
|
309
|
+
|
|
310
|
+
attribute {
|
|
311
|
+
name = "LockID"
|
|
312
|
+
type = "S"
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
#### 3.2 プロビジョニング手順
|
|
318
|
+
|
|
319
|
+
作業ディレクトリ: `ops/terraform/live/global/s3`
|
|
320
|
+
|
|
321
|
+
```bash
|
|
322
|
+
terraform init
|
|
323
|
+
terraform plan
|
|
324
|
+
terraform apply
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
> **重要**: S3 バケットと DynamoDB テーブルは Terraform 状態の保存先です。他のすべてのリソースより先に作成してください。
|
|
328
|
+
|
|
329
|
+
### 4. GitHub Actions 用 IAM ロールの作成
|
|
330
|
+
|
|
331
|
+
作業ディレクトリ: `ops/terraform/live/global/iam`
|
|
332
|
+
|
|
333
|
+
OIDC プロバイダーと GitHub Actions 用の IAM ロールを作成します。
|
|
334
|
+
|
|
335
|
+
aws-vault 使用時は `--no-session` が必要です(STS 一時認証情報では IAM API が制限されるため)。
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
aws-vault exec <profile_name> --no-session -- terraform init
|
|
339
|
+
aws-vault exec <profile_name> --no-session -- terraform plan
|
|
340
|
+
aws-vault exec <profile_name> --no-session -- terraform apply
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
作成後:
|
|
344
|
+
|
|
345
|
+
1. 出力された IAM ロールの ARN をコピー
|
|
346
|
+
2. GitHub Actions の `AWS_ROLE_ARN` シークレットに設定
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## タスクランナーによる自動化
|
|
351
|
+
|
|
352
|
+
Terraform プロビジョニング / 廃棄作業はタスクランナーで自動化できます。
|
|
353
|
+
|
|
354
|
+
| 変数 | 説明 | 例 |
|
|
355
|
+
|------|------|----|
|
|
356
|
+
| `STG_AWS_PROFILE` | aws-vault で使用するプロファイル名 | `{プロファイル名}` |
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
# 代表的なコマンド
|
|
360
|
+
{セットアップコマンド} # 初回セットアップ
|
|
361
|
+
{全リソースプロビジョニングコマンド} # 全リソースの一括プロビジョニング
|
|
362
|
+
{plan コマンド} # 全リソースの plan のみ
|
|
363
|
+
{destroy コマンド} # 全リソースの一括廃棄
|
|
364
|
+
{ヘルプコマンド} # ヘルプ
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## プロビジョニング
|
|
370
|
+
|
|
371
|
+
### プロビジョニングフロー
|
|
372
|
+
|
|
373
|
+
```plantuml
|
|
374
|
+
@startuml
|
|
375
|
+
|
|
376
|
+
title ステージング環境プロビジョニングフロー
|
|
377
|
+
|
|
378
|
+
|グローバル設定|
|
|
379
|
+
start
|
|
380
|
+
:S3 バケット作成\n(状態管理);
|
|
381
|
+
:IAM ロール作成\n(OIDC 認証);
|
|
382
|
+
|
|
383
|
+
|アプリケーション基盤|
|
|
384
|
+
:SSM パラメータストア設定;
|
|
385
|
+
:VPC 設定;
|
|
386
|
+
:RDS 設定;
|
|
387
|
+
:AWS Backup 設定\n(RDS);
|
|
388
|
+
|
|
389
|
+
|リポジトリ・ビルド|
|
|
390
|
+
:ECR リポジトリ作成;
|
|
391
|
+
:Docker イメージ ビルド\n& ECR プッシュ;
|
|
392
|
+
|
|
393
|
+
|サービス設定|
|
|
394
|
+
:ECS 設定\n(Fargate + ALB);
|
|
395
|
+
note right: ALB パスベースルーティング
|
|
396
|
+
|
|
397
|
+
:Application Manager\n(リソースグループ);
|
|
398
|
+
|
|
399
|
+
|管理サーバー|
|
|
400
|
+
:EC2 キーペア作成;
|
|
401
|
+
note right: **任意**\n踏み台サーバー用
|
|
402
|
+
|
|
403
|
+
:踏み台サーバー\nセットアップ;
|
|
404
|
+
note right: **任意**\nRDS 接続・バックアップ用
|
|
405
|
+
|
|
406
|
+
|ネットワーク設定|
|
|
407
|
+
:Route 53 設定;
|
|
408
|
+
:カスタムドメイン設定;
|
|
409
|
+
|
|
410
|
+
stop
|
|
411
|
+
|
|
412
|
+
@enduml
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
### 5. SSM パラメータストアの設定
|
|
416
|
+
|
|
417
|
+
AWS Systems Manager Parameter Store を使用して、RDS の認証情報(ユーザー名・パスワード)を `SecureString` として暗号化管理します。
|
|
418
|
+
|
|
419
|
+
#### 5.1 リソース定義
|
|
420
|
+
|
|
421
|
+
```hcl
|
|
422
|
+
resource "aws_ssm_parameter" "db_username" {
|
|
423
|
+
name = "${local.ssm_parameter_key}/DB_USERNAME"
|
|
424
|
+
type = "SecureString"
|
|
425
|
+
value = var.db_username
|
|
426
|
+
|
|
427
|
+
tags = {
|
|
428
|
+
Name = local.resource_name
|
|
429
|
+
ResourceGroupName = local.resource_name
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
resource "aws_ssm_parameter" "db_password" {
|
|
434
|
+
name = "${local.ssm_parameter_key}/DB_PASSWORD"
|
|
435
|
+
type = "SecureString"
|
|
436
|
+
value = var.db_password
|
|
437
|
+
|
|
438
|
+
tags = {
|
|
439
|
+
Name = local.resource_name
|
|
440
|
+
ResourceGroupName = local.resource_name
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
#### 5.2 プロビジョニング手順
|
|
446
|
+
|
|
447
|
+
1. `secret.tfvars` ファイルを作成します
|
|
448
|
+
|
|
449
|
+
```text
|
|
450
|
+
db_username = "<DB ユーザー名>"
|
|
451
|
+
db_password = "<DB パスワード>"
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
> **重要**: `secret.tfvars` は Git 管理外にしてください(`.gitignore` に追加済み)。
|
|
455
|
+
|
|
456
|
+
2. Terraform を実行します
|
|
457
|
+
|
|
458
|
+
作業ディレクトリ: `ops/terraform/live/stage/ssm/paramstore`
|
|
459
|
+
|
|
460
|
+
```bash
|
|
461
|
+
terraform init --backend-config=backend.hcl
|
|
462
|
+
terraform plan --var-file=secret.tfvars
|
|
463
|
+
terraform apply --var-file=secret.tfvars
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### 6. VPC の設定
|
|
467
|
+
|
|
468
|
+
パブリックサブネット(ALB・NAT Gateway・踏み台サーバー)とプライベートサブネット(ECS タスク・RDS)を複数のアベイラビリティゾーンに分散配置し、高可用性とセキュリティを確保します。
|
|
469
|
+
|
|
470
|
+
#### 6.1 ネットワーク構成
|
|
471
|
+
|
|
472
|
+
```plantuml
|
|
473
|
+
@startuml
|
|
474
|
+
|
|
475
|
+
title VPC ネットワーク構成図
|
|
476
|
+
|
|
477
|
+
rectangle "VPC ({VPC CIDR})" as vpc {
|
|
478
|
+
|
|
479
|
+
rectangle "Public Subnet AZ-a\n{パブリック CIDR 1}" as pub1a {
|
|
480
|
+
component "NAT Gateway" as nat
|
|
481
|
+
component "ALB" as alb
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
rectangle "Public Subnet AZ-c\n{パブリック CIDR 2}" as pub1c {
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
rectangle "Private Subnet AZ-a\n{プライベート CIDR 1}" as priv1a {
|
|
488
|
+
component "ECS Tasks" as ecs
|
|
489
|
+
database "RDS" as rds
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
rectangle "Private Subnet AZ-c\n{プライベート CIDR 2}" as priv1c {
|
|
493
|
+
component "RDS Standby" as rds_sb
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
cloud "Internet" as inet
|
|
498
|
+
|
|
499
|
+
inet --> alb : HTTP/HTTPS
|
|
500
|
+
alb --> ecs
|
|
501
|
+
ecs --> rds
|
|
502
|
+
priv1a --> nat : アウトバウンド
|
|
503
|
+
nat --> inet
|
|
504
|
+
|
|
505
|
+
@enduml
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
#### 6.2 サブネット設定
|
|
509
|
+
|
|
510
|
+
| サブネット | CIDR | AZ | 用途 |
|
|
511
|
+
|-----------|------|----|------|
|
|
512
|
+
| Public AZ-a | `{CIDR}` | {AZ-a} | ALB、NAT Gateway、踏み台サーバー |
|
|
513
|
+
| Public AZ-c | `{CIDR}` | {AZ-c} | ALB(マルチ AZ) |
|
|
514
|
+
| Private AZ-a | `{CIDR}` | {AZ-a} | ECS タスク、RDS プライマリ |
|
|
515
|
+
| Private AZ-c | `{CIDR}` | {AZ-c} | RDS スタンバイ(マルチ AZ) |
|
|
516
|
+
|
|
517
|
+
#### 6.3 主要リソース定義
|
|
518
|
+
|
|
519
|
+
```hcl
|
|
520
|
+
resource "aws_vpc" "main" {
|
|
521
|
+
cidr_block = var.vpc_cidr
|
|
522
|
+
instance_tenancy = "default"
|
|
523
|
+
enable_dns_support = true
|
|
524
|
+
enable_dns_hostnames = true
|
|
525
|
+
|
|
526
|
+
tags = {
|
|
527
|
+
Name = var.tags_name
|
|
528
|
+
ResourceGroupName = var.tags_name
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
**NAT Gateway(プライベートサブネットのアウトバウンド通信用):**
|
|
534
|
+
|
|
535
|
+
```hcl
|
|
536
|
+
resource "aws_eip" "nat" {
|
|
537
|
+
count = var.nat_gw_enable ? 1 : 0
|
|
538
|
+
domain = "vpc"
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
resource "aws_nat_gateway" "main" {
|
|
542
|
+
count = var.nat_gw_enable ? 1 : 0
|
|
543
|
+
allocation_id = aws_eip.nat[0].id
|
|
544
|
+
subnet_id = aws_subnet.public_1a.id
|
|
545
|
+
}
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
#### 6.4 プロビジョニング手順
|
|
549
|
+
|
|
550
|
+
作業ディレクトリ: `ops/terraform/live/stage/vpc`
|
|
551
|
+
|
|
552
|
+
```bash
|
|
553
|
+
terraform init --backend-config=backend.hcl
|
|
554
|
+
terraform plan
|
|
555
|
+
terraform apply
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
### 7. RDS の設定
|
|
559
|
+
|
|
560
|
+
作業ディレクトリ: `ops/terraform/live/stage/data-stores/rds`
|
|
561
|
+
|
|
562
|
+
```bash
|
|
563
|
+
terraform init --backend-config=backend.hcl
|
|
564
|
+
terraform plan
|
|
565
|
+
terraform apply
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
#### 7.1 RDS 設定パラメータ
|
|
569
|
+
|
|
570
|
+
| パラメータ | ステージング値 | 説明 |
|
|
571
|
+
|-----------|-------------|------|
|
|
572
|
+
| `instance_class` | `{インスタンスタイプ}` | インスタンスタイプ |
|
|
573
|
+
| `allocated_storage` | `{容量}` GB | ストレージ容量 |
|
|
574
|
+
| `engine` / `engine_version` | `{エンジン}` / `{バージョン}` | DB エンジン |
|
|
575
|
+
| `backup_retention_period` | `{日数}` | 自動バックアップ保持日数 |
|
|
576
|
+
| `enable_blue_green_update` | `true` | Blue/Green Deployment 有効 |
|
|
577
|
+
| `skip_final_snapshot` | `false` | 削除時に最終スナップショットを取得 |
|
|
578
|
+
| `deletion_protection` | `false` | 削除保護(ステージングは無効) |
|
|
579
|
+
| `apply_immediately` | `true` | 変更を即時適用 |
|
|
580
|
+
|
|
581
|
+
#### 7.2 Blue/Green Deployment
|
|
582
|
+
|
|
583
|
+
RDS の Blue/Green Deployment は、エンジンバージョンアップグレードやパラメータグループ変更をダウンタイム数十秒で実行する仕組みです。
|
|
584
|
+
|
|
585
|
+
```plantuml
|
|
586
|
+
@startuml
|
|
587
|
+
|
|
588
|
+
title RDS Blue/Green Deployment フロー
|
|
589
|
+
|
|
590
|
+
start
|
|
591
|
+
|
|
592
|
+
:terraform apply\n(engine_version 変更等);
|
|
593
|
+
|
|
594
|
+
:blue_green_update { enabled = true } を検出;
|
|
595
|
+
|
|
596
|
+
partition "AWS 内部で自動実行" {
|
|
597
|
+
:グリーン環境を作成;
|
|
598
|
+
note right: 論理レプリケーションで\nデータを同期
|
|
599
|
+
:データ同期完了を待機;
|
|
600
|
+
:Switchover 実行;
|
|
601
|
+
note right: ダウンタイム: 数十秒
|
|
602
|
+
:旧インスタンス(ブルー)削除;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
:Terraform State 自動更新;
|
|
606
|
+
|
|
607
|
+
stop
|
|
608
|
+
|
|
609
|
+
@enduml
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
### 8. AWS Backup (RDS)
|
|
613
|
+
|
|
614
|
+
AWS Backup により RDS のスナップショットを日次・週次で自動取得します。`Backup = "true"` タグが付与された RDS インスタンスが対象です。
|
|
615
|
+
|
|
616
|
+
#### 8.1 バックアップポリシー
|
|
617
|
+
|
|
618
|
+
| ルール | スケジュール | 保持期間 |
|
|
619
|
+
|--------|-------------|---------|
|
|
620
|
+
| daily | 毎日 JST 0:00(UTC 15:00) | {日数} 日 |
|
|
621
|
+
| weekly | 毎週日曜 JST 0:00(UTC 15:00) | {日数} 日 |
|
|
622
|
+
|
|
623
|
+
#### 8.2 主要リソース定義
|
|
624
|
+
|
|
625
|
+
```hcl
|
|
626
|
+
resource "aws_backup_vault" "main" {
|
|
627
|
+
name = "${var.app_env_name}-backup-vault"
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
resource "aws_backup_plan" "main" {
|
|
631
|
+
name = "${var.app_env_name}-backup-plan"
|
|
632
|
+
|
|
633
|
+
rule {
|
|
634
|
+
rule_name = "daily"
|
|
635
|
+
target_vault_name = aws_backup_vault.main.name
|
|
636
|
+
schedule = "cron(0 15 * * ? *)" # JST 0:00
|
|
637
|
+
start_window = 60
|
|
638
|
+
completion_window = 180
|
|
639
|
+
lifecycle {
|
|
640
|
+
delete_after = var.daily_retention_days
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
rule {
|
|
645
|
+
rule_name = "weekly"
|
|
646
|
+
target_vault_name = aws_backup_vault.main.name
|
|
647
|
+
schedule = "cron(0 15 ? * SUN *)"
|
|
648
|
+
start_window = 60
|
|
649
|
+
completion_window = 180
|
|
650
|
+
lifecycle {
|
|
651
|
+
delete_after = var.weekly_retention_days
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
resource "aws_backup_selection" "tagged" {
|
|
657
|
+
name = "${var.app_env_name}-backup-selection"
|
|
658
|
+
iam_role_arn = aws_iam_role.backup.arn
|
|
659
|
+
plan_id = aws_backup_plan.main.id
|
|
660
|
+
|
|
661
|
+
selection_tag {
|
|
662
|
+
type = "STRINGEQUALS"
|
|
663
|
+
key = "Backup"
|
|
664
|
+
value = "true"
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
#### 8.3 プロビジョニング手順
|
|
670
|
+
|
|
671
|
+
作業ディレクトリ: `ops/terraform/live/stage/backup`
|
|
672
|
+
|
|
673
|
+
```bash
|
|
674
|
+
terraform init --backend-config=backend.hcl
|
|
675
|
+
terraform plan
|
|
676
|
+
terraform apply
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
### 9. ECR リポジトリの設定
|
|
680
|
+
|
|
681
|
+
各サービスの Docker イメージリポジトリを ECR に作成します。
|
|
682
|
+
|
|
683
|
+
#### 9.1 リソース定義
|
|
684
|
+
|
|
685
|
+
```hcl
|
|
686
|
+
resource "aws_ecr_repository" "app" {
|
|
687
|
+
name = var.repository_name
|
|
688
|
+
}
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
#### 9.2 プロビジョニング手順
|
|
692
|
+
|
|
693
|
+
各サービスの ECR リポジトリを個別に作成します。
|
|
694
|
+
|
|
695
|
+
作業ディレクトリ: `ops/terraform/live/stage/repository/ecr/{サービス名}`
|
|
696
|
+
|
|
697
|
+
```bash
|
|
698
|
+
terraform init --backend-config=backend.hcl
|
|
699
|
+
terraform plan
|
|
700
|
+
terraform apply
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
### 10. Docker イメージ ビルド & ECR プッシュ
|
|
704
|
+
|
|
705
|
+
ECR リポジトリ作成後、ECS でサービスを作成する前に、各サービスの Docker イメージをビルドして ECR にプッシュします。
|
|
706
|
+
|
|
707
|
+
#### 10.1 タスクランナー(推奨)
|
|
708
|
+
|
|
709
|
+
```bash
|
|
710
|
+
{ビルドコマンド} # 全サービスをローカルビルド
|
|
711
|
+
{プッシュコマンド} # ECR にログイン & 全イメージをプッシュ
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
#### 10.2 手動実行
|
|
715
|
+
|
|
716
|
+
```bash
|
|
717
|
+
# 1. ECR ログイン
|
|
718
|
+
aws-vault exec <profile_name> -- aws ecr get-login-password --region {リージョン} | \
|
|
719
|
+
docker login --username AWS --password-stdin <アカウント ID>.dkr.ecr.{リージョン}.amazonaws.com
|
|
720
|
+
|
|
721
|
+
# 2. イメージをビルド & プッシュ
|
|
722
|
+
docker build -t <アカウント ID>.dkr.ecr.{リージョン}.amazonaws.com/{イメージ名}:latest {Dockerfile ディレクトリ}
|
|
723
|
+
docker push <アカウント ID>.dkr.ecr.{リージョン}.amazonaws.com/{イメージ名}:latest
|
|
724
|
+
```
|
|
725
|
+
|
|
726
|
+
### 11. ECS の設定
|
|
727
|
+
|
|
728
|
+
ECS(Elastic Container Service)+ Fargate を使用したデプロイ構成です。ALB(Application Load Balancer)を前段に配置し、パスベースルーティングで各サービスにトラフィックを振り分けます。
|
|
729
|
+
|
|
730
|
+
#### 11.1 ECS の全体構成
|
|
731
|
+
|
|
732
|
+
```plantuml
|
|
733
|
+
@startuml
|
|
734
|
+
|
|
735
|
+
title ECS + ALB 構成図
|
|
736
|
+
|
|
737
|
+
rectangle "VPC" as vpc {
|
|
738
|
+
|
|
739
|
+
rectangle "Public Subnet" as pub {
|
|
740
|
+
component "ALB" as alb
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
rectangle "Private Subnet" as priv {
|
|
744
|
+
component "ECS Task\n{サービス名} ({ポート})" as ecs_svc
|
|
745
|
+
database "RDS\n({DB エンジン})" as rds
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
node "ECR" as ecr
|
|
750
|
+
|
|
751
|
+
alb --> ecs_svc : Target Group
|
|
752
|
+
ecs_svc --> rds
|
|
753
|
+
ecr --> ecs_svc : Pull Image
|
|
754
|
+
|
|
755
|
+
@enduml
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
主要コンポーネント:
|
|
759
|
+
|
|
760
|
+
| コンポーネント | 説明 |
|
|
761
|
+
|-------------|------|
|
|
762
|
+
| ECS クラスター | Fargate 起動タイプ |
|
|
763
|
+
| タスク定義 | コンテナイメージ、CPU/メモリ、環境変数、ログ設定を定義 |
|
|
764
|
+
| ECS サービス | タスクの希望数を維持し、ALB と連携 |
|
|
765
|
+
| ALB | パブリックサブネットに配置。パスベースルーティング |
|
|
766
|
+
| ターゲットグループ | サービスごとのパスベースルーティング |
|
|
767
|
+
| セキュリティグループ | ALB 用(80/443 許可)と ECS タスク用(ALB からのみ許可) |
|
|
768
|
+
|
|
769
|
+
#### 11.2 パスベースルーティングとコンテキストパス
|
|
770
|
+
|
|
771
|
+
| サービス | パスパターン | コンテキストパス | ヘルスチェックパス | ポート |
|
|
772
|
+
|---------|------------|----------------|------------------|--------|
|
|
773
|
+
| {サービス名} | `/{パス}`, `/{パス}/*` | `/{パス}` | `/{パス}/{ヘルスチェック}` | {ポート} |
|
|
774
|
+
|
|
775
|
+
#### 11.3 環境変数
|
|
776
|
+
|
|
777
|
+
各 ECS タスクに設定する環境変数:
|
|
778
|
+
|
|
779
|
+
| 環境変数 | 説明 | 例 |
|
|
780
|
+
|---------|------|-----|
|
|
781
|
+
| `SPRING_PROFILES_ACTIVE` | アプリケーションプロファイル | `{プロファイル名}` |
|
|
782
|
+
| `SPRING_DATASOURCE_URL` | JDBC 接続 URL | `{JDBC URL}` |
|
|
783
|
+
| `SERVER_SERVLET_CONTEXT_PATH` | サーブレットコンテキストパス | `/{パス}` |
|
|
784
|
+
| `PORT` | コンテナポート番号 | `{ポート}` |
|
|
785
|
+
|
|
786
|
+
#### 11.4 IAM ロールの設定
|
|
787
|
+
|
|
788
|
+
ECS タスクには 2 種類の IAM ロールが必要です。
|
|
789
|
+
|
|
790
|
+
**タスクロール** — タスク内のコンテナが AWS リソースにアクセスする際に使用:
|
|
791
|
+
|
|
792
|
+
```hcl
|
|
793
|
+
resource "aws_iam_role" "task_role" {
|
|
794
|
+
name = "${var.resource_name}-task-role"
|
|
795
|
+
assume_role_policy = data.aws_iam_policy_document.ecs_assume_role.json
|
|
796
|
+
}
|
|
797
|
+
```
|
|
798
|
+
|
|
799
|
+
**タスク実行ロール** — ECR イメージ取得、CloudWatch Logs 書き込み、SSM パラメータ取得に必要:
|
|
800
|
+
|
|
801
|
+
```hcl
|
|
802
|
+
resource "aws_iam_role" "task_exec_role" {
|
|
803
|
+
name = "${var.resource_name}-task-exec-role"
|
|
804
|
+
assume_role_policy = data.aws_iam_policy_document.ecs_assume_role.json
|
|
805
|
+
}
|
|
806
|
+
```
|
|
807
|
+
|
|
808
|
+
タスク実行ロールに必要な権限:
|
|
809
|
+
|
|
810
|
+
| 権限 | 説明 |
|
|
811
|
+
|------|------|
|
|
812
|
+
| `ecr:GetAuthorizationToken`, `ecr:BatchGetImage` 等 | ECR からのイメージプル |
|
|
813
|
+
| `logs:CreateLogStream`, `logs:PutLogEvents` | CloudWatch Logs への書き込み |
|
|
814
|
+
| `ssm:GetParameters` | SSM パラメータの取得 |
|
|
815
|
+
| `kms:Decrypt` | SecureString パラメータの復号 |
|
|
816
|
+
|
|
817
|
+
#### 11.5 セキュリティグループの設定
|
|
818
|
+
|
|
819
|
+
**ALB 用** — 外部からの HTTP/HTTPS アクセスを許可:
|
|
820
|
+
|
|
821
|
+
```hcl
|
|
822
|
+
resource "aws_security_group" "alb" {
|
|
823
|
+
name = "${var.resource_name}-alb-sg"
|
|
824
|
+
vpc_id = var.vpc_id
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
# HTTP (80) と HTTPS (443) のインバウンドルール
|
|
828
|
+
# 全アウトバウンドを許可
|
|
829
|
+
```
|
|
830
|
+
|
|
831
|
+
**ECS タスク用** — ALB からのトラフィックのみ許可:
|
|
832
|
+
|
|
833
|
+
```hcl
|
|
834
|
+
resource "aws_security_group" "ecs_tasks" {
|
|
835
|
+
name = "${var.resource_name}-ecs-tasks-sg"
|
|
836
|
+
vpc_id = var.vpc_id
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
# サービスごとのポートに対して ALB セキュリティグループからのインバウンドを許可
|
|
840
|
+
# 全アウトバウンドを許可
|
|
841
|
+
```
|
|
842
|
+
|
|
843
|
+
#### 11.6 ALB(Application Load Balancer)の設定
|
|
844
|
+
|
|
845
|
+
```hcl
|
|
846
|
+
# ALB 本体
|
|
847
|
+
resource "aws_lb" "alb" {
|
|
848
|
+
name = "${var.resource_name}-alb"
|
|
849
|
+
internal = false
|
|
850
|
+
load_balancer_type = "application"
|
|
851
|
+
subnets = var.public_subnet_ids
|
|
852
|
+
security_groups = [aws_security_group.alb.id]
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
# ターゲットグループ(サービスごとに for_each で作成)
|
|
856
|
+
resource "aws_alb_target_group" "service" {
|
|
857
|
+
for_each = var.services
|
|
858
|
+
|
|
859
|
+
name = "${var.resource_name}-${each.key}-tg"
|
|
860
|
+
port = each.value.container_port
|
|
861
|
+
protocol = "HTTP"
|
|
862
|
+
vpc_id = var.vpc_id
|
|
863
|
+
target_type = "ip" # Fargate では ip を指定
|
|
864
|
+
|
|
865
|
+
health_check {
|
|
866
|
+
path = each.value.health_check_path
|
|
867
|
+
protocol = "HTTP"
|
|
868
|
+
healthy_threshold = 3
|
|
869
|
+
unhealthy_threshold = 3
|
|
870
|
+
timeout = 5
|
|
871
|
+
interval = 30
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
# パスベースルーティング
|
|
876
|
+
resource "aws_alb_listener_rule" "service" {
|
|
877
|
+
for_each = var.services
|
|
878
|
+
listener_arn = local.listener_arn
|
|
879
|
+
|
|
880
|
+
action {
|
|
881
|
+
type = "forward"
|
|
882
|
+
target_group_arn = aws_alb_target_group.service[each.key].arn
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
condition {
|
|
886
|
+
path_pattern {
|
|
887
|
+
values = each.value.path_pattern
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
> **注意**: ALB やターゲットグループには **32 文字以内・英数字とハイフンのみ** という命名制約があります。
|
|
894
|
+
|
|
895
|
+
#### 11.7 ECS クラスターとタスク定義
|
|
896
|
+
|
|
897
|
+
```hcl
|
|
898
|
+
resource "aws_ecs_cluster" "cluster" {
|
|
899
|
+
name = var.cluster_name
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
resource "aws_ecs_task_definition" "service" {
|
|
903
|
+
for_each = var.services
|
|
904
|
+
|
|
905
|
+
family = "${var.resource_name}-${each.key}-task"
|
|
906
|
+
requires_compatibilities = ["FARGATE"]
|
|
907
|
+
network_mode = "awsvpc"
|
|
908
|
+
cpu = each.value.cpu
|
|
909
|
+
memory = each.value.memory
|
|
910
|
+
task_role_arn = var.task_role_arn
|
|
911
|
+
execution_role_arn = var.task_exec_role_arn
|
|
912
|
+
|
|
913
|
+
container_definitions = jsonencode([
|
|
914
|
+
{
|
|
915
|
+
name = each.value.name
|
|
916
|
+
image = "${each.value.ecr_repo_url}:latest"
|
|
917
|
+
cpu = each.value.cpu
|
|
918
|
+
memory = each.value.memory
|
|
919
|
+
essential = true
|
|
920
|
+
portMappings = [
|
|
921
|
+
{
|
|
922
|
+
containerPort = each.value.container_port
|
|
923
|
+
hostPort = each.value.container_port
|
|
924
|
+
}
|
|
925
|
+
]
|
|
926
|
+
environment = [
|
|
927
|
+
for k, v in each.value.environment : {
|
|
928
|
+
name = k
|
|
929
|
+
value = v
|
|
930
|
+
}
|
|
931
|
+
]
|
|
932
|
+
secrets = [
|
|
933
|
+
for k, v in each.value.secrets : {
|
|
934
|
+
name = k
|
|
935
|
+
valueFrom = v
|
|
936
|
+
}
|
|
937
|
+
]
|
|
938
|
+
logConfiguration = {
|
|
939
|
+
logDriver = "awslogs"
|
|
940
|
+
options = {
|
|
941
|
+
awslogs-group = aws_cloudwatch_log_group.ecs.name
|
|
942
|
+
awslogs-region = "{リージョン}"
|
|
943
|
+
awslogs-stream-prefix = each.key
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
])
|
|
948
|
+
}
|
|
949
|
+
```
|
|
950
|
+
|
|
951
|
+
#### 11.8 ECS サービスの作成
|
|
952
|
+
|
|
953
|
+
```hcl
|
|
954
|
+
resource "aws_ecs_service" "service" {
|
|
955
|
+
for_each = var.services
|
|
956
|
+
|
|
957
|
+
name = "${var.resource_name}-${each.key}-svc"
|
|
958
|
+
cluster = aws_ecs_cluster.cluster.id
|
|
959
|
+
task_definition = aws_ecs_task_definition.service[each.key].arn
|
|
960
|
+
desired_count = each.value.desired_count
|
|
961
|
+
launch_type = "FARGATE"
|
|
962
|
+
|
|
963
|
+
network_configuration {
|
|
964
|
+
subnets = var.private_subnet_ids
|
|
965
|
+
security_groups = [aws_security_group.ecs_tasks.id]
|
|
966
|
+
assign_public_ip = false
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
load_balancer {
|
|
970
|
+
target_group_arn = aws_alb_target_group.service[each.key].arn
|
|
971
|
+
container_name = each.value.name
|
|
972
|
+
container_port = each.value.container_port
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
```
|
|
976
|
+
|
|
977
|
+
#### 11.9 プロビジョニング手順
|
|
978
|
+
|
|
979
|
+
作業ディレクトリ: `ops/terraform/live/stage/services/ecs/`
|
|
980
|
+
|
|
981
|
+
```bash
|
|
982
|
+
terraform init --backend-config=backend.hcl
|
|
983
|
+
terraform plan
|
|
984
|
+
terraform apply
|
|
985
|
+
```
|
|
986
|
+
|
|
987
|
+
#### 11.10 デプロイ手順
|
|
988
|
+
|
|
989
|
+
ECS デプロイでは、ECR にプッシュ済みの最新イメージを使用してローリングデプロイを実行します。
|
|
990
|
+
|
|
991
|
+
```bash
|
|
992
|
+
# タスクランナー(推奨)
|
|
993
|
+
{ECS デプロイコマンド} # 全サービス: ビルド → プッシュ → ECS デプロイ
|
|
994
|
+
{ECS デプロイのみコマンド} # デプロイのみ(イメージ更新後)
|
|
995
|
+
{ECS ステータスコマンド} # ECS サービス状態
|
|
996
|
+
```
|
|
997
|
+
|
|
998
|
+
### 12. Application Manager(リソースグループ)
|
|
999
|
+
|
|
1000
|
+
タグベースのリソースグループを作成し、全リソースを一元管理します。
|
|
1001
|
+
|
|
1002
|
+
#### 12.1 リソース定義
|
|
1003
|
+
|
|
1004
|
+
```hcl
|
|
1005
|
+
resource "aws_resourcegroups_group" "app" {
|
|
1006
|
+
name = "${local.resource_name}-app"
|
|
1007
|
+
description = "{プロジェクト名} staging environment resource group"
|
|
1008
|
+
|
|
1009
|
+
resource_query {
|
|
1010
|
+
query = jsonencode({
|
|
1011
|
+
ResourceTypeFilters = ["AWS::AllSupported"]
|
|
1012
|
+
TagFilters = [{
|
|
1013
|
+
Key = "ResourceGroupName"
|
|
1014
|
+
Values = [local.tags_name]
|
|
1015
|
+
}]
|
|
1016
|
+
})
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
```
|
|
1020
|
+
|
|
1021
|
+
#### 12.2 タグ設計
|
|
1022
|
+
|
|
1023
|
+
全モジュールで `ResourceGroupName` タグを統一的に付与します。
|
|
1024
|
+
|
|
1025
|
+
```hcl
|
|
1026
|
+
tags = {
|
|
1027
|
+
Name = "<リソース名>"
|
|
1028
|
+
ResourceGroupName = var.tags_name
|
|
1029
|
+
}
|
|
1030
|
+
```
|
|
1031
|
+
|
|
1032
|
+
#### 12.3 プロビジョニング手順
|
|
1033
|
+
|
|
1034
|
+
作業ディレクトリ: `ops/terraform/live/stage/ssm/appmanager`
|
|
1035
|
+
|
|
1036
|
+
```bash
|
|
1037
|
+
terraform init --backend-config=backend.hcl
|
|
1038
|
+
terraform plan
|
|
1039
|
+
terraform apply
|
|
1040
|
+
```
|
|
1041
|
+
|
|
1042
|
+
> **補足**: Application Manager はリソースのグルーピングのみを行います。全リソースの作成後に実行してください。
|
|
1043
|
+
|
|
1044
|
+
### 13. EC2 キーペアの作成(踏み台サーバー用・任意)
|
|
1045
|
+
|
|
1046
|
+
踏み台サーバーの SSH 接続に使用する EC2 キーペアを作成します。
|
|
1047
|
+
|
|
1048
|
+
```bash
|
|
1049
|
+
aws-vault exec <profile_name> -- aws ec2 create-key-pair \
|
|
1050
|
+
--key-name {キーペア名} \
|
|
1051
|
+
--key-type rsa \
|
|
1052
|
+
--region {リージョン} \
|
|
1053
|
+
--query "KeyMaterial" \
|
|
1054
|
+
--output text > {キーペア名}.pem
|
|
1055
|
+
|
|
1056
|
+
# 公開鍵の生成
|
|
1057
|
+
ssh-keygen -y -f {キーペア名}.pem > {キーペア名}.pem.pub
|
|
1058
|
+
```
|
|
1059
|
+
|
|
1060
|
+
> **重要**: 秘密鍵ファイル(`.pem`)は再ダウンロードできません。安全な場所に保管してください。
|
|
1061
|
+
|
|
1062
|
+
### 14. 踏み台サーバーのセットアップ(任意)
|
|
1063
|
+
|
|
1064
|
+
作業ディレクトリ: `ops/terraform/live/mgmt/stage/bastion`
|
|
1065
|
+
|
|
1066
|
+
1. `secret.tfvars` ファイルを作成します
|
|
1067
|
+
|
|
1068
|
+
```text
|
|
1069
|
+
vpc_id = "<ステージング VPC の ID>"
|
|
1070
|
+
subnet_ids = ["<パブリックサブネット 1>", "<パブリックサブネット 2>"]
|
|
1071
|
+
postgres_config = {
|
|
1072
|
+
address = "<RDS エンドポイント>"
|
|
1073
|
+
port = "5432"
|
|
1074
|
+
}
|
|
1075
|
+
```
|
|
1076
|
+
|
|
1077
|
+
2. Terraform を実行します
|
|
1078
|
+
|
|
1079
|
+
```bash
|
|
1080
|
+
terraform init --backend-config=backend.hcl
|
|
1081
|
+
terraform plan --var-file=secret.tfvars
|
|
1082
|
+
terraform apply --var-file=secret.tfvars
|
|
1083
|
+
```
|
|
1084
|
+
|
|
1085
|
+
3. RDS への接続
|
|
1086
|
+
|
|
1087
|
+
```bash
|
|
1088
|
+
# SSH トンネル経由
|
|
1089
|
+
ssh -L 5432:<RDS エンドポイント>:5432 ec2-user@<踏み台 IP> -i {キーペア名}.pem
|
|
1090
|
+
|
|
1091
|
+
# 別ターミナルで DB に接続
|
|
1092
|
+
psql -h 127.0.0.1 -p 5432 -U <ユーザー名> -d <データベース名>
|
|
1093
|
+
```
|
|
1094
|
+
|
|
1095
|
+
### 15. Route 53・カスタムドメインの設定
|
|
1096
|
+
|
|
1097
|
+
ALB の DNS 名に対して Route 53 の CNAME レコードまたは Alias レコードを作成します。
|
|
1098
|
+
|
|
1099
|
+
HTTPS を使用する場合は、ACM(AWS Certificate Manager)で証明書を発行し、ECS モジュールの `certificate_arn` 変数に設定します。
|
|
1100
|
+
|
|
1101
|
+
```hcl
|
|
1102
|
+
module "ecs" {
|
|
1103
|
+
source = "../../../../modules/services/ecs"
|
|
1104
|
+
certificate_arn = var.certificate_arn # ACM 証明書の ARN
|
|
1105
|
+
}
|
|
1106
|
+
```
|
|
1107
|
+
|
|
1108
|
+
---
|
|
1109
|
+
|
|
1110
|
+
## デプロイ
|
|
1111
|
+
|
|
1112
|
+
### デプロイフロー
|
|
1113
|
+
|
|
1114
|
+
```plantuml
|
|
1115
|
+
@startuml
|
|
1116
|
+
|
|
1117
|
+
title デプロイフロー
|
|
1118
|
+
|
|
1119
|
+
|開発 PC|
|
|
1120
|
+
start
|
|
1121
|
+
:docker build\n(ローカルビルド);
|
|
1122
|
+
|
|
1123
|
+
:docker push\n(ECR にプッシュ);
|
|
1124
|
+
|
|
1125
|
+
|AWS|
|
|
1126
|
+
:ECS\n(ローリングデプロイ);
|
|
1127
|
+
note right: aws ecs update-service\n--force-new-deployment
|
|
1128
|
+
|
|
1129
|
+
stop
|
|
1130
|
+
|
|
1131
|
+
@enduml
|
|
1132
|
+
```
|
|
1133
|
+
|
|
1134
|
+
### デプロイタスク
|
|
1135
|
+
|
|
1136
|
+
```bash
|
|
1137
|
+
# 典型的なデプロイフロー(ECS)
|
|
1138
|
+
{ビルドコマンド} # 1. ローカルでイメージビルド
|
|
1139
|
+
{プッシュコマンド} # 2. ECR にプッシュ
|
|
1140
|
+
{ECS デプロイコマンド} # 3. ECS をローリングデプロイ
|
|
1141
|
+
```
|
|
1142
|
+
|
|
1143
|
+
---
|
|
1144
|
+
|
|
1145
|
+
## アップグレード
|
|
1146
|
+
|
|
1147
|
+
### RDS メジャーバージョンアップグレード
|
|
1148
|
+
|
|
1149
|
+
Blue/Green Deployment を利用して、ダウンタイムを最小限に抑えたメジャーバージョンアップグレードを実行します。
|
|
1150
|
+
|
|
1151
|
+
#### 手順
|
|
1152
|
+
|
|
1153
|
+
1. 共有変数モジュールの `db_engine_version` を変更
|
|
1154
|
+
2. `terraform apply` を実行(Blue/Green Deployment が自動実行)
|
|
1155
|
+
3. `terraform plan` で "No changes." を確認
|
|
1156
|
+
|
|
1157
|
+
> **注意**: Blue/Green Deployment は長時間かかるため、`aws-vault` のセッショントークンが途中で失効する場合があります。その場合は State ロック解除 → errored.tfstate のプッシュ → 手動 Switchover の順でリカバリしてください。
|
|
1158
|
+
|
|
1159
|
+
---
|
|
1160
|
+
|
|
1161
|
+
## 環境廃棄
|
|
1162
|
+
|
|
1163
|
+
プロビジョニング済みのステージング環境を廃棄する場合は、**構築時と逆の順序**で実行します。
|
|
1164
|
+
|
|
1165
|
+
### 廃棄フロー
|
|
1166
|
+
|
|
1167
|
+
```plantuml
|
|
1168
|
+
@startuml
|
|
1169
|
+
|
|
1170
|
+
title ステージング環境廃棄フロー
|
|
1171
|
+
|
|
1172
|
+
start
|
|
1173
|
+
|
|
1174
|
+
:Application Manager 削除\n(リソースグループ);
|
|
1175
|
+
|
|
1176
|
+
:ECS 削除\n(Fargate + ALB);
|
|
1177
|
+
|
|
1178
|
+
:ECR リポジトリ削除;
|
|
1179
|
+
|
|
1180
|
+
:AWS Backup 削除;
|
|
1181
|
+
|
|
1182
|
+
:RDS 削除;
|
|
1183
|
+
|
|
1184
|
+
:VPC 削除;
|
|
1185
|
+
note right: 踏み台サーバーがある場合は\n先に削除してください
|
|
1186
|
+
|
|
1187
|
+
:SSM パラメータストア削除;
|
|
1188
|
+
|
|
1189
|
+
stop
|
|
1190
|
+
|
|
1191
|
+
@enduml
|
|
1192
|
+
```
|
|
1193
|
+
|
|
1194
|
+
各リソースの削除コマンド:
|
|
1195
|
+
|
|
1196
|
+
```bash
|
|
1197
|
+
# 各リソースの作業ディレクトリで実行
|
|
1198
|
+
terraform init --backend-config=backend.hcl
|
|
1199
|
+
terraform destroy
|
|
1200
|
+
```
|
|
1201
|
+
|
|
1202
|
+
> **注意**: `secret.tfvars` を使用しているリソース(SSM、踏み台等)は `terraform destroy --var-file=secret.tfvars` を使用してください。
|
|
1203
|
+
|
|
1204
|
+
---
|
|
1205
|
+
|
|
1206
|
+
## データバックアップ
|
|
1207
|
+
|
|
1208
|
+
### AWS Backup(自動バックアップ)
|
|
1209
|
+
|
|
1210
|
+
| ルール | スケジュール | 保持期間 |
|
|
1211
|
+
|--------|-------------|---------|
|
|
1212
|
+
| daily | 毎日 JST 0:00 | {日数} 日 |
|
|
1213
|
+
| weekly | 毎週日曜 JST 0:00 | {日数} 日 |
|
|
1214
|
+
|
|
1215
|
+
#### AWS Backup からのリストア
|
|
1216
|
+
|
|
1217
|
+
1. AWS コンソール → AWS Backup → バックアップボールト → リカバリポイントを選択
|
|
1218
|
+
2. 「復元」をクリック → リストア先の DB インスタンス識別子を指定
|
|
1219
|
+
3. リストア完了後、必要に応じてアプリケーションの接続先を切り替え
|
|
1220
|
+
|
|
1221
|
+
> **警告**: AWS Backup からのリストアは既存インスタンスへの上書きではなく、新しい RDS インスタンスとして作成されます。
|
|
1222
|
+
|
|
1223
|
+
### SSH トンネル経由のバックアップ(手動)
|
|
1224
|
+
|
|
1225
|
+
```bash
|
|
1226
|
+
# 1. SSH トンネルを確立
|
|
1227
|
+
ssh -L 5432:<RDS エンドポイント>:5432 ec2-user@<踏み台 IP> -i {キーペア名}.pem
|
|
1228
|
+
|
|
1229
|
+
# 2. スキーマ単位でバックアップ
|
|
1230
|
+
PGPASSWORD=<パスワード> pg_dump -h 127.0.0.1 -p 5432 -U <ユーザー名> -d <DB 名> -n {スキーマ名} -Fc -f {スキーマ名}_backup.dump
|
|
1231
|
+
|
|
1232
|
+
# 3. リストア
|
|
1233
|
+
PGPASSWORD=<パスワード> pg_restore -h 127.0.0.1 -p 5432 -U <ユーザー名> -d <DB 名> --clean --if-exists {スキーマ名}_backup.dump
|
|
1234
|
+
```
|
|
1235
|
+
|
|
1236
|
+
---
|
|
1237
|
+
|
|
1238
|
+
## テスト
|
|
1239
|
+
|
|
1240
|
+
Terraform コードの品質を保証するため、3 段階のテスト戦略を採用しています。
|
|
1241
|
+
|
|
1242
|
+
| テスト | ツール | AWS 接続 | 対象 |
|
|
1243
|
+
|-------|--------|:--------:|------|
|
|
1244
|
+
| ローカルテスト | LocalStack (Docker) | 不要 | S3, SSM 等の基本サービス |
|
|
1245
|
+
| 単体テスト | Terratest (Go) | 不要 | `terraform validate` による構文検証 |
|
|
1246
|
+
| 結合テスト | Terratest (Go) | 必要 | S3 backend 付きの構文検証 |
|
|
1247
|
+
|
|
1248
|
+
### ローカルテスト(LocalStack)
|
|
1249
|
+
|
|
1250
|
+
LocalStack を使って Terraform コードをローカル環境で検証します。
|
|
1251
|
+
|
|
1252
|
+
```plantuml
|
|
1253
|
+
@startuml
|
|
1254
|
+
|
|
1255
|
+
title ローカルテストワークフロー
|
|
1256
|
+
|
|
1257
|
+
start
|
|
1258
|
+
|
|
1259
|
+
partition "1. セットアップ" {
|
|
1260
|
+
:Docker Desktop が起動していることを確認;
|
|
1261
|
+
:LocalStack コンテナを起動;
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
partition "2. テスト実行" {
|
|
1265
|
+
:各モジュールに対して\ninit → plan → apply → destroy;
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
partition "3. クリーンアップ" {
|
|
1269
|
+
:LocalStack コンテナを停止・削除;
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
stop
|
|
1273
|
+
|
|
1274
|
+
@enduml
|
|
1275
|
+
```
|
|
1276
|
+
|
|
1277
|
+
#### LocalStack の対象と制約
|
|
1278
|
+
|
|
1279
|
+
| テスト対象 | Community 版 | 確認内容 |
|
|
1280
|
+
|-----------|:---:|------|
|
|
1281
|
+
| S3 バケット | OK | バケット作成・暗号化設定 |
|
|
1282
|
+
| DynamoDB | OK | テーブル作成・キー設定 |
|
|
1283
|
+
| SSM パラメータ | OK | パラメータ登録・取得 |
|
|
1284
|
+
| IAM ロール | 制限あり | OIDC 非対応 |
|
|
1285
|
+
| VPC | 制限あり | 基本的な作成のみ |
|
|
1286
|
+
| RDS / ECR / ECS | 非対応 | Terratest で検証 |
|
|
1287
|
+
|
|
1288
|
+
### 単体テスト(Terratest)
|
|
1289
|
+
|
|
1290
|
+
```bash
|
|
1291
|
+
cd ops/terraform/test
|
|
1292
|
+
go test -v -timeout 30m ./unit/...
|
|
1293
|
+
```
|
|
1294
|
+
|
|
1295
|
+
### 結合テスト(Terratest)
|
|
1296
|
+
|
|
1297
|
+
```bash
|
|
1298
|
+
cd ops/terraform/test
|
|
1299
|
+
aws-vault exec <profile_name> -- go test -v -timeout 30m ./integration/...
|
|
1300
|
+
```
|
|
1301
|
+
|
|
1302
|
+
---
|
|
1303
|
+
|
|
1304
|
+
## トラブルシューティング
|
|
1305
|
+
|
|
1306
|
+
### aws-vault 関連
|
|
1307
|
+
|
|
1308
|
+
| 症状 | 原因 | 対処 |
|
|
1309
|
+
|------|------|------|
|
|
1310
|
+
| `an AWS region is required` | `~/.aws/config` に region 未設定 | プロファイルに `region={リージョン}` を追加 |
|
|
1311
|
+
| `InvalidClientTokenId` (IAM 操作) | STS 一時認証情報の制約 | `aws-vault exec --no-session` を使用 |
|
|
1312
|
+
| `EntityAlreadyExists` (OIDC) | OIDC プロバイダーは AWS アカウントに 1 つ | `data` ソースで既存を参照 |
|
|
1313
|
+
|
|
1314
|
+
### Terraform 関連
|
|
1315
|
+
|
|
1316
|
+
| 症状 | 原因 | 対処 |
|
|
1317
|
+
|------|------|------|
|
|
1318
|
+
| `terraform init` が失敗 | S3 バケット未作成 | `live/global/s3` を先に適用 |
|
|
1319
|
+
| 状態ロックエラー | 前回の apply が中断 | `terraform force-unlock <lock-id>` |
|
|
1320
|
+
| `backend-config` エラー | `backend.hcl` が見つからない | 作業ディレクトリを確認 |
|
|
1321
|
+
|
|
1322
|
+
### ECS 関連
|
|
1323
|
+
|
|
1324
|
+
| 症状 | 原因 | 対処 |
|
|
1325
|
+
|------|------|------|
|
|
1326
|
+
| ALB/TG 名が長すぎるエラー | リソース名が 32 文字超過 | 短い `resource_name` を使用 |
|
|
1327
|
+
| ターゲットが unhealthy | ヘルスチェックパスが不正 | `/{パス}/{ヘルスチェック}` に設定 |
|
|
1328
|
+
| コンテナが 404 を返す | コンテキストパス未設定 | `SERVER_SERVLET_CONTEXT_PATH` を設定 |
|
|
1329
|
+
| ポートの不一致 | 環境変数 `PORT` が未設定 | ECS タスク定義で `PORT` を明示的に設定 |
|
|
1330
|
+
| 環境変数変更が反映されない | `ignore_changes` 設定 | AWS CLI でタスク定義の新リビジョンを登録し `--force-new-deployment` |
|
|
1331
|
+
|
|
1332
|
+
### RDS 関連
|
|
1333
|
+
|
|
1334
|
+
| 症状 | 原因 | 対処 |
|
|
1335
|
+
|------|------|------|
|
|
1336
|
+
| 接続できない | セキュリティグループ設定 | プライベートサブネットからのアクセスを許可 |
|
|
1337
|
+
| 認証エラー | SSM パラメータの値が不正 | パラメータストアの値を確認 |
|
|
1338
|
+
| `terraform destroy` が遅い | 削除保護が有効 | `deletion_protection = false` にしてから再実行 |
|
|
1339
|
+
| Blue/Green 後に差異 | コンソールで手動実行 | `terraform apply -refresh-only` で State を同期 |
|
|
1340
|
+
| Blue/Green 作成失敗 | PK なしテーブルが存在 | 全テーブルに Primary Key を追加 |
|
|
1341
|
+
|
|
1342
|
+
### ネットワーク関連
|
|
1343
|
+
|
|
1344
|
+
| 症状 | 原因 | 対処 |
|
|
1345
|
+
|------|------|------|
|
|
1346
|
+
| プライベートサブネットから外部接続不可 | NAT Gateway 未設定 | VPC 設定を確認 |
|
|
1347
|
+
| 踏み台サーバーに SSH 接続できない | セキュリティグループ | 自分の IP からのインバウンドを許可 |
|
|
1348
|
+
|
|
1349
|
+
---
|
|
1350
|
+
|
|
1351
|
+
## セキュリティチェックリスト
|
|
1352
|
+
|
|
1353
|
+
- [ ] `secret.tfvars` が `.gitignore` に追加されている
|
|
1354
|
+
- [ ] DB 認証情報が SSM パラメータストアで管理されている
|
|
1355
|
+
- [ ] RDS がプライベートサブネットに配置されている
|
|
1356
|
+
- [ ] 踏み台サーバーの SSH アクセスが IP 制限されている
|
|
1357
|
+
- [ ] OIDC 認証で GitHub Actions と AWS が連携している
|
|
1358
|
+
- [ ] S3 バケットの暗号化が有効になっている
|
|
1359
|
+
- [ ] DynamoDB の状態ロックが設定されている
|
|
1360
|
+
|
|
1361
|
+
---
|
|
1362
|
+
|
|
1363
|
+
## 関連ドキュメント
|
|
1364
|
+
|
|
1365
|
+
- {関連ドキュメント 1}
|
|
1366
|
+
- {関連ドキュメント 2}
|