ããã§é¢çœãã®ã¯äœã§ããïŒ

AWSãããªãã¯ã¯ã©ãŠãã§Terraformããã³SaltStackããŒã¹ã®ãã¬ãã·ã£ãŒã¯ãã«ãŒã䜿çšãããããããå¥åº·çãªPrestoDBã¯ã©ã¹ã¿ãŒã®ã¬ã·ãã å§åéèªäœã®äœæ¥ã®æºåã®ãã¥ã¢ã³ã¹ãç¿èªäœã®é©åãªæºåã«å¿ èŠãªæé ã詳现ã«æ€èšãããã¡ãããå®æããç¿ã®æ¶è²»ã«ã€ããŠå°ãã話ããŸãã ãã®éšåã¯ãTerraformã®ãã¬ãŒãã³ã°è³æãšããŠäœ¿çšã§ããŸãã
ããã§ã¯å§ããŸãããïŒ
ã¬ã·ãã®ææ
- Terraform -1å
- SaltStack -1ãã¹ã¿ãŒãš1+ãããšã³
- PrestoDB -1人ã®ã³ãŒãã£ããŒã¿ãŒãš1人以äžã®ã¯ãŒã«ãŒ
- AWSã¢ã«ãŠã³ã -1å
- 粟éããŠãã¡ã€ã«ãå³ãã
ææããã詳现ã«æ€èšããŠãã ããïŒïŒæºåã®ã«ãŒã«ãªãïŒ
1. Terraform -Hashicorpã®äººã ïŒVagrantã Consul ãPackerãVaultãªã©ã®éåžžã«æçšãªãã®ãäœæããŸããïŒã®ãã°ãããããŒã«ã§ããç°å¢ã ãã§ãªã ãããŸããŸãªã¯ã©ãŠãã§ã€ã³ãã©ã¹ãã©ã¯ãã£ãäœæããã³å€æŽããŸãã
2. SaltStack-ãµãŒããŒã®èªåæ§æããã³æ§æã®ããã®ããŒã«ã ããªãã®è¬èãªäœ¿çšäººã¯ãã§ã«ãããšããã§ããã«ã€ããŠæžããŸãã ã
3. PrestoDB-ãã€ãã£ãã§ç解å¯èœãªSQLã§ã¯ãšãªãå®è¡ã§ããããã°ããŒã¿ãããã€ããŒåãã®ã¢ããªã³ã Facebookã®éçºè ãéçºãã OSSã¹ããŒã¿ã¹ã«ç§»è¡ããŸããã
4. PrestoDBã¯ã©ã¹ã¿ãŒããã®åŸåäœããããµããŒããããŠããTerraformã®ãªã¹ãããã®AWS ïŒãŸãã¯ãã®ä»ã®ãããªãã¯/ãã©ã€ããŒãã¯ã©ãŠããããšãã°GCEãŸãã¯OpenStack ïŒã AWSã次ã®ããã«äœ¿çšããŸã ããã¯ïŒãããªãã¯ã¯ã©ãŠããã©ãããã©ãŒã ã®äžã§ïŒæãäžè¬çã§ãããå€ãã®è¿œå 説æãªãã§å€ãã®äººã«ç解ã§ããŸãã
5.ãã®èšäºã§ã¯ããããã®è£œå矀ã®åºæ¬åçãšããã»ã¹ã容æã«ããããã®ããã€ãã®ããªãã¯ã«ã€ããŠã®ã¿èª¬æããŸãããã³ã³ããŒãã³ãã®äœæ¥ã®åŸ®åŠãªéãã«ã€ããŠã¯è§ŠããŸãããããããã«ã€ããŠãååãšããŠæ¬ãæžãããšãã§ããŸãã ãããã£ãŠãé ã䜿çšããŠãããã®æè¡ãé©å¿ãããããšã¯å€§æè¿ã§ãã ãããŠãŸã -äœããæé©ã«æ§æãããŠããªãããšãã³ã¡ã³ãã«æžããªãã§ãã ããïŒç¹ã«PrestoDBïŒ-ããã¯ç§ãè¿œæ±ããŠããç®æšã§ã¯ãããŸããã
å§åéã調çããïŒ
ã©ããªæçã®ã¬ã·ãã§ãããã©ã€ãã³ããã©ã€ãã³ã¯ãã§ã«èª¿çã®æºåãã§ããŠãããšããæ²é»ããããŸãããç§ãã¡ã®å Žåããã¬ãã·ã£ãŒã¯ãã«ãŒïŒTerraform + SaltStackïŒã®æ£ããæºåã調çã®æåã®ã»ãŒ80ïŒ ã§ãã
ããã§ã¯ãTerraformããå§ããŸãããã ããŠã SaltStackã®äœæè ã«ããAWSãŸãã¯SaltCloudã® CloudFormationããããŸãããªãTerraformãéžã°ããã®ã§ããïŒ Terraformã®äž»ãªæ©èœã¯ãã·ã³ãã«ã§ç解ããããDSLã§ãå¿ èŠãªã€ã³ã¹ã¿ã³ã¹ïŒãŸãã¯10ïŒãäœæãããã®èª¬æãååã«äœæããããšã§ãïŒTerraformãããŠã³ããŒããã ã$ PATHå ã«ããããšãæå³ããŸã ïŒã
provider "aws" { access_key = "XXXXXXXXXXXXXXXXXXXXX" # AWS IAM key secret_key = "******************************************" # AWS IAM secret region = "us-east-1" # region used to create resources } resource "aws_instance" "example_inst" { ami = "ami-6d1c2007" # CentOS 7 AMI located in US-East-1 instance_type = "t2.medium" count = "1" # or "10" can be used for parallel creation vpc_security_group_ids = [ "default-sg" ] # some security group with at least 22 port opened key_name = "secure_key" # pre created AWS E2 key pair subnet_id = "sub-abcdef123" # AWS VPC subnet }
ã³ãã³ãã®ç°¡åãªã·ãŒã±ã³ã¹ïŒ
terraform plan
terraform apply
ç©èªã¯ç解å¯èœã§ãããç§ã«ãšã£ãŠã¯ãAWSã«ç²ŸéããŠãã人ã«ã¯èª¬æãå¿ èŠãšããªãããã§ãã å©çšå¯èœãªAWSãªãœãŒã¹ã®è©³çŽ°ã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ã ãã¡ãããTerraformæ§æã§ããŒãæå®ãããŠããAWSã¢ã«ãŠã³ãã«ã¯ãå¿ èŠãªãªãœãŒã¹ãäœæããæš©éããããŸãã
å®éãæãèå³æ·±ãã®ã¯Terraformèªäœã®åŒã³åºã-terraformãã©ã³-ãæåŸã®ç¶æ ïŒãã®äŸã§ã¯ãæ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããå¿ èŠãããïŒããå®è¡ããå¿ èŠããããã®ã®ãèŠç©ããããäœæããã©ã®ãªãœãŒã¹ãäœæãåé€ãå€æŽãé©çšããããã瀺ããŸã-ããã¯å®éã«ããã»ã¹ãéå§ããŸãèšç»ããããªãœãŒã¹ã®äœæã Terraformãæ¢ã«éå§ãããŠãããèšç»æ®µéã§æ§æïŒããšãã°ãè¿œå ãããã€ã³ã¹ã¿ã³ã¹ïŒãå€æŽããå Žåãã©ã®äžè¶³ãªãœãŒã¹ãäœæãããé©çšãããŠäžè¶³ãªãœãŒã¹ãäœæã§ãããã衚瀺ãããŸãã
terraform destroy
Terraformã䜿çšããŠäœæããããã¹ãŠã®ãªãœãŒã¹ãå®å šã«åé€ããã®ã«åœ¹ç«ã¡ãŸãïŒäœæãããã€ã³ãã©ã¹ãã©ã¯ãã£ã®ç¶æ ã®èª¬æãæ ŒçŽããçŸåšã®.tfstateãã£ã¬ã¯ããªå ã®ãã¡ã€ã«ãèæ ®ãããŸãïŒã
å¿ããŠã¯ãªããªãéèŠãªç¹-terraformã¯ã»ãšãã©ã®å Žåãæ¢åã®ãªãœãŒã¹ãå€æŽããŸãã-åçŽã«å€ããªãœãŒã¹ãåé€ããŠãåäœæããŸãã ããã¯ãããšãã°ãt2.mediumã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããã€ã³ã¹ã¿ã³ã¹ã®æ°ããã¿ã€ãïŒm4.xlargeãªã©ïŒãæå®ããŠæ§æãå€æŽããå Žåãé©çšãããšãã«Terraformã¯ä»¥åã«äœæããã€ã³ã¹ã¿ã³ã¹ãç Žæ£ããŠããæ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããšãæå³ããŸãã ããã¯AWSãŠãŒã¶ãŒã«ãšã£ãŠå¥åŠã«æãããããããŸããïŒã€ã³ã¹ã¿ã³ã¹ãåæ¢ããã¿ã€ããå€æŽãããã£ã¹ã¯äžã®ããŒã¿ã倱ãããšãªãåèµ·åã§ããŸãïŒããããã¯ãã¹ãŠã®ãã©ãããã©ãŒã ã§åãäºæž¬ãããåäœãæäŸããããã«è¡ãããŸããã ãããŠãã1ã€ïŒTerraformã¯ã©ã€ããµã€ã¯ã«äžã«ãªãœãŒã¹ãå¶åŸ¡ã§ããŸããïŒãã®æ§è³ªäžã§ããªãã¯ãã§ãïŒ-ããã¯ãTerraformãããã䜿çšããŠäœæãããã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠåæ¢ãŸãã¯åèµ·åãªã©ã®ã³ãã³ããæäŸããªãããšãæå³ããŸã-ä»ã®æ段ã䜿çšããŠç¢ºç«ãããã€ã³ãã©ã¹ãã©ã¯ãã£ã管çããŸãã
Terraformã¯ãDSLã§äœ¿çšã§ããåªããæ©èœã»ãããæäŸããŸãããããã¯å€æ° ïŒhttps://www.terraform.io/docs/configuration/variables.htmlïŒã è£é ïŒå埩ãå€æ°ã®å€æŽã«å¿ èŠïŒã ã¢ãžã¥ãŒã«ãªã©ã§ãã ããããã¹ãŠäœ¿çšãã1ã€ã®äŸã次ã«ç€ºããŸãã
# Cluster shortname variable cluster_name { default = "example-presto" } # Count of nodes in cluster variable cluster_size { default = 3 } # Default owner for all nodes variable cluster_owner { default = "user@example.com" } # Default AWS AMI to use for cluster provisioning variable cluster_node_ami { default = "ami-6d1c2007" } # Default AWS type to use for cluster provisioning variable cluster_node_type { default = "t2.large" } # Defualt VPC subnet variable cluster_vpc_subnet { default = "subnet-da628fad" } # Default Security group to apply to instances variable cluster_sg { default = "sg-xxxxxxx" } # Default KeyPair to use for provisioning variable cluster_keyname { default = "secure_key" } # Cluster worker nodes resource "aws_instance" "worker_nodes" { ami = "${var.cluster_node_ami}" instance_type = "${var.cluster_node_type}" count = "${var.cluster_size - 1}" # one node will be used for coordinator vpc_security_group_ids = [ "${var.cluster_sg}" ] key_name = "${var.cluster_keyname}" subnet_id = "${var.cluster_vpc_subnet}" disable_api_termination = true tags { Name = "${var.cluster_name}-cluster-worker-${format("%02d", count.index+1)}" Owner = "${var.cluster_owner}" Purpose = "PrestoDB cluster '${var.cluster_name}' node ${format("%02d", count.index+1)}" } }
ããã§ã¯ãå€æ°ã®äœ¿çšãå€æ°ã®ç®è¡æŒç®ããã©ãŒãããã䜿çšããè£éãçŸåšã®èŠçŽ ã®ã€ã³ããã¯ã¹ã®äœ¿çšïŒåãã¿ã€ãã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããå ŽåïŒãããã³ãªãœãŒã¹ã®ã¿ã°ä»ãã®äŸã瀺ããŸãã
ãã ããã€ã³ã¹ã¿ã³ã¹ãäœæ/ç Žæ£ããã ãã§ã¯ååã§ã¯ãããŸãã-ãã®Terraformã«ã¯ã Provisionersã®æŠå¿µãå°å ¥ããããã«ãäœããã®æ¹æ³ã§ããããåæåããå¿ èŠããããŸãïŒãã¡ã€ã«ã®ã³ããŒãç¹å®ã®ãœãããŠã§ã¢ã®ã€ã³ã¹ããŒã«ãšæ§æãã·ã¹ãã ã®æŽæ°ãã¯ã©ã¹ã¿ãŒã®æ§æãªã©ïŒã äž»ãªãã®ã¯file ã remote-exec ã chefãããã³null-resourceã§ãã å žåçãªæäœã¯ããªã¢ãŒãã€ã³ã¹ã¿ã³ã¹ã§ã®ãã¡ã€ã«ã®ã³ããŒãšã¹ã¯ãªããã®å®è¡ã§ãã
ããããžã§ãã³ã°æäœãæå¹ã«ããåã®äŸã次ã«ç€ºããŸãã
# Localy stored SSH private key filename variable cluster_keyfile { default = "~/.ssh/secure_key.pem" } # Cluster worker nodes resource "aws_instance" "worker_nodes" { ami = "${var.cluster_node_ami}" instance_type = "${var.cluster_node_type}" count = "${var.cluster_size - 1}" # one node will be used for coordinator vpc_security_group_ids = [ "${var.cluster_sg}" ] key_name = "${var.cluster_keyname}" subnet_id = "${var.cluster_vpc_subnet}" disable_api_termination = true tags { Name = "${var.cluster_name}-cluster-worker-${format("%02d", count.index+1)}" Owner = "${var.cluster_owner}" Purpose = "PrestoDB cluster '${var.cluster_name}' node ${format("%02d", count.index+1)}" } # Copy bootstrap script provisioner "file" { source = "bootstrap-script.sh" destination = "/tmp/bootstrap-script.sh" connection { type = "ssh" user = "centos" private_key = "${file("${var.cluster_keyfile}")}" } } # Running provisioning commands provisioner "remote-exec" { inline = [ "yum -y update", "sudo sh /tmp/bootstrap-script.sh" ] connection { type = "ssh" user = "centos" private_key = "${file("${var.cluster_keyfile}")}" } } }
äž»ãªãã€ã³ãã¯ããªã¢ãŒããã¹ããžã®æ¥ç¶ã«é¢ããæ å ±ãæäŸããããšã§ããAWSã®å Žåãããã¯ã»ãšãã©ã®å ŽåããŒã¢ã¯ã»ã¹ã§ãããããã£ãŠãæ£ç¢ºã«ãã®ããŒã®å Žæãæå®ããå¿ èŠããããŸãïŒå€æ°ã¯äŸ¿å®äžå°å ¥ãããŸããïŒã æ¥ç¶ã»ã¯ã·ã§ã³ã®private_keyå±æ§ã¯ãã¡ã€ã«ãžã®ãã¹ãåãå ¥ããããšãã§ããªãããšã«æ³šæããŠãã ããïŒããŒã®ã¿ãããã¹ãã§ãïŒ-代ããã«ããã£ã¹ã¯äžã®ãã¡ã€ã«ãéãããã®å 容ãè¿ã$ file {}è£éã䜿çšãããŸãã
è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã§æ§æãããåçŽãªã¯ã©ã¹ã¿ãŒãäœæããŸããïŒbootstrap-script.shãã¡ã€ã«ã®å 容ã®è©³çŽ°ã«ã¯è§ŠããŸãã-å¿ èŠãªãœãããŠã§ã¢ã®ã€ã³ã¹ããŒã«ãããã«ç»é²ãããŠãããšä»®å®ããŸãïŒã å§åéã§å°çšãã¹ã¿ãŒã䜿çšããŠã¯ã©ã¹ã¿ãŒãäœæããæ¹æ³ãèŠãŠã¿ãŸãããã äžè¬ã«ãã¯ã©ã¹ã¿ãŒã®ã¯ãŒã«ãŒããŒãã¯ããã¹ã¿ãŒããŒãã®å ŽæãèªèããŠãå°æ¥çã«ã¿ã¹ã¯ãåä¿¡ããå¿ èŠããããšæ³å®ããŸãïŒä»ã®èšäºã®ããã«ã¯ã©ã¹ã¿ãŒå ã§ãã¹ã¿ãŒã確ç«ããæ å ±ãåºããããã«RaftãGossipãããã³ã«ãªã©ã®ããããçš®é¡ã®ã°ããºãæ®ããŸãããïŒ-ç°¡åã«ããããã«-ã¯ãŒã«ãŒããã¹ã¿ãŒã®IPã¢ãã¬ã¹ãç¥ã£ãŠããå¿ èŠããããšããŸãã ãããTerraformã«å®è£ ããæ¹æ³ã¯ïŒ æåã«ããã¹ã¿ãŒçšã«åå¥ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããå¿ èŠããããŸãã
resource "aws_instance" "master_node" { ami = "${var.cluster_node_ami}" instance_type = "${var.cluster_node_type}" count = "1" <...skipped...> provisioners { <...skipped...> } }
次ã«ãã¯ãŒã«ãŒããŒãã«äŸåé¢ä¿ãè¿œå ããŸãã
# Clurter worker nodes resource "aws_instance" "worker_nodes" { depends_on = ["aws_instance.master_node"] # dependency from master node introduced ami = "${var.cluster_node_ami}" instance_type = "${var.cluster_node_type}" count = "${var.cluster_size - 1}" # one node will be used for coordinator <...skipped...> }
depend_onãªãœãŒã¹ä¿®é£Ÿåã䜿çšããŠãã€ã³ãã©ã¹ãã©ã¯ãã£ãäœæããã¿ã¹ã¯ãå®è¡ããé åºãæå®ã§ããŸããTerraformã¯ããã¹ã¿ãŒããŒããå®å šã«äœæããããŸã§ã¯ãŒã«ãŒããŒããäœæããŸããã ãã®äŸãããããããã«ãäŸåé¢ä¿ïŒteiïŒãšããŠããªãœãŒã¹ã®ã¿ã€ãããæ§æããããªã¹ããæå®ãããã®ååããããã§ç€ºããŸãã AWSã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã ãã§ãªããVPCããããã¯ãŒã¯ãªã©ãäœæã§ããŸãã -VPCã䜿çšããŠãªãœãŒã¹ã®äŸåé¢ä¿ãšããŠæå®ããå¿ èŠããããŸã-ããã«ãããæ£ããäœæé åºãä¿èšŒãããŸãã
ãããããã¹ã¿ãŒããŒãã®ã¢ãã¬ã¹ããã¹ãŠã®ã¯ãŒã«ãŒããŒãã«æž¡ãç¶ããŸãããã ãã®ãããTerraformã¯ã以åã«äœæããããªãœãŒã¹ãåç §ããã¡ã«ããºã ãæäŸããŸãã ã¯ãŒã«ãŒã®èª¬æã§ãã¹ã¿ãŒããŒãã®IPã¢ãã¬ã¹ã«é¢ããæ å ±ãç°¡åã«æœåºã§ããŸãã
# Clurter worker nodes resource "aws_instance" "worker_nodes" { depends_on = ["aws_instance.master_node"] # dependency from master node introduced ami = "${var.cluster_node_ami}" instance_type = "${var.cluster_node_type}" count = "${var.cluster_size - 1}" # one node will be used for coordinator <...skipped...> # Running provisioning commands provisioner "remote-exec" { inline = [ "yum -y update", "sudo sh /tmp/bootstrap-script.sh ${aws_instance.master_node.private_ip}" # master-ip passed to script ] connection { type = "ssh" user = "centos" private_key = "${file("${var.cluster_keyfile}")}" } } }
ã€ãŸã $ {aws_instance.master_node.private_ip}ãšãã圢åŒã®å€æ°ã䜿çšãããšãã»ãšãã©ãã¹ãŠã®ãªãœãŒã¹æ å ±ã«ã¢ã¯ã»ã¹ã§ããŸãã ãã®äŸã§ã¯ãbootstrap-script.shããã¹ã¿ãŒããŒãã®ã¢ãã¬ã¹ããã©ã¡ãŒã¿ãŒãšããŠååŸããåŸã§å éšæ§æã«äœ¿çšã§ãããšæ³å®ããŠããŸãã
ãã®ãããªæ¥ç¶ã§ã¯äžååãªå ŽåããããŸããããšãã°ãTerraformã§ã¯nullãšåŒã°ããã¡ã«ããºã ããããããã¯ãŒã«ãŒããŒããæ¥ç¶ããåŸããã¹ã¿ãŒããŒãåŽã§ããã€ãã®ã¹ã¯ãªãããåŒã³åºãå¿ èŠããããŸãïŒããŒãåãå ¥ããã¯ãŒã«ãŒããŒãã§initã¿ã¹ã¯ãå®è¡ãããªã©ïŒ -resourceã¯ãäŸåé¢ä¿ã¡ã«ããºã ïŒäžèšãåç §ïŒã䜿çšããŠããã¹ãŠã®ãã¹ã¿ãŒããŒããšã¯ãŒã«ãŒããŒããäœæãããåŸã«äœæã§ããåœã®ãªãœãŒã¹ã§ãã ãã®ãããªãªãœãŒã¹ã®äŸã次ã«ç€ºããŸãã
resource "null_resource" "cluster_provision" { depends_on = [ "aws_instance.master_node", "aws_instance.worker_nodes" ] # Changes to any instance of the workers' cluster nodes or master node requires re-provisioning triggers { cluster_instance_ids = "${aws_instance.master_node.id},${join(",", aws_instance.worker_nodes.*.id)}" } # Bootstrap script can run only on the master node connection { host = "${aws_instance.master_node.private_ip}" type = "ssh" user = "centos" private_key = "${file("${var.cluster_keyfile}")}" } provisioner "remote-exec" { inline = [ <... some after-provision scripts calls on master node...> ] } }
å°ã説æïŒ
1. depend_on-äºåã«æºåãå¿ èŠãªãªãœãŒã¹ã®ãªã¹ãã瀺ããŸãã
2.ããªã¬ãŒ-ãã¬ã€ã³ïŒãã®å Žåã¯ã³ã³ãã§åºåããããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã®IDïŒã圢æããŸãããã®å€æŽã«ããããã®ãªãœãŒã¹ã§æå®ããããã¹ãŠã®ããããžã§ãã³ã°ãšãŒãžã§ã³ããå®è¡ãããŸãã
3.æ¥ç¶ã»ã¯ã·ã§ã³ã®ãã®ãªãœãŒã¹ã§æå®ãããããããžã§ãã³ã°ã¹ã¯ãªãããå®è¡ããå¿ èŠãããã€ã³ã¹ã¿ã³ã¹ã瀺ããŸãã
ç°ãªããµãŒããŒã§ããã€ãã®æé ãå®è¡ããå¿ èŠãããå Žå-å¿ èŠãªäŸåé¢ä¿ãæã€è€æ°ã®nullãªãœãŒã¹ãäœæããŸãã
äžè¬ã«ãTerraformã䜿çšããŠéåžžã«è€éãªã€ã³ãã©ã¹ãã©ã¯ãã£ãäœæããã«ã¯ã説æãããŠããã ãã§ååã§ãã
ä»ã®äººã®ééãããåŠã³ãã人ã®ããã®ããã€ãã®ããéèŠãªãã³ãã以äžã«ç€ºããŸãã
1. Terraformãäœæãããã€ã³ãã©ã¹ãã©ã¯ãã£ã®æåŸã®ç¶æ ãä¿åãã.tfstateãã¡ã€ã«ãæ éã«ä¿åããããšãå¿ããªãã§ãã ããïŒããã«ãäœæããããªãœãŒã¹ã«é¢ããæ å ±ã®ç¶²çŸ çãªãœãŒã¹ãšããŠäœ¿çšã§ããjsonãã¡ã€ã«ã§ãïŒ
2. Terraformã䜿çšããŠäœæããããªãœãŒã¹ãæåã§å€æŽããªãã§ãã ããïŒãµãŒãã¹èªäœã®ç®¡çã³ã³ãœãŒã«ããã³ä»ã®å€éšãã¬ãŒã ã¯ãŒã¯ã䜿çšïŒ-次åãã©ã³ããã³é©çšãéå§ãããšãçŸåšã®èª¬æã«å¯Ÿå¿ããªããªãœãŒã¹ã®åäœæãåãåããŸãã
3.æåã«å°ããªã€ã³ã¹ã¿ã³ã¹/å°æ°ã®ã€ã³ã¹ã¿ã³ã¹ã§æ§æããã¹ãããŠã¿ãŸã-æ§æãäœæãããšãã«å€ãã®ãšã©ãŒããã£ããããããšã¯éåžžã«é£ãããTerraformã«çµã¿èŸŒãŸããããªããŒã¿ãŒã¯æ§æãšã©ãŒã®ã¿ã衚瀺ããŸãïŒããã ãã§ã¯ãããŸããïŒã
第2éšã§ã¯ãäœæ¥çšã®å§åéã®æºåã®ç¶ç¶ãæ€èšããŸã-PrestoDBãé 眮ããã€ã³ãã©ã¹ãã©ã¯ãã£ã®äžã«SaltStackãã¹ã¿ãŒ+ãããªã³ãé 眮ããæ¹æ³ã説æããŸãã