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

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"
ã³ãã³ãã®ç°¡åãªã·ãŒã±ã³ã¹ïŒ
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ã€ã®äŸã次ã«ç€ºããŸãã
ããã§ã¯ãå€æ°ã®äœ¿çšãå€æ°ã®ç®è¡æŒç®ããã©ãŒãããã䜿çšããè£éãçŸåšã®èŠçŽ ã®ã€ã³ããã¯ã¹ã®äœ¿çšïŒåãã¿ã€ãã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããå ŽåïŒãããã³ãªãœãŒã¹ã®ã¿ã°ä»ãã®äŸã瀺ããŸãã
ãã ããã€ã³ã¹ã¿ã³ã¹ãäœæ/ç Žæ£ããã ãã§ã¯ååã§ã¯ãããŸãã-ãã®Terraformã«ã¯ã
Provisionersã®æŠå¿µãå°å
¥ããããã«ãäœããã®æ¹æ³ã§ããããåæåããå¿
èŠããããŸãïŒãã¡ã€ã«ã®ã³ããŒãç¹å®ã®ãœãããŠã§ã¢ã®ã€ã³ã¹ããŒã«ãšæ§æãã·ã¹ãã ã®æŽæ°ãã¯ã©ã¹ã¿ãŒã®æ§æãªã©ïŒã äž»ãªãã®ã¯
file ã
remote-exec ã
chefãããã³
null-resourceã§ãã å
žåçãªæäœã¯ããªã¢ãŒãã€ã³ã¹ã¿ã³ã¹ã§ã®ãã¡ã€ã«ã®ã³ããŒãšã¹ã¯ãªããã®å®è¡ã§ãã
ããããžã§ãã³ã°æäœãæå¹ã«ããåã®äŸã次ã«ç€ºããŸãã
äž»ãªãã€ã³ãã¯ããªã¢ãŒããã¹ããžã®æ¥ç¶ã«é¢ããæ
å ±ãæäŸããããšã§ãã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...> } }
次ã«ãã¯ãŒã«ãŒããŒãã«äŸåé¢ä¿ãè¿œå ããŸãã
depend_onãªãœãŒã¹ä¿®é£Ÿåã䜿çšããŠãã€ã³ãã©ã¹ãã©ã¯ãã£ãäœæããã¿ã¹ã¯ãå®è¡ããé åºãæå®ã§ããŸããTerraformã¯ããã¹ã¿ãŒããŒããå®å
šã«äœæããããŸã§ã¯ãŒã«ãŒããŒããäœæããŸããã ãã®äŸãããããããã«ãäŸåé¢ä¿ïŒteiïŒãšããŠããªãœãŒã¹ã®ã¿ã€ãããæ§æããããªã¹ããæå®ãããã®ååããããã§ç€ºããŸãã AWSã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã ãã§ãªããVPCããããã¯ãŒã¯ãªã©ãäœæã§ããŸãã -VPCã䜿çšããŠãªãœãŒã¹ã®äŸåé¢ä¿ãšããŠæå®ããå¿
èŠããããŸã-ããã«ãããæ£ããäœæé åºãä¿èšŒãããŸãã
ãããããã¹ã¿ãŒããŒãã®ã¢ãã¬ã¹ããã¹ãŠã®ã¯ãŒã«ãŒããŒãã«æž¡ãç¶ããŸãããã ãã®ãããTerraformã¯ã以åã«äœæããããªãœãŒã¹ãåç
§ããã¡ã«ããºã ãæäŸããŸãã ã¯ãŒã«ãŒã®èª¬æã§ãã¹ã¿ãŒããŒãã®IPã¢ãã¬ã¹ã«é¢ããæ
å ±ãç°¡åã«æœåºã§ããŸãã
ã€ãŸã $ {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" ]
å°ã説æïŒ
1. depend_on-äºåã«æºåãå¿
èŠãªãªãœãŒã¹ã®ãªã¹ãã瀺ããŸãã
2.ããªã¬ãŒ-ãã¬ã€ã³ïŒãã®å Žåã¯ã³ã³ãã§åºåããããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã®IDïŒã圢æããŸãããã®å€æŽã«ããããã®ãªãœãŒã¹ã§æå®ããããã¹ãŠã®ããããžã§ãã³ã°ãšãŒãžã§ã³ããå®è¡ãããŸãã
3.æ¥ç¶ã»ã¯ã·ã§ã³ã®ãã®ãªãœãŒã¹ã§æå®ãããããããžã§ãã³ã°ã¹ã¯ãªãããå®è¡ããå¿
èŠãããã€ã³ã¹ã¿ã³ã¹ã瀺ããŸãã
ç°ãªããµãŒããŒã§ããã€ãã®æé ãå®è¡ããå¿
èŠãããå Žå-å¿
èŠãªäŸåé¢ä¿ãæã€è€æ°ã®nullãªãœãŒã¹ãäœæããŸãã
äžè¬ã«ãTerraformã䜿çšããŠéåžžã«è€éãªã€ã³ãã©ã¹ãã©ã¯ãã£ãäœæããã«ã¯ã説æãããŠããã ãã§ååã§ãã
ä»ã®äººã®ééãããåŠã³ãã人ã®ããã®ããã€ãã®ããéèŠãªãã³ãã以äžã«ç€ºããŸãã
1. Terraformãäœæãããã€ã³ãã©ã¹ãã©ã¯ãã£ã®æåŸã®ç¶æ
ãä¿åãã.tfstateãã¡ã€ã«ãæ
éã«ä¿åããããšãå¿ããªãã§ãã ããïŒããã«ãäœæããããªãœãŒã¹ã«é¢ããæ
å ±ã®ç¶²çŸ
çãªãœãŒã¹ãšããŠäœ¿çšã§ããjsonãã¡ã€ã«ã§ãïŒ
2. Terraformã䜿çšããŠäœæããããªãœãŒã¹ãæåã§å€æŽããªãã§ãã ããïŒãµãŒãã¹èªäœã®ç®¡çã³ã³ãœãŒã«ããã³ä»ã®å€éšãã¬ãŒã ã¯ãŒã¯ã䜿çšïŒ-次åãã©ã³ããã³é©çšãéå§ãããšãçŸåšã®èª¬æã«å¯Ÿå¿ããªããªãœãŒã¹ã®åäœæãåãåããŸãã
3.æåã«å°ããªã€ã³ã¹ã¿ã³ã¹/å°æ°ã®ã€ã³ã¹ã¿ã³ã¹ã§æ§æããã¹ãããŠã¿ãŸã-æ§æãäœæãããšãã«å€ãã®ãšã©ãŒããã£ããããããšã¯éåžžã«é£ãããTerraformã«çµã¿èŸŒãŸããããªããŒã¿ãŒã¯æ§æãšã©ãŒã®ã¿ã衚瀺ããŸãïŒããã ãã§ã¯ãããŸããïŒã
第2éšã§ã¯ãäœæ¥çšã®å§åéã®æºåã®ç¶ç¶ãæ€èšããŸã-PrestoDBãé
眮ããã€ã³ãã©ã¹ãã©ã¯ãã£ã®äžã«SaltStackãã¹ã¿ãŒ+ãããªã³ãé
眮ããæ¹æ³ã説æããŸãã