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