ã«ãŒããif ã¹ããŒãã¡ã³ãããããã€ã¡ã³ãææ³ã«é¢é£ããèœãšãç©ŽããTerraform å
šè¬ã«åœ±é¿ãäžããããäžè¬çãªåé¡ãªã©ãããã€ãã®èœãšãç©Žã«çŠç¹ãåœãŠãŠã¿ãŸãããã
- count ãã©ã¡ãŒã¿ãš for_each ãã©ã¡ãŒã¿ã«ã¯å¶éããããŸãã
- ããŠã³ã¿ã€ã ãŒãã®å°å ¥ãå¶éããã
- ããšãè¯ãèšç»ã§ãã£ãŠã倱æããå¯èœæ§ã¯ãããŸãã
- ãªãã¡ã¯ã¿ãªã³ã°ã«ã¯èœãšãç©Žãããå¯èœæ§ããããŸãã
- é 延ãããäžè²«æ§ã¯ãé 延ãšäžèŽããŸãã
count ããã³ for_each ãã©ã¡ãŒã¿ã«ã¯å¶éããããŸã
ãã®ç« ã®äŸã§ã¯ãã«ãŒããšæ¡ä»¶ããžãã¯ã§ count ãã©ã¡ãŒã¿ãŒãš for_each åŒãåºç¯å²ã«äœ¿çšããŠããŸãã ããã©ãŒãã³ã¹ã¯è¯å¥œã§ããã泚æããªããã°ãªããªãéèŠãªå¶éã XNUMX ã€ãããŸãã
- Count ãš for_each ã¯ãªãœãŒã¹åºåå€æ°ãåç §ã§ããŸããã
- count ãš for_each ã¯ã¢ãžã¥ãŒã«æ§æã§ã¯äœ¿çšã§ããŸããã
count ãš for_each ã¯ãªãœãŒã¹åºåå€æ°ãåç §ã§ããŸãã
è€æ°ã® EC2 ãµãŒããŒããããã€ããå¿ èŠãããããäœããã®çç±ã§ ASG ã䜿çšããããªããšæ³åããŠãã ããã ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
resource "aws_instance" "example_1" {
count = 3
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
äžã€ãã€èŠãŠãããŸãããã
count ãã©ã¡ãŒã¿ã¯éçãªå€ã«èšå®ãããŠããããããã®ã³ãŒãã¯åé¡ãªãåäœããŸããapply ã³ãã³ããå®è¡ãããšã2 ã€ã® EC2 ãµãŒããŒãäœæãããŸãã ããããçŸåšã® AWS ãªãŒãžã§ã³å ã®åã¢ãã€ã©ããªãã£ãŒãŸãŒã³ (AZ) ã« XNUMX ã€ã®ãµãŒããŒããããã€ãããå Žåã¯ã©ãããã°ããã§ãããã? ã³ãŒã㧠aws_availability_zones ããŒã¿ ãœãŒã¹ãããŸãŒã³ã®ãªã¹ããããŒãããåãŸãŒã³ãã«ãŒãããcount ãã©ã¡ãŒã¿ãŒãšé åã€ã³ããã¯ã¹ ã¢ã¯ã»ã¹ã䜿çšããŠãã®äžã« ECXNUMX ãµãŒããŒãäœæã§ããŸãã
resource "aws_instance" "example_2" {
count = length(data.aws_availability_zones.all.names)
availability_zone = data.aws_availability_zones.all.names[count.index]
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
data "aws_availability_zones" "all" {}
count ãã©ã¡ãŒã¿ãŒã¯åé¡ãªãããŒã¿ ãœãŒã¹ãåç §ã§ããããããã®ã³ãŒããæ£åžžã«æ©èœããŸãã ããããäœæããå¿ èŠããããµãŒããŒã®æ°ããªãœãŒã¹ã®åºåã«äŸåããå Žåã¯ã©ããªãã§ãããã? ããã瀺ãæãç°¡åãªæ¹æ³ã¯ãrandom_integer ãªãœãŒã¹ã䜿çšããããšã§ããããã¯ãååã瀺ãããã«ãã©ã³ãã ãªæŽæ°ãè¿ããŸãã
resource "random_integer" "num_instances" {
min = 1
max = 3
}
ãã®ã³ãŒã㯠1 ãã 3 ãŸã§ã®ä¹±æ°ãçæããŸãããã®ãªãœãŒã¹ã®åºåã aws_instance ãªãœãŒã¹ã® count ãã©ã¡ãŒã¿ãŒã§äœ¿çšããããšãããšã©ããªãããèŠãŠã¿ãŸãããã
resource "aws_instance" "example_3" {
count = random_integer.num_instances.result
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
ãã®ã³ãŒã㧠terraform plan ãå®è¡ãããšã次ã®ãšã©ãŒãçºçããŸãã
Error: Invalid count argument
on main.tf line 30, in resource "aws_instance" "example_3":
30: count = random_integer.num_instances.result
The "count" value depends on resource attributes that cannot be determined until apply, so Terraform cannot predict how many instances will be created. To work around this, use the -target argument to first apply only the resources that the count depends on.
Terraform ã§ã¯ããªãœãŒã¹ãäœæãŸãã¯å€æŽãããåã®èšç»æ®µé㧠count ãš for_each ãèšç®ããå¿ èŠããããŸãã ããã¯ãcount ãš for_each ã¯ãªãã©ã«ãå€æ°ãããŒã¿ ãœãŒã¹ãããã«ã¯ãªãœãŒã¹ ãªã¹ã (ã¹ã±ãžã¥ãŒã«æã«é·ãã決å®ã§ããéã) ãåç §ã§ããããèšç®ããããªãœãŒã¹åºåå€æ°ã¯åç §ã§ããªãããšãæå³ããŸãã
count ãš for_each ã¯ã¢ãžã¥ãŒã«æ§æã§ã¯äœ¿çšã§ããŸãã
ãã€ããã¢ãžã¥ãŒã«æ§æã« count ãã©ã¡ãŒã¿ãŒãè¿œå ããããªããããããŸããã
module "count_example" {
source = "../../../../modules/services/webserver-cluster"
count = 3
cluster_name = "terraform-up-and-running-example"
server_port = 8080
instance_type = "t2.micro"
}
ãã®ã³ãŒãã¯ãã¢ãžã¥ãŒã«å 㧠count ã䜿çšããŠãwebserver-cluster ãªãœãŒã¹ã®ã³ããŒã 0 ã€äœæããããšããŸãã ãŸãã¯ãcount ãã©ã¡ãŒã¿ãŒã XNUMX ã«èšå®ããŠãããŒã«æ¡ä»¶ã«åºã¥ããŠã¢ãžã¥ãŒã«ã®æ¥ç¶ããªãã·ã§ã³ã«ããããšãã§ããŸããããã¯åççãªã³ãŒãã®ããã«èŠãããããããŸããããterraform plan ãå®è¡ãããšæ¬¡ã®ãšã©ãŒãçºçããŸãã
Error: Reserved argument name in module block
on main.tf line 13, in module "count_example":
13: count = 3
The name "count" is reserved for use in a future version of Terraform.
æ®å¿µãªãããTerraform 0.12.6 ã®æç¹ã§ã¯ãã¢ãžã¥ãŒã« ãªãœãŒã¹ã§ã® count ãŸã㯠for_each ã®äœ¿çšã¯ãµããŒããããŠããŸããã Terraform 0.12 ãªãªãŒã¹ ããŒã (http://bit.ly/3257bv4) ã«ãããšãHashiCorp ã¯å°æ¥ãã®æ©èœãè¿œå ããäºå®ã§ããããããã®æ¬ãèªãã ææã«ãã£ãŠã¯ããã§ã«å©çšå¯èœã«ãªã£ãŠããå¯èœæ§ããããŸãã 確å®ã«èª¿ã¹ãã«ã¯ã
ãŒãããŠã³ã¿ã€ã å±éã®å¶éäºé
create_before_destroy ãããã¯ã ASG ãšçµã¿åãããŠäœ¿çšââããããšã¯ãããŠã³ã¿ã€ã ããŒãã«ãããã€ããããã®åªãããœãªã¥ãŒã·ã§ã³ã§ãããã ããèªåã¹ã±ãŒãªã³ã° ã«ãŒã«ã¯ãµããŒããããŠããªããšãã XNUMX ã€ã®æ³šæç¹ããããŸãã ããæ£ç¢ºã«èšãã°ãããã«ããããããã€ããšã« ASG ãµã€ãºã min_size ã«ãªã»ãããããŸããããã¯ãèªåã¹ã±ãŒãªã³ã° ã«ãŒã«ã䜿çšããŠå®è¡äžã®ãµãŒããŒã®æ°ãå¢ãããŠããå Žåã«åé¡ã«ãªãå¯èœæ§ããããŸãã
ããšãã°ãwebserver-cluster ã¢ãžã¥ãŒã«ã«ã¯ aws_autoscaling_schedule ãªãœãŒã¹ã®ãã¢ãå«ãŸããŠãããåå 9 æã«ã¯ã©ã¹ã¿ãŒå ã®ãµãŒããŒã®æ°ã 11 å°ãã 9 å°ã«å¢å ããŸãã ããšãã°åå XNUMX æã«ãããã€ãããšãæ°ãã ASG 㯠XNUMX å°ã§ã¯ãªã XNUMX å°ã®ãµãŒããŒã§èµ·åããç¿æ¥ã®åå XNUMX æãŸã§ãã®ãŸãŸã®ç¶æ ã«ãªããŸãã
ãã®å¶éã¯ããã€ãã®æ¹æ³ã§åé¿ã§ããŸãã
- aws_autoscaling_schedule ã®ç¹°ãè¿ããã©ã¡ãŒã¿ã 0 9 * * * (ãåå 9 æã«å®è¡ã) ãã 0-59 9-17 * * * (ãåå 9 æããååŸ 5 æãŸã§æ¯åå®è¡ã) ã®ãããªå€ã«å€æŽããŸãã ASG ã«ãã§ã« XNUMX å°ã®ãµãŒããŒãããå Žåããã®èªåã¹ã±ãŒãªã³ã° ã«ãŒã«ãå床å®è¡ããŠãäœãå€æŽãããŸããããããæãŸããããšã§ãã ãã ããASG ãæè¿ãããã€ãããã°ããã®å Žåããã®ã«ãŒã«ã«ãããæ倧 XNUMX å以å ã«ãµãŒããŒã®æ°ã XNUMX ã«éããããšãä¿èšŒãããŸãã ããã¯å®å šã«ãšã¬ã¬ã³ããªã¢ãããŒãã§ã¯ãªããXNUMX å°ã®ãµãŒããŒãã XNUMX å°ã®ãµãŒããŒãžã®å€§å¹ ãªå€æŽããã®éããŠãŒã¶ãŒã«åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
- AWS API ã䜿çšã㊠ASG å ã®ã¢ã¯ãã£ããªãµãŒããŒã®æ°ã決å®ããã«ã¹ã¿ã ã¹ã¯ãªãããäœæããå€éšããŒã¿ ãœãŒã¹ã䜿çšããŠãããåŒã³åºã (249 ããŒãžã®ãå€éšããŒã¿ ãœãŒã¹ããåç §)ãASG ã®desired_capacity ãã©ã¡ãŒã¿ããã«ãã£ãŠè¿ãããå€ã«èšå®ããŸããã¹ã¯ãªããã ããããããšã§ãæ°ãã ASG ã€ã³ã¹ã¿ã³ã¹ã¯åžžã«æ¢åã® Terraform ã³ãŒããšåã容éã§å®è¡ããããããä¿å®ãããå°é£ã«ãªããŸãã
ãã¡ãããTerraform ã«ã¯ããŠã³ã¿ã€ã ãªãã®ãããã€ã¡ã³ãã®ãµããŒããçµã¿èŸŒãŸããŠããããšãçæ³çã§ããã2019 幎 XNUMX æã®æç¹ã§ãHashiCorp ããŒã ã«ã¯ãã®æ©èœãè¿œå ããèšç»ã¯ãããŸããã§ãã (
æ£ããèšç»ãå®è¡ãããªãå¯èœæ§ããã
plan ã³ãã³ãã¯å®å šã«æ£ãããããã€ã¡ã³ã ãã©ã³ãçæããŠããapply ã³ãã³ãããšã©ãŒãè¿ãå ŽåããããŸãã ããšãã°ã第 2 ç« ã§äœæãã IAM ãŠãŒã¶ãŒã«äœ¿çšããã®ãšåãåå㧠aws_iam_user ãªãœãŒã¹ãè¿œå ããŠã¿ãŸãã
resource "aws_iam_user" "existing_user" {
# ÐПЎÑÑавÑÑе ÑÑЎа ÐžÐŒÑ Ñже ÑÑÑеÑÑвÑÑÑегП пПлÑзПваÑÐµÐ»Ñ IAM,
# ÑÑÐŸÐ±Ñ Ð¿ÐŸÐ¿ÑакÑОкПваÑÑÑÑ Ð² ОÑпПлÑзПваМОО ÐºÐŸÐŒÐ°ÐœÐŽÑ terraform import
name = "yevgeniy.brikman"
}
ãã㧠plan ã³ãã³ããå®è¡ãããšãTerraform ã¯äžèŠåŠ¥åœãªãããã€ã¡ã³ã ãã©ã³ãåºåããŸãã
Terraform will perform the following actions:
# aws_iam_user.existing_user will be created
+ resource "aws_iam_user" "existing_user" {
+ arn = (known after apply)
+ force_destroy = false
+ id = (known after apply)
+ name = "yevgeniy.brikman"
+ path = "/"
+ unique_id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
apply ã³ãã³ããå®è¡ãããšã次ã®ãšã©ãŒã衚瀺ãããŸãã
Error: Error creating IAM User yevgeniy.brikman: EntityAlreadyExists:
User with name yevgeniy.brikman already exists.
on main.tf line 10, in resource "aws_iam_user" "existing_user":
10: resource "aws_iam_user" "existing_user" {
ãã¡ãããåé¡ã¯ããã®ååã® IAM ãŠãŒã¶ãŒããã§ã«ååšããŠããããšã§ãã ãããŠããã㯠IAM ãŠãŒã¶ãŒã ãã§ãªããã»ãŒãã¹ãŠã®ãªãœãŒã¹ã§çºçããå¯èœæ§ããããŸãã 誰ãããã®ãªãœãŒã¹ãæåãŸãã¯ã³ãã³ã ã©ã€ã³ã䜿çšããŠäœæããå¯èœæ§ããããŸããããããã«ãããID ãäžèŽãããšç«¶åãçºçããŸãã ãã®ãšã©ãŒã«ã¯ããŸããŸãªããªãšãŒã·ã§ã³ããããTerraform ãåããŠäœ¿çšãã人ãé©ãããããšããããããŸãã
éèŠãªç¹ã¯ãterraform plan ã³ãã³ãã¯ãTerraform ç¶æ ãã¡ã€ã«ã§æå®ãããŠãããªãœãŒã¹ã®ã¿ãèæ ®ãããšããããšã§ãã ãªãœãŒã¹ãä»ã®æ¹æ³ (ããšãã°ãAWS ã³ã³ãœãŒã«å ã§æåã§ã¯ãªãã¯ãããªã©) ã§äœæãããå ŽåããªãœãŒã¹ã¯ç¶æ ãã¡ã€ã«ã«ä¿åãããªããããTerraform 㯠plan ã³ãã³ããå®è¡ãããšãã«ããããèæ ®ããŸããã ãã®çµæãäžèŠæ£ããããã«èŠããèšç»ã倱æã«çµããããšããããŸãã
ãã®ããšããåŠã¹ãããšã XNUMX ã€ãããŸãã
- ãã§ã« Terraform ã®äœ¿çšãéå§ããŠããå Žåã¯ãä»ã®ãã®ã䜿çšããªãã§ãã ããã ã€ã³ãã©ã¹ãã©ã¯ãã£ã®äžéšã Terraform ã䜿çšããŠç®¡çãããŠããå Žåãæåã§å€æŽããããšã¯ã§ããªããªããŸãã ããããªããšãTerraform ã§å¥åŠãªãšã©ãŒãçºçããå±éºãããã ãã§ãªããã³ãŒããã€ã³ãã©ã¹ãã©ã¯ãã£ãæ£ç¢ºã«è¡šçŸã§ããªããªããããIaC ã®å©ç¹ã®å€ããç¡å¹ã«ãªããŸãã
- ãã§ã«ã€ã³ãã©ã¹ãã©ã¯ãã£ãããå Žåã¯ãimport ã³ãã³ãã䜿çšããŸãã æ¢åã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã§ Terraform ã®äœ¿çšãéå§ããå Žåã¯ãterraform import ã³ãã³ãã䜿çšããŠç¶æ
ãã¡ã€ã«ã«è¿œå ã§ããŸãã ãã®ããã«ããŠãTerraform ã¯ã©ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã管çããå¿
èŠãããããèªèããŸãã import ã³ãã³ã㯠2 ã€ã®åŒæ°ãåããŸãã 190 ã€ç®ã¯ãæ§æãã¡ã€ã«å
ã®ãªãœãŒã¹ ã¢ãã¬ã¹ã§ãã ããã§ã®æ§æã¯ãªãœãŒã¹ ãªã³ã¯ã®å Žåãšåãã§ã: _ã (aws_iam_user.existing_user ãªã©)ã 22 çªç®ã®åŒæ°ã¯ãã€ã³ããŒããããªãœãŒã¹ã® ID ã§ãã ãªãœãŒã¹ ID aws_iam_user ããŠãŒã¶ãŒå (yevgeniy.brikman ãªã©)ããªãœãŒã¹ ID aws_instance ã EC5 ãµãŒã㌠ID (i-XNUMXeXNUMXeXNUMX ãªã©) ã§ãããšããŸãã ãªãœãŒã¹ã®ã€ã³ããŒãæ¹æ³ã¯éåžžãããŒãžã®äžéšã«ããããã¥ã¡ã³ãã«ç€ºãããŠããŸãã
以äžã¯ã第 2 ç« ã§ Terraform æ§æã«è¿œå ãã aws_iam_user ãªãœãŒã¹ãš IAM ãŠãŒã¶ãŒãåæããã€ã³ããŒã ã³ãã³ãã§ã (ãã¡ãããyevgeniy.brikman ã¯èªåã®ååã«çœ®ãæããŠãã ãã)ã
$ terraform import aws_iam_user.existing_user yevgeniy.brikman
Terraform 㯠AWS API ãåŒã³åºã㊠IAM ãŠãŒã¶ãŒãæ€çŽ¢ãããã®ãŠãŒã¶ãŒãš Terraform èšå®å ã® aws_iam_user.existing_user ãªãœãŒã¹ãšã®éã«ç¶æ ãã¡ã€ã«ã®é¢é£ä»ããäœæããŸãã ä»åŸãplan ã³ãã³ããå®è¡ãããšãTerraform 㯠IAM ãŠãŒã¶ãŒããã§ã«ååšããããšãèªèããå床äœæããããšããªããªããŸãã
Terraform ã«ã€ã³ããŒãããããªãœãŒã¹ããã§ã«ããããããå Žåãã³ãŒããæåã§èšè¿°ããŠäžåºŠã« 4 ã€ãã€ã€ã³ããŒãããã®ã¯é¢åãªå Žåãããããšã«æ³šæããŠãã ããã ãããã£ãŠãAWS ã¢ã«ãŠã³ãããã³ãŒããšç¶æ ãèªåçã«ã€ã³ããŒãã§ãã Terraforming (http://terraforming.dtanXNUMX.net/) ã®ãããªããŒã«ãæ€èšãã䟡å€ããããŸãã
ãªãã¡ã¯ã¿ãªã³ã°ã«ã¯èœãšãç©Žãããå¯èœæ§ããã
ãªãã¡ã¯ã¿ãªã³ã° ããã¯ãå€éšã®åäœãå€æŽããã«ãã³ãŒãã®å éšæ§é ãå€æŽããããã°ã©ãã³ã°ã®äžè¬çãªææ³ã§ãã ããã¯ãã³ãŒããããæ確ãæŽç¶ãšããä¿å®ããããããããã§ãã ãªãã¡ã¯ã¿ãªã³ã°ã¯å®æçã«äœ¿çšããå¿ èŠã®ããäžå¯æ¬ ãªãã¯ããã¯ã§ãã ããããTerraform ããã®ä»ã® IaC ããŒã«ã«é¢ããŠã¯ãã³ãŒãéšåã®ãå€éšåäœããäœãæå³ãããã«ã€ããŠçŽ°å¿ã®æ³šæãæãå¿ èŠããããããããªããšãäºæããªãåé¡ãçºçããŸãã
ããšãã°ãäžè¬çãªã¿ã€ãã®ãªãã¡ã¯ã¿ãªã³ã°ã¯ãå€æ°ãŸãã¯é¢æ°ã®ååãããããããããååã«çœ®ãæããããšã§ãã å€ãã® IDE ã«ã¯ãªãã¡ã¯ã¿ãªã³ã°ã®ãµããŒããçµã¿èŸŒãŸããŠããããããžã§ã¯ãå šäœã§å€æ°ãé¢æ°ã®ååãèªåçã«å€æŽã§ããŸãã æ±çšããã°ã©ãã³ã°èšèªã§ã¯ãããã¯èããããªããããªäºçŽ°ãªæé ã§ãããTerraform ã§ã¯ããã«çŽ°å¿ã®æ³šæãæãå¿ èŠããããããããªããšæ©èœåæ¢ãçºçããå¯èœæ§ããããŸãã
ããšãã°ãwebserver-cluster ã¢ãžã¥ãŒã«ã«ã¯å ¥åå€æ° cluster_name ããããŸãã
variable "cluster_name" { description = "The name to use for all the cluster resources" type = string }
ãã®ã¢ãžã¥ãŒã«ã䜿çšã㊠foo ãšãããã€ã¯ããµãŒãã¹ããããã€ãå§ãããšæ³åããŠãã ããã åŸã§ããµãŒãã¹ã®ååã bar ã«å€æŽããããšããŸãã ãã®å€æŽã¯äºçŽ°ãªããšã®ããã«æãããããããŸããããå®éã«ã¯ãµãŒãã¹ã®äžæãåŒãèµ·ããå¯èœæ§ããããŸãã
å®éã«ã¯ãwebserver-cluster ã¢ãžã¥ãŒã«ã¯ãXNUMX ã€ã®ã»ãã¥ãªã㣠ã°ã«ãŒããš ALB ã® name ãã©ã¡ãŒã¿ãŒãå«ããããã€ãã®ãªãœãŒã¹ã§ã¯ã©ã¹ã¿ãŒåå€æ°ã䜿çšããŸãã
resource "aws_lb" "example" { name = var.cluster_name load_balancer_type = "application" subnets = data.aws_subnet_ids.default.ids security_groups = [aws_security_group.alb.id] }
ãªãœãŒã¹ã® name ãã©ã¡ãŒã¿ãŒãå€æŽãããšãTerraform ã¯ãã®ãªãœãŒã¹ã®å€ãããŒãžã§ã³ãåé€ãã代ããã«æ°ããããŒãžã§ã³ãäœæããŸãã ãã ãããã®ãªãœãŒã¹ã ALB ã§ããå Žåããã®ãªãœãŒã¹ãåé€ããŠããæ°ããããŒãžã§ã³ãããŠã³ããŒããããŸã§ã®éã«ããã©ãã£ãã¯ã Web ãµãŒããŒã«ãªãã€ã¬ã¯ãããã¡ã«ããºã ããããŸããã åæ§ã«ãã»ãã¥ãªã㣠ã°ã«ãŒããåé€ããããšããµãŒããŒã¯æ°ããã°ã«ãŒããäœæããããŸã§ãããã¯ãŒã¯ ãã©ãã£ãã¯ãæåŠãå§ããŸãã
èå³ããããããããªãå¥ã®ã¿ã€ãã®ãªãã¡ã¯ã¿ãªã³ã°ã¯ãTerraform ID ã®å€æŽã§ãã äŸãšããŠãwebserver-cluster ã¢ãžã¥ãŒã«ã® aws_security_group ãªãœãŒã¹ãèŠãŠã¿ãŸãããã
resource "aws_security_group" "instance" { # (...) }
ãã®ãªãœãŒã¹ã®èå¥åãã€ã³ã¹ã¿ã³ã¹ãšåŒã³ãŸãã ãªãã¡ã¯ã¿ãªã³ã°äžã«ããããããããã (ããªãã®æèŠã§ã¯) ååãcluster_instanceãã«å€æŽããããšã«ãããšæ³åããŠãã ããã
resource "aws_security_group" "cluster_instance" { # (...) }
çµå±äœãèµ·ããã®ã§ããããïŒ ããã§ããæ··ä¹±ã§ãã
Terraform ã¯ãåãªãœãŒã¹ ID ãã¯ã©ãŠã ãããã€ã㌠ID ã«é¢é£ä»ããŸãã ããšãã°ãiam_user 㯠AWS IAM ãŠãŒã¶ãŒ ID ã«é¢é£ä»ããããaws_instance 㯠AWS EC2 ãµãŒã㌠ID ã«é¢é£ä»ããããŸãã ãªãœãŒã¹ ID ãå€æŽãããš (aws_security_group ã®å Žåã®ããã«ãã€ã³ã¹ã¿ã³ã¹ããã¯ã©ã¹ã¿ãŒã€ã³ã¹ã¿ã³ã¹ã«)ãTerraform ã«å€æŽãããšãå€ããªãœãŒã¹ãåé€ããŠæ°ãããªãœãŒã¹ãè¿œå ãããã®ããã«è¡šç€ºãããŸãã ãããã®å€æŽãé©çšãããšãTerraform ã¯å€ãã»ãã¥ãªã㣠ã°ã«ãŒããåé€ããŠæ°ããã»ãã¥ãªã㣠ã°ã«ãŒããäœæãããµãŒããŒã¯ãããã¯ãŒã¯ ãã©ãã£ãã¯ãæåŠãå§ããŸãã
ãã®è°è«ããåŸãããéèŠãªæèšã XNUMX ã€æããŸãã
- åžžã« plan ã³ãã³ãã䜿çšããŠãã ããã ããããã¹ãŠã®é害ãæããã«ããããšãã§ããŸãã åºåã泚ææ·±ã確èªããTerraform ãåé€ãã¹ãã§ãªããªãœãŒã¹ã®åé€ãèšç»ããŠããç¶æ³ã«æ³šæããŠãã ããã
- åé€ããåã«äœæããŠãã ããã ãªãœãŒã¹ã眮ãæããå Žåã¯ãå ã®ãªãœãŒã¹ãåé€ããåã«ã代æ¿ãªãœãŒã¹ãäœæããå¿ èŠããããã©ãããæ éã«æ€èšããŠãã ããã çãããã¯ããã®å Žåã¯ãcreate_before_destroy ã圹ã«ç«ã¡ãŸãã åãçµæã¯ãXNUMX ã€ã®æé ãå®è¡ããããšã«ãã£ãŠæåã§å®çŸã§ããŸãããŸããæ°ãããªãœãŒã¹ãæ§æã«è¿œå ã㊠apply ã³ãã³ããå®è¡ãã次ã«å€ããªãœãŒã¹ãæ§æããåé€ããŠãapply ã³ãã³ããå床䜿çšããŸãã
- èå¥åãå€æŽããã«ã¯ãç¶æ
ãå€æŽããå¿
èŠããããŸãã ãªãœãŒã¹ãåé€ããŠæ°ããããŒãžã§ã³ãäœæããã«ããªãœãŒã¹ã«é¢é£ä»ãããã ID ãå€æŽãã (ããšãã°ãaws_security_group ã®ååãã€ã³ã¹ã¿ã³ã¹ããã¯ã©ã¹ã¿ãŒã€ã³ã¹ã¿ã³ã¹ã«å€æŽãã) å Žåã¯ãããã«å¿ã㊠Terraform ç¶æ
ãã¡ã€ã«ãæŽæ°ããå¿
èŠããããŸãã ããã¯æ±ºããŠæåã§è¡ããªãã§ãã ããã代ããã« terraform state ã³ãã³ãã䜿çšããŠãã ããã èå¥åã®ååãå€æŽããå Žåã¯ã次ã®æ§æãæ〠terraform state mv ã³ãã³ããå®è¡ããå¿
èŠããããŸãã
terraform state mv <ORIGINAL_REFERENCE> <NEW_REFERENCE>
ORIGINAL_REFERENCE ã¯çŸåšã®åœ¢åŒã§ãªãœãŒã¹ãåç §ããåŒã§ãNEW_REFERENCE ã¯ç§»åå ã®å Žæã§ãã ããšãã°ãaws_security_group ã°ã«ãŒãã®ååãinstanceããcluster_instanceã«å€æŽããå Žåã¯ã次ã®ã³ãã³ããå®è¡ããå¿ èŠããããŸãã
$ terraform state mv aws_security_group.instance aws_security_group.cluster_instance
ããã«ããã以åã« aws_security_group.instance ã«é¢é£ä»ããããŠããç¶æ ããä»åŸã¯ aws_security_group.cluster_instance ã«é¢é£ä»ããããå¿ èŠãããããšã Terraform ã«äŒããããŸãã ååãå€æŽããŠãã®ã³ãã³ããå®è¡ããåŸãterraform plan ã«äœãå€æŽã衚瀺ãããªãå Žåã¯ããã¹ãŠãæ£ããè¡ãããããšã«ãªããŸãã
- äžéšã®èšå®ã¯å€æŽã§ããŸããã å€ãã®ãªãœãŒã¹ã®ãã©ã¡ãŒã¿ã¯å€æŽã§ããŸããã ããããå€æŽããããšãããšãTerraform ã¯å€ããªãœãŒã¹ãåé€ãã代ããã«æ°ãããªãœãŒã¹ãäœæããŸãã éåžžãåãªãœãŒã¹ ããŒãžã«ã¯ãç¹å®ã®èšå®ãå€æŽãããšãã«äœãèµ·ãããã瀺ãããŠãããããå¿ ãããã¥ã¡ã³ãã確èªããŠãã ããã åžžã« plan ã³ãã³ãã䜿çšããcreate_before_destroy æŠç¥ã®äœ¿çšãæ€èšããŠãã ããã
é 延ãããäžè²«æ§ã¯äžè²«æ§ããããŸã...é 延ãã
AWS ãªã©ã®äžéšã®ã¯ã©ãŠã ãããã€ããŒã® API ã¯éåæã§ãããäžè²«æ§ãé 延ããŠããŸãã éåæãšã¯ãèŠæ±ãããã¢ã¯ã·ã§ã³ãå®äºããã®ãåŸ ããã«ãã€ã³ã¿ãŒãã§ã€ã¹ãããã«å¿çãè¿ãããšãã§ããããšãæå³ããŸãã é 延äžè²«æ§ãšã¯ãå€æŽãã·ã¹ãã å šäœã«åæ ããããŸã§ã«æéããããå¯èœæ§ãããããšãæå³ããŸãã ãã®åŠçãè¡ãããŠããéãå¿çã¯äžè²«æ§ããªããã©ã®ããŒã¿ ãœãŒã¹ ã¬ããªã«ã API åŒã³åºãã«å¿çããŠãããã«äŸåããå¯èœæ§ããããŸãã
ããšãã°ãAWS ã«å¯Ÿã㊠EC2 ãµãŒããŒã®äœæãèŠæ±ãã API åŒã³åºããè¡ããšæ³åããŠãã ããã API ã¯ããµãŒããŒèªäœãäœæãããã®ãåŸ ããã«ãã»ãŒå³åº§ã«ãæåãââå¿ç (201 Created) ãè¿ããŸãã ããã«æ¥ç¶ããããšãããšããã®æç¹ã§ã¯ AWS ããŸã ãªãœãŒã¹ãåæåäžã§ãããããµãŒããŒããŸã èµ·åããŠããªããããã»ãŒç¢ºå®ã«å€±æããŸãã ããã«ããã®ãµãŒããŒã«é¢ããæ å ±ãååŸããããã«å¥ã®åŒã³åºããè¡ããšããšã©ãŒ (404 Not Found) ãçºçããå¯èœæ§ããããŸãã åé¡ã¯ããã® EC2 ãµãŒããŒã«é¢ããæ å ±ãã©ãã§ãå©çšã§ããããã«ãªããŸã§ã«ãAWS å šäœã«äŒæãããå¯èœæ§ããããæ°ç§åŸ ã€å¿ èŠããããšããããšã§ãã
é 延æŽåæ§ãåããéåæ API ã䜿çšããå Žåã¯ãã¢ã¯ã·ã§ã³ãå®äºããŠã·ã¹ãã å šäœã«äŒæããããŸã§ãå®æçã«ãªã¯ãšã¹ããåè©Šè¡ããå¿ èŠããããŸãã æ®å¿µãªãããAWS SDK ã«ã¯ããã«é©ããããŒã«ãæäŸãããŠããããTerraform ãããžã§ã¯ã㯠6813 (https://github.com/bashicorp/terraform/issues/6813) ã®ãããªå€ãã®ãã°ã«æ©ãŸãããŠããŸããã
$ terraform apply aws_subnet.private-persistence.2: InvalidSubnetID.NotFound: The subnet ID 'subnet-xxxxxxx' does not exist
ã€ãŸãããªãœãŒã¹ (ãµãããããªã©) ãäœæããããã«é¢ããæ å ± (æ°ããäœæããããµããããã® ID ãªã©) ãååŸããããšããŸããããTerraform ã¯ãããèŠã€ããããšãã§ããŸããã ãããã®ãã° (6813 ãå«ã) ã®ã»ãšãã©ã¯ä¿®æ£ãããŠããŸãããç¹ã« Terraform ãæ°ãããªãœãŒã¹ ã¿ã€ãã®ãµããŒããè¿œå ããå Žåã«ã¯ãäŸç¶ãšããŠææçºçããŸãã ããã¯é¢åã§ãããã»ãšãã©ã®å Žåã害ã¯ãããŸããã terraform apply ãå床å®è¡ãããšããã®æç¹ã§æ å ±ããã§ã«ã·ã¹ãã å šäœã«åºãã£ãŠããããããã¹ãŠãæ©èœããã¯ãã§ãã
ãã®æç²ã¯ãšãã²ããŒã»ããªã¯ãã³ã®æ¬ããã®ãã®ã§ã
ãTerraform: ã³ãŒãã¬ãã«ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã .
åºæïŒ habr.com