æŠèŠ
terraform testãšã¯ïŒ
v1.6ãããterraform testã³ãã³ããå©çšå¯èœã«ãªããŸããã
HashiCorpããã°
terraform testã³ãã³ãã䜿çšããã°ãããããæ§ç¯ãããªãœãŒã¹ã«ã€ããŠãæå®ããæ¡ä»¶ã«æ²¿ã£ãŠããããç°¡åã«ç¢ºèªããããšãã§ããŸãã
ãŠãŒã¹ã±ãŒã¹
æ§ç¯ãããªãœãŒã¹ã®è©³çްãç¥ãããã«ã¯terraform planã³ãã³ãã䜿çšããã®ãäžè¬çããšæããŸãã
ãã ãããããã®ãªãœãŒã¹ãäžæ°ã«äœæãããšããªã©ã¯planã®çµæãããªãã®è¡æ°ã«ãªããæ³å®å€ã®æ§ç¯å
容ã«ãªã£ãŠããŸã£ãŠããã®ãèŠéãããŠããŸãããšãããããšæããŸãã
terraform testã³ãã³ããå©çšããã°ãéèŠãªèšå®å€ãªã©ãæ£ããèšå®ãããŠããããç¹ã«éç¹çã«ãã§ãã¯ããããšãã§ããŸãã
äŸãã°ä»¥äžã®ãããªãŠãŒã¹ã±ãŒã¹ãèããããŸãã
- äœæããã€ã³ã¹ã¿ã³ã¹ã®å ãšãªãAMIã®IDãåã£ãŠãããã®ç¢ºèª
- äœæåŸã€ã³ã¹ã¿ã³ã¹ã®IPã¢ãã¬ã¹ãåã£ãŠãããã®ç¢ºèª
- æå®ã®ã¿ã°ãæ£ããã»ãããããŠãããã®ç¢ºèª
(v1.6)terraform testãå®éã«ãã£ãŠã¿ã
v1.6ã«ãŠterraform testã³ãã³ãã远å ãããv1.7ã§ããã«ã¢ããããŒãããããŸãããããŸãã¯v1.6ã«ãŠAWSæ§ç¯ã®ç°¡åãªæ€èšŒããã£ãŠã¿ãããšæããŸãã
ãã®åŸãv1.7ã®ã¢ãã¯ã§ã®ãã¹ãæ©èœãæ€èšŒããŸãã
å¿ èŠãªãã®
- æ§ç¯äºå®ã®ãªãœãŒã¹ãå®çŸ©ãããterraformã³ãŒã
- ä»åã¯EC2ã€ã³ã¹ã¿ã³ã¹1å°ãæ§ç¯ããã³ãŒããäœæããŸãã
- ãã¹ããããå
容ãèšèŒãããã¹ãçšãã¡ã€ã«
- ãã®ãã¡ã€ã«ã®ååã¯
.tftest.hclã§çµããå¿ èŠããããŸã
- ãã®ãã¡ã€ã«ã®ååã¯
æ€èšŒã®æµã
- EC2æ§ç¯ã®Terraformã³ãŒããæžã
- ãã®ãšããã€ã³ã¹ã¿ã³ã¹ã®Nameã¿ã°ã«å€ãèšå®ãã
- ãã¹ãçšãã¡ã€ã«ãæžã
- ãã¹ãçšãã¡ã€ã«ã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã®Nameã¿ã°ãæå®ã®å€ã«ãªã£ãŠãããããã§ãã¯ããåŠçãèšèŒãã
- ä»åã¯ãšã©ãŒã®çµæãèŠããã®ã§ã1ã®ã³ãŒãã§èšå®ããNameã¿ã°ã®å€ãšã¯å¥ã®å€ãã©ãããå€å®ããã
terraform testã³ãã³ããå®è¡ãããšã©ãŒã«ãªãããšã確èª
1.EC2æ§ç¯ã®Terraformã³ãŒããæžã
ãŸãã¯EC2ã€ã³ã¹ã¿ã³ã¹ãæ§ç¯ããããã®Terraformã³ãŒããæžããŠãããŸãã
è²ã
èšå®ããŠããŸãããä»å泚ç®ãã¹ãã¯tagsãããã¯ã®Nameã¿ã°ã§ãã
Nameã¿ã°ã«æ«å°Ÿtest01ãèšå®ããŠããŸããããããåŸã®ãã¹ãã§åŒã£ãããããã«ããŸãã
- ec2.tf
#####################################
# EC2 Instance
#####################################
resource "aws_instance" "test01" {
ami = var.test01.ami_test
instance_type = var.common.instance_type
subnet_id = aws_subnet.public_subnet_a.id
tenancy = "default"
key_name = aws_key_pair.test01.key_name
instance_initiated_shutdown_behavior = "stop"
monitoring = "true"
source_dest_check = "true"
disable_api_termination = "true"
vpc_security_group_ids = [aws_security_group.test01.id]
tags = {
Name = "${var.common.prefix}-${var.common.env}-test01"
owner = var.common.owner
}
}
2.ãã¹ãçšãã¡ã€ã«ãæžã
ç¶ããŠããã¹ãå
容ãèšèŒãããã¹ãçšãã¡ã€ã«ãæžããŠãããŸãã
ãã¹ãçšãã¡ã€ã«ã®èšèŒæ¹æ³ã«ã€ããŠã¯ãã¡ããåç
§ã
现ããèšèŒæ¹æ³ã¯è²ã ãšãããŸããã代衚çãªãã®ã¯äžèšã®éãã§ãã
- å°ãªããšã1ã€ã®
runãããã¯ãèšèŒãã- ãã¹ãçšãã¡ã€ã«ã«ãããŠäžçªéèŠãªãããã¯
- Terraformã¯
runãããã¯ãäžããé çªã«å®è¡ããrunãããã¯å ã«èšèŒãããã³ãã³ãã®å®è¡ãã·ãã¥ã¬ãŒããã
- å¿
èŠã§ããã°ã1ã€ã®
variablesãããã¯ãèšèŒãã - å¿
èŠã§ããã°ã1ã€ãŸãã¯è€æ°ã®
providerãããã¯ãèšèŒãã
runãããã¯ã®èšèŒæ¹æ³ã¯äžèšã®éãã§ãã
commandãã£ãŒã«ããèšèŒplanãapplyããã©ã¡ãã®ã³ãã³ãã䜿ã£ãŠãã¹ãããããæå®terraform plan,terraform applyãšåæ§ãplanã ã£ããå®éã®æ§ç¯ã¯è¡ããã«ãã¹ãããå察ã«applyã ã£ããå®éã«æ§ç¯åŠçãè¡ã£ãŠãã¹ãããåŸãæ§ç¯ããããªãœãŒã¹ã¯åé€ããã- ããã©ã«ãã¯
apply
assertãããã¯ãèšèŒassertãããã¯ã¯conditionãšerror_messageã§æ§æãããconditionã§ã¯ã©ããªã£ãŠãããOKãšå€å®ãããã®æ¡ä»¶ãèšèŒerror_messageã§ã¯ãOKã§ãªãã£ãå Žåã«åºåããæååãèšèŒ
äžèšãä»åäœæãããã¹ãçšãã¡ã€ã«ã§ãã
runãããã¯ïŒâvalid_ec2_name_tagâãå®çŸ©- ä»åã¯å®éã®æ§ç¯ã¯è¡ããªãã®ã§ã
commandã«planãèšå® - conditionã«ã¯ããã€ã³ã¹ã¿ã³ã¹ã®Nameã¿ã°ãâsekiguchi-test-ap01â³ã§çµãããã©ããïŒããèšèŒ
- 1ã§äœæããã³ãŒãã§ã¯Nameã¿ã°ã«å¥ã®å€ãèšå®ãããŠããã®ã§ãããã§ãšã©ãŒã«ãªãæ³å®
- error_messageã§ã¯ãâNameã¿ã°ã®å€ãäºæããååãšäžèŽããŸããã§ããâãèšèŒ
ec2-nametag-check.tftest.hcl
run "valid_ec2_name_tag" {
command = plan
assert {
condition = aws_instance.test01.tags.Name == "sekiguchi-test-ap01"
error_message = "Nameã¿ã°ã®å€ãäºæããååãšäžèŽããŸããã§ãã"
}
}
3. terraform testã³ãã³ããå®è¡ãããšã©ãŒã«ãªãããšã確èª
1,2ã®ãã¡ã€ã«ãåããã©ã«ãã«é
眮ããterraform initã¯å®è¡æžã¿ã§ãã
ããã§ã¯terraform testã³ãã³ããå®è¡ãããšã©ãŒã«ãªãããšã確èªããŠãããŸãã
äºåã«AWSã¢ã«ãŠã³ãã®èªèšŒãå®è¡æžã¿ã§ãã
â»docker-composeã䜿çšããterraformã³ãã³ãå®è¡ã«ã€ããŠã¯ãã¡ããåç
§
% docker-compose run --rm terraform test ec2-nametag-check.tftest.hcl... in progress run "valid_ec2_name_tag"... fail â· â Error: Test assertion failed â â on ec2-nametag-check.tftest.hcl line 4, in run "valid_ec2_name_tag": â 4: condition = aws_instance.test01.tags.Name == "sekiguchi-test-ap01" â âââââââââââââââââ â â aws_instance.test01.tags.Name is "sekiguchi-test-test01" â â Nameã¿ã°ã®å€ãäºæããååãšäžèŽããŸããã§ãã âµ ec2-nametag-check.tftest.hcl... tearing down ec2-nametag-check.tftest.hcl... fail Failure! 0 passed, 1 failed.
ãã¹ããã¡ã€ã«ã®conditionã«ãŠèšå®ããæ¡ä»¶ã«åã£ãŠããªãããšãæ€ç¥ãFailure!ãšãªã£ãããšããããŠerror_messageã§èšå®ããã¡ãã»ãŒãžãåºåãããããšã確èªã§ããŸããã
(v1.7)ã¢ãã¯ã§ã®terraform testããã£ãŠã¿ã
v1.7ã§è¿œå ãããã¢ãã¯ã§ã®ãã¹ãæ©èœã«ã€ããŠ
ã¢ãã¯ã«ã€ããŠã®è©³çްã¯ãã¡ããåç §
Terraform v1.6ã§è¿œå ããããã¹ããã¬ãŒã ã¯ãŒã¯ã§ã¯ãplanãŸãã¯applyæäœã䜿ã£ãŠå®éã«ãããã€ããŒ(ä»åã¯AWS)ãåŒã³åºãããšã§å®è¡ãããŠããŸããã
v1.7ãããããã€ããŒåŒã³åºãã®ã¢ãã¯ãã€ãŸãå®éã®åŒã³åºããšã¯å¥ã«æš¡æ¬çã«åŒã³ã ãããšãã§ããããã«ãªããå®éã®ã€ã³ãã©ãäœæããããããã€ããŒèªèšŒæ
å ±ãèŠæ±ãããããããšãªããã¹ããã§ããããã«ãªããŸããã
ãã®ã¢ãã¯ãã¹ãã¯ãã¢ãã¯ã»ãããã€ããŒãšãªãŒããŒã©ã€ããšãã2ã€ã®äž»èŠãªæ©èœã«ãã£ãŠå¯èœãšãªã£ãŠããŸãã
ã¢ãã¯ã»ãããã€ããŒ
- ãã§ã€ã¯ã®ãããã€ããŒãæå³ããŠãããå®éã®æ§ç¯æã®ãããã€ããŒãšã¯å¥ã§å®çŸ©ãå¯èœ
- ã¢ãã¯ãããã€ããŒãšå®éã®æ§ç¯ã®ããã®ãããã€ããŒãäžç·ã«äœ¿ãããšã§æè»ã«ãã¹ããå¯èœ
mock_providerãããã¯ã«ãŠã¢ãã¯ãããã€ããŒãå®çŸ©ãããã®ãããã¯å ã§ãªãœãŒã¹ãããŒã¿ãœãŒã¹ã®å€ãæå®ã§ãã
ãªãŒããŒã©ã€ã
- ãããã€ããŒãã¢ãã¯ããäžã§ãç¹å®ã®ãªãœãŒã¹ããªãŒããŒã©ã€ãããããšãã§ããæ©èœ
- ãŠãŒã¹ã±ãŒã¹
- ããããžã§ãã³ã°ã«æéãããããªãœãŒã¹ã®ãã¹ãå®è¡æéççž®
- åºåã®ã·ãã¥ã¬ãŒã·ã§ã³ã®ã¿å®è¡ãããå Žå
- ããããªã·ããªãªçšã«ãããŒã¿ãœãŒã¹ã®åç §ã倿§åãããå Žå
å¿ èŠãªãã®
v1.6ã§äœæãããã®ããã®ãŸãŸå©çšããŸãã
- æ§ç¯äºå®ã®ãªãœãŒã¹ãå®çŸ©ãããterraformã³ãŒã
- EC2ã€ã³ã¹ã¿ã³ã¹1å°ãæ§ç¯ããã³ãŒã
- ãã¹ããããå 容ãèšèŒãããã¹ãçšãã¡ã€ã«
æ€èšŒã®æµã
v1.6ã®ãã¹ããšåæ§ã®å
容ããã¢ãã¯ã»ãããã€ããŒã䜿çšããŠå®è¡ããŠãããŸãã
v1.6ã®ãã¹ãå®è¡æã¯AWSã¢ã«ãŠã³ãèªèšŒãå®è¡ããäžã§terraform testã³ãã³ããå®è¡ããŸããããã¢ãã¯ã»ãããã€ããŒã¯æš¡æ¬çã«ãããã€ããŒåŒã³åºããè¡ããããAWSèªèšŒã¯äžèŠã§ãã
ãã®ãããAWSèªèšŒãå®è¡ããŠããªãç¶æ
ã§ã³ãã³ããæã£ãŠã¿ãŠããã¹ããå®è¡ã§ãããã詊ããŠã¿ãããšæããŸãã
äžèšã®æµãã§æ€èšŒããŠãããŸãã
- EC2æ§ç¯ã®Terraformã³ãŒããæžã
- äœææžã¿
- ãã¹ãçšãã¡ã€ã«ãæžã
- ãã¹ãçšãã¡ã€ã«ã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã®Nameã¿ã°ãæå®ã®å€ã«ãªã£ãŠãããããã§ãã¯ããåŠçãèšèŒãã
- ä»åã¯ãšã©ãŒã®çµæãèŠããã®ã§ã1ã®ã³ãŒãã§èšå®ããNameã¿ã°ã®å€ãšã¯å¥ã®å€ãã©ãããå€å®ããã
terraform testã³ãã³ããå®è¡ãããšã©ãŒã«ãªãããšã確èª
ã³ãŒãäœæ
ãã¹ãçšãã¡ã€ã«ãä»åã®æ€èšŒçšã«ä¿®æ£ããŠãããŸãã
äžèšã®äœææããã®å€æŽç¹ã¯äžèšã®éãã§ãã
- åé ã«
mock_provider "aws" {}ã®1è¡ã远å- ãã®1è¡ãèšèŒããããšã«ããããã®ãã¹ããã¡ã€ã«å ã®åŠçã¯ã¢ãã¯ã«ãŠå®è¡ããããšãå¯èœ
runãããã¯ããcommandãã£ãŒã«ããåé€- HashiCorpã®ãµã€ãã«èšèŒã®ããéããmock_providerã§ã®ãã¹ãæã¯ãªãœãŒã¹ã¯å®éã«äœæããã
- ãããã®ãªãœãŒã¹ã¯
terraform testãäœæããTerraformã¹ããŒããã¡ã€ã«ã«æ ŒçŽããããã¹ããå®è¡ããéã¡ã¢ãªã«ä¿æããã
- ãããã®ãªãœãŒã¹ã¯
- ãã®ãã
commandãã£ãŒã«ãã§ã®æå®ãäžèŠ
- HashiCorpã®ãµã€ãã«èšèŒã®ããéããmock_providerã§ã®ãã¹ãæã¯ãªãœãŒã¹ã¯å®éã«äœæããã
ec2-nametag-check.tftest.hcl
mock_provider "aws" {}
run "valid_ec2_name_tag" {
assert {
condition = aws_instance.test01.tags.Name == "sekiguchi-test-ap01"
error_message = "Nameã¿ã°ã®å€ãäºæããååãšäžèŽããŸããã§ãã"
}
}
terraform testã³ãã³ããå®è¡ãããšã©ãŒã«ãªãããšã確èª
ããã§ã¯terraform testã³ãã³ããå®è¡ãããšã©ãŒã«ãªãããšã確èªããŠãããŸãã
AWSã®èªèšŒãå®è¡ããŠããªãç¶æ
ã§terraform testã³ãã³ããå®è¡ããŸãã
terraform % docker-compose run --rm terraform test ec2-nametag-check.tftest.hcl... in progress run "valid_ec2_name_tag"... fail â· â Error: Test assertion failed â â on ec2-nametag-check.tftest.hcl line 5, in run "valid_ec2_name_tag": â 5: condition = aws_instance.test01.tags.Name == "sekiguchi-test-ap01" â âââââââââââââââââ â â aws_instance.test01.tags.Name is "sekiguchi-test-test01" â â Nameã¿ã°ã®å€ãäºæããååãšäžèŽããŸããã§ãã âµ ec2-nametag-check.tftest.hcl... tearing down ec2-nametag-check.tftest.hcl... fail Failure! 0 passed, 1 failed.
å
ã»ã©ãšåæ§ã«ãæ³å®éãã®ãšã©ãŒãšãªããŸããã
泚ç®ãã¹ã芳ç¹ãšããŠã¯ããšã©ãŒã®çµæãè¿ã£ãŠããã®ãããªãæ©ããšããããšã§ãã
ã¢ãã¯ã䜿çšããªãå Žåã®ãã¹ãã§ã¯è£ã§planãå®è¡ããŠããããããçµæãè¿ã£ãŠãããŸã§ã«30ã60ç§ã»ã©ããããŸããããã¢ãã¯ã䜿çšãããã¹ãã®å Žå10ç§ãšããããçµæãåºåãããŸãã
äœæã«æéããããã€ã³ã¹ã¿ã³ã¹ã«ã€ããŠãã¹ããããå Žåã«åœ¹ã«ç«ã¡ããã ãšæããŸããã
æåŸã«
ä»åã®ãã¹ããå®è¡ããŠã¿ãŠãv1.7ã§è¿œå ãããã¢ãã¯ã§ã®ãã¹ãã¯ãæè»œãã€çµæããã確èªã§ããã®ãè¯ããšæããŸããã
ãŸã ãªãªãŒã¹ãããã°ããã§æå¹ãªäœ¿ãæ¹ãæãã€ããŠããŸããããã€ã³ãã©éçºã«ãããŠããŸã䜿ãããšçµæ§åœ¹ã«ç«ã€ãšæããŸãã
äŸãã°åäžã®ç°å¢ãè€æ°äœæããæã®ãã§ãã¯é
ç®ããã¹ããã¡ã€ã«ã«ãŸãšããŠããããã®ãã¹ããã¡ã€ã«ããããžã§ã¯ãå
ã§å
±æããããšã§åèªã§ç°¡åã«ãã¹ããå®è¡ã§ããâŠãšãã§ããããã
Terraformã§ã®éçºæã¯ãããã€åŸã®ç¢ºèªãçµæ§å€§å€ãªã®ã§ãããŸã掻çšããŠãããããšæããŸããã