
Terraformã§æ¬çªç°å¢ãå£ãããã3ã€ã®ãã¹ãšãä»ã§ã䜿ã£ãŠãã鲿¢ç
Terraformã¯æãããšããæèŠã¯æ£ãã
Terraformã䜿ãå§ããããããã³ãŒãã§ã€ã³ãã©ã管çã§ããããšããäœéšãåçŽã«æ¥œããã£ãã
EC2ã1è¡ã§å¢ãããŠãVPCãã³ãŒããšããŠä¿åã§ããã
æåã¯ã¹ããŒãžã³ã°ç°å¢ã§ããè§Šããªãã£ãã®ã§ããã¹ããŠããããäžå apply ããã°ããããã§æžãã§ããã
æ¬çªç°å¢ã«åããŠè§Šã£ãã®ã¯å
¥ç€Ÿãã4ã¶æåŸã
å
茩ããããããæ¬çªã«é©çšããŠã¿ãŠããšèšããã軜ãæãã®ã¿ã¹ã¯ã§ãã»ãŒæ»ã«ãããã
çµæçã«ã¯è¢«å®³ãæå°éã«æãããããããã®åŸã2åã»ã©ããã°ãã£ãããšæãå Žé¢ããã£ãã
èš3åã®çµéšããåŸã鲿¢çããå®éã«ä»ã䜿ãç¶ããŠãã圢ã§ãŸãšããã
ãã¹1: plan ã®åºåãã¡ãããšèªãŸãªãã£ã
æåã®ãã¹ã¯å
žåçãªãã€ã ã£ãã
EC2ã®ã»ãã¥ãªãã£ã°ã«ãŒãã«ã«ãŒã«ã远å ããã ãã®ã¯ãããplan ã®åºåããã£ãšçºããŠããŸãåé¡ãªãããããš apply ããããæ¢åã®ã«ãŒã«ãå
šéšæ¶ããã
åå 㯠aws_security_group_rule ãš aws_security_group ã®æ··åšã ã£ãã
æ¢åã®ãªãœãŒã¹ã¯ ingress ãããã¯ã security group å
ã«çŽæžãããŠããã®ã«ãç§ã远å ããã®ã¯ aws_security_group_rule ãªãœãŒã¹ã
Terraform ã¯ãæ¢åã® ingress ã«ãŒã«ã¯ç®¡ç察象å€ã«ãªã£ãããšå€æããŠãdestroy ããããšããŠããã
ããã plan ã®åºåã«æžããŠãã£ãã®ã«ãç§ã¯ + ãå¢ããããšãã確èªããŠããªãã£ãã
# terraform plan ã®åºåïŒäžéšïŒ
-/+ aws_security_group.main (replaced due to conflict)
ãã»ingress { ... } # â ããã«æ°ã¥ããªãã£ã
+ aws_security_group_rule.new_rule幞ããapply çŽåŸã«æ¥ç¶ãåããããšã§ã¢ã©ãŒããé£ãã§ã5å以å
ã«ããŒã«ããã¯ã§ããã
ã§ãããã¯éãè¯ãã£ãã ãã§ãã¢ã©ãŒãã®éŸå€ãããå°ãçããã°æ°ã¥ãã®ã«30åããã£ãŠããã
plan ã®èªã¿æ¹ã§åŠãã ããšãäžã€ããã-/+ïŒçœ®ãæãïŒãš -ïŒåé€ïŒã®è¡ã ããå
ã«å
šéšç¢ºèªããããšããã«ãŒã«ãèªåã«èª²ãããã«ããã
å¢ãã倿Žã¯åºæ¬çã«å®å
šã ããæ¶ãã倿Žã¯äœããå£ããå¯èœæ§ãããã
plan ã100è¡ãã£ãŠããæåã« grep ã§ - ãæ¢ãã ãã§8å²ã®ãªã¹ã¯ã¯æ€åºã§ããã
# plan ã®åé€ã»çœ®ãæãã ãå
ã«ç¢ºèªããã¯ã³ã©ã€ããŒ
terraform plan -out=tfplan 2>&1 | grep -E '^\s*([-]|\-/\+)' | head -50ãããç¿æ
£ã«ããŠãããæ³å®å€ã®åé€ã«äºåã«æ°ã¥ããããã«ãªã£ãã
plan ãæµããŠãã apply ãŸã§2åãããããã«ãªã£ããããã®ãããã®æéã¯æã䟡å€ãããã
ãã¹2: tfstate ãæåã§è§Šã£ã
2åç®ã®ãã¹ã¯ãã¹ããŒãžã³ã°ãšæ¬çªã§ãªãœãŒã¹ãåé¢ãããªãã¡ã¯ã¿ãªã³ã°äžã«èµ·ããã
æ¢åã® tfstate ã«å
¥ã£ãŠãããªãœãŒã¹ãå¥ã® module ã«ç§»ããããŠãterraform state mv ã³ãã³ãã䜿ã£ãã
æé æžéãã«é²ããŠããã€ããããã³ãã³ããäžã€ééããŠæ¬çªã®ãªãœãŒã¹ã state ããæ¶ããã
Terraform ã® state ãããªãœãŒã¹ãæ¶ããŠããå®éã®ã€ã³ãã©ã¯æ¶ããªãã
ãã ããTerraform ã®ç®¡çå€ã«ãªãããšããããšãåé¡ã ã£ãã
次㮠apply ã§ Terraform ãããã®ãªãœãŒã¹ã¯ååšããªãããäœãããšå€æããŠãæ¢åã® RDS ã€ã³ã¹ã¿ã³ã¹ãšååã®ãªãœãŒã¹ãäœãããšããã
åœç¶ãšã©ãŒã«ãªã£ãããèšå®ã«ãã£ãŠã¯æ¢åãªãœãŒã¹ãäžæžãããããšããåäœãããåŸãã
çŠã£ãã
# ééããæäœïŒãã£ãŠããŸã£ãããšïŒ
terraform state mv module.old.aws_db_instance.main module.new.aws_db_instance.main
# moduleåã1æåééããŠå¥ã®ãªãœãŒã¹ãæäœããŠããŸã£ã
# æ£ããæé
terraform state list | grep db_instance # ãŸãäžèЧã§ç¢ºèª
terraform state show module.old.aws_db_instance.main # 察象ãªãœãŒã¹ã®è©³çްãç®èŠããŠãã mvãã®çµéšãããtfstate ãæäœããåã«ã¯å¿
ã state list ãš state show ã§å¯Ÿè±¡ãç®èŠç¢ºèªããããã«ããã
ã³ãã³ãããã®ãŸãŸå®è¡ããã®ã§ã¯ãªãã確èªã¹ãããã1ã€æãã
ãããšãtfstate 㯠S3 + DynamoDB ã§ãªã¢ãŒã管çããã®ãåæã®ãããžã§ã¯ããå€ããšæãããæäœåã«æåã§ããã¯ã¢ãããåãç¿æ
£ãã€ããã
S3 ã®ããŒãžã§ãã³ã°ã§èªåçã«æ®ããšã¯ããããèªåãæãå ããåã®ç¶æ
ããæç€ºçã«ä¿åããŠãããšã倱æããæã«æ»ããããã
ãã®ã²ãšæéãçããªãããšããã®ã3幎çµã£ãä»ã§ãå®ã£ãŠããã«ãŒã«ã ã
ãã¹3: workspace ãééããç¶æ ã§ destroy ãã
3åç®ãäžçªãã€ããšããã
terraform workspace ã䜿ã£ãŠ staging ãš production ãåããŠãããããžã§ã¯ãã§ãcleanup äœæ¥ãšããŠãããªããªã£ããªãœãŒã¹ã destroy ããããšããã
workspace ã®ç¢ºèªãæ ã£ããŸãŸ destroy ãå®è¡ããŠãéäžã§æ°ã¥ããŠæ¢ããã
# ãã£ãŠããŸã£ãæäœã®åçŸ
terraform workspace list
# * default
# staging
# production
terraform workspace select staging # â éžãã ã€ãã
# ïŒå®éã«ã¯éžæã³ãã³ãã倱æããŠããïŒ
terraform destroy -target=aws_lambda_function.batch_job
# production ã§å®è¡ããŠããŸã£ãLambda 颿°1ã€ãæ¬çªããæ¶ããã
ã¡ããã©ãããåŠçã®å®è¡ã¿ã€ãã³ã°ãšãããŠããã®ã§è¢«å®³ã¯ãªãã£ããã5åãããŠããã確å®ã«ã¢ã©ãŒãã鳎ã£ãŠããã
destroy ã³ãã³ãã¯ä»ã§ã¯å¿
ã terraform workspace show ã§ã¯ãŒã¯ã¹ããŒã¹ã衚瀺ãããŠããå®è¡ããããã«ããŠããã
ã³ãã³ã1è¡ã§æžãã®ã§çç¥ããã¡ã ãããã®ç¢ºèªã Makefile ã«çµã¿èŸŒãã§ã«ãŒã«åããã
3ã€ã®ãã¹ã«å ±éããŠãã鲿¢ç
æ¯ãè¿ããšã3ã€ã®ãã¹å
šéšã«å
±éããåé¡ãããã
ãæãåããåã®ç¢ºèªãè¶³ããªãã£ãããšããäžç¹ã«ã€ããã
plan ãèªããstate ã確èªãããworkspace ã衚瀺ããã
ã©ããæéã¯10ç§ä»¥å
ãªã®ã«ããããã£ãŠãããšããæ
¢å¿ã§çç¥ããŠããã
ä»ããŒã ã§äœ¿ã£ãŠãã Makefile ã®äžéšãèŒããŠããã
apply ã destroy ã®åã«ç¢ºèªã¹ãããã匷å¶ããããã«ããŠããã
# MakefileïŒäžéšæç²ïŒ
.PHONY: plan apply destroy
plan:
@echo "Current workspace: $$(terraform workspace show)"
terraform plan -out=tfplan
apply: plan
@echo "--- åé€ã»çœ®ãæã察象ã®ãªãœãŒã¹ ---"
terraform show -json tfplan | jq '.resource_changes[] | select(.change.actions[] | contains("delete","replace")) | .address'
@read -p "äžèšã確èªããŸãããç¶ããŸããïŒ [y/N]: " confirm && [ "$$confirm" = "y" ]
terraform apply tfplan
destroy:
@echo "Current workspace: $$(terraform workspace show)"
@read -p "Workspaceã確èªããŸãããdestroyãç¶ããŸããïŒ [y/N]: " confirm && [ "$$confirm" = "y" ]
terraform destroyããã«å ããŠãæ¬çªãžã® apply 㯠CI/CD çµç±ã«éå®ããŠãæå
ããã®çŽæ¥ apply ãçŠæ¢ããã«ãŒã«ãå°å
¥ããã
GitHub Actions ã§ PR ãããŒãžããããèªåã§ plan ãèµ°ãããã¬ãã¥ãŒãééãããã®ã ã apply ãã圢ã«ããŠããã
ããã§ããã£ããæ¬çªã«æå apply ããããã¹ã¯ã»ãŒãŒãã«ãªã£ãã
ããŒã ã3äººã®æç¹ã§ãã®ä»çµã¿ãå
¥ããããæ©ãããããšã¯ãªãã£ãã
Terraform ã®æãã«æ £ããªãã»ãããã
æ¬çª Terraform ãè§Šãç¶ããŠæããã®ã¯ãæ
£ããŠãããããäžçªå±ãªããšããããšã ã
æäœãæã«ãªããã§ããŠã確èªã¹ããããçç¥ããããªãã
ãã®æ²¹æãäžçªãªã¹ã¯ãé«ããã
3ã€ã®ãã¹ã¯å
šéšãããã®çšåºŠãªã倧äžå€«ããšããæèŠã§ç¢ºèªãã¹ããããããšãã«èµ·ããã
ä»ã§ãæ¬çªã® apply åã«ã¯1åã ãç«ã¡æ¢ãŸãæéãåãããã«ããŠããã
plan ã®åé€è¡ã確èªããŠãworkspace ã確èªããŠãã¿ãŒã²ããã®ãªãœãŒã¹ãæ³å®éããã確èªããã
ãã£ãããã ãã§ããããŸã§ãã¹ã¯åçŸããŠããªãã
å ·äœçã«ããããšããŸãšãããšã
plan åŸã«åé€ã»çœ®ãæãè¡ã ãå ã«ç¢ºèªãã
tfstate æäœå㯠list ãš show ã§å¯Ÿè±¡ãç®èŠç¢ºèªãã
destroy å㯠workspace show ãå¿ ãå®è¡ãã
æ¬çª apply 㯠CI/CD çµç±ã«éå®ãã
ãã®4ã€ãå®ãã ãã§ãå£ãããã3åã®ãã¡2åã¯ç¢ºå®ã«é²ããŠããã
æ®ã1å㯠CI/CD ãå°å
¥ããåã ã£ãã®ã§ãä»ãªãçºçããªãã¯ãã ã
Terraform ã¯åŒ·åãªããŒã«ã ãããããäœ¿ãæ¹ããå
ã«ãæ¢ãŸãæ¹ããåŠã¶ã¹ãã ãšæã£ãŠããã
æ
ãŠãç¶æ
ã§ã® apply ãš destroy ãã€ã³ã·ãã³ãã®9å²ãäœãããšããäœæãããã
次ã«ã³ãã³ããæã€åã«ããŸã plan ãš workspace show ãå®è¡ããã
ããã ãã§æ¬çªãå®ãã確çã¯ããªãäžããã