ã¤ã³ãã©ãã¢ã¬ãã¦ãä½éã§ãããã¬ã¿ã®ã³ã¢é¨åã¯Engineyardã§éç¨ãã¦ãã¾ãããäºæ¥æ¡å¤§ã«ä¼´ããµãã·ã¹ãã ãå¢ãã¦ãã¾ãããæ°ãããµãã·ã¹ãã ã¯ä¸»ã«AWSã§éç¨ãã¦ãã¾ããããã§ä»åã¯äºä¾ã¨ãã¦å¼ç¤¾ã®æ°è¦é¨åã®ã¤ã³ãã©éç¨ã®ããæ¹ãããã§ä½¿ããã¦ããéå ·(Packer, Terraform, Serverspec, Ansible, Roadworker, Circle CI)ãèãæ¹ãªã©ã«ã¤ãã¦æ¸ãã¾ãããããã®éå ·ã¯ãã¯ãããç¥ããããã®ã§ããããã¾ãçæ°ããã¯ãªãã¨ã¯æã£ã¦ãã¾ããããããªããå¼ç¤¾ã«éã³ã«æ¥ãæ¹ãæ¡ç¨ã®å¿åè ã®æ¹ãªã©ãããã¬ã¿ã®ã·ã¹ãã éç¨ã«é¢ãã質åãããã ããã¨ãããããã®èª¬æè³æã®ãããã«ãªãããªãã¨ããç®çããã£ã¦æ¸ããã¦ããã ãã¾ãããã以å¤ã«ãéå ·ã¯ããã®ã§ããããªãã¨ãªãèå³ããã£ã¦ãããããªã¯ã¼ããã¿ã¤ãã«ã«ç¾ åããã¦ããã ãã¾ããã以ä¸ãç®æ¬¡ã«ãªãã¾ãã
- å³
- AMIã®ä½æ
- ãµã¼ã/ãããã¯ã¼ã¯
- ãµã¼ããããã¸ã§ãã³ã°
- DNS
- ç£è¦
- éç¨ã®æ¹éã¨èãæ¹
- ä»å¾ãããããã¨
1. å³
EC2ã¤ã³ã¹ã¿ã³ã¹ãã¯ããã種ã ã®ããã¼ã¸ããµã¼ãã¹ãå©ç¨ãã¦ãã¾ãããããã®ç®¡çã«ä½¿ã£ã¦ãã主ãªéå ·ã¯ä»¶ã®ã¨ããPacker, Terraform, Ansible, Roadworkerã§ããå³ä¸ã«ããã¦ç¢å°ãåºãã£ã¦ããç®æã管ç対象ã§ããç¢å°ãåºãã£ã¦ããªããä¾ãã°RDSãªã©ã¯æä½æ¥ã§ãããããããªãTerraformã®ç®¡çä¸ã«ç½®ããªããã¨ããã¨ãã¡ãã£ã¨æãã¦æ¥åãã¾ãã...ãã¾ããå³ãè¦ã¦ããã ããã°ãããããã«ãCircle CIãä¸å¿ã«ã¤ã³ãã©ãªãã¬ã¼ã·ã§ã³ãè¡ã£ã¦ãããç¹å®ã®ãã©ã³ãã«pushãããã¯ãã¼ã¸ãããã¿ã¤ãã³ã°ã§ã¤ã³ãã©ãªãã¬ã¼ã·ã§ã³ãèµ°ãããã«ãã¦ããã¾ãã以ä¸ãããããéå ·ã®ä½¿ãæ¹ããã¤ã³ãã«ã¤ãã¦æ¸ãã¾ãã
2. AMIã®ä½æ: Packer(ç·ã®ç·)
Packerã¯OSã®åºæ¬è¨å®ã¨ãRubyãªã©ã³ã³ãã¤ã«ã«æéã®ããããã®ã®ã©ã³ã¿ã¤ã ããããããã¤ã³ã¹ãã¼ã«ãããAMIãç¨æããããã«ä½¿ã£ã¦ãã¾ã(Rubyãªã©å®è¡ç°å¢ã®ã©ã³ã¿ã¤ã ã«ã¤ãã¦ã¯RPMãdebã«ãã¦åºãã¦ãã¨ããyum install / apt-get installããæ¹å¼ã§ãè¯ããããããªã)ãmasterãã©ã³ãã«ããã·ã¥ãããã¯ãã¼ã¸ãããã¿ã¤ãã³ã°ã§Circle CIããpacker buildãèµ°ãããã«ãã¦ããã¾ããpacker buildå¾ã«ServerspecãæµããæåãããAMIãä½æãããããã«ãã¦ãã¾ãã次ã®å³ã®ãããªã¤ã¡ã¼ã¸ã§ããServerspecã®ãã¹ãã±ã¼ã¹ããã¹ãããAMIãä½æããã¦ãããã¨ããããã¾ãã
ãªããpacker buildã«ã¯ããããæéããããã¨ããã®ã¨ãCircle CIã®ãã«ãã«ã¯å¶éæéãããã®ã§ããã¾ãã«æéããããããã«ãªã£ããå¥ã®æ段ã«ãããªã©å·¥å¤«ããå¿ è¦ãã§ã¦ãã¾ãã
3. ãµã¼ã/ãããã¯ã¼ã¯: Terraform(éãç·)
VPC(ãµãããããã«ã¼ãã£ã³ã°ãã»ãã¥ãªãã£ã°ã«ã¼ã..etc)ã¨EC2ã®ã¿ã管ç対象ã¨ãã¦ãã¾ããã¤ã³ã¹ã¿ã³ã¹ãå¢ããããæ¸ãããããæ°ãããµãããããåã£ããããã«ã¯Terraformã§è¡ãã¾ããã¤ã³ã¹ã¿ã³ã¹ã®ç¨®ã«ã¯å ã»ã©è¨åããPackerã§ä½æããAMIã使ãã¾ããTerraformã®applyã¯Circle CIã§è¡ãã®ã§ãããããã§ãã¤ã³ãã«ãªãã®ãtfstateãã¡ã¤ã«ã§ããterraformã¯applyãè¡ãã¨tfstateã¨ãããã¡ã¤ã«ãçæããã次ã®applyã§ã¯ãã®tfstateã¨ã®å·®åãé©ç¨ããåãã«ãªãã¾ããåå人ã®ãã¼ã«ã«ãã·ã³ããå®è¡ããå ´åã¯ãã®tfstateãã¡ã¤ã«ãgithubã«ããã·ã¥ããããã§ä¸å 管çããããã¨ã«ãªãã¨æãã¾ãããCircle CIã«applyããããå ´åãapplyå¾ã®tfstateãã¡ã¤ã«ãã©ããã«ç½®ãå¿ è¦ãããã¾ãã ãã£ã¨ãæã£åãæ©ãã®ãS3ã«æ ¼ç´ããæ¹æ³ã ã¨æã£ã¦ãã¾ããS3ã«tfstateæ ¼ç´ç¨ã®ãã±ãã(ãã¨ãã°foo-tf-state-bucket)ãæã£ã¦ãããCircle CIããã¯ä¸è¨ã®ãããªæµãã§applyãè¡ãããã«ãã¾ããS3ããtfstateãåå¾ãã -> apply -> applyå¾ã®tfstateãS3ã«ã¢ãããã¼ãã¨ããåãããã¦ããã¾ãã
terraform remote config -backend=S3 -backend-config="bucket=foo-tf-state-bucket" -backend-config="key=terraform.tfstate" terraform remote pull terraform apply terraform remote push
ã©ããã¦ããã¼ã«ã«ãã·ã³ããå®è¡ãããã±ã¼ã¹ããã¨ãã°Circle CIãæ»ãã§ããã¨ããªã©ã¯ã復活ãå¾ ã¤ãããã¼ã«ã«ãããä¸è¨ã®ããã«S3ä¸ã®tfstateãåç §ããäºå¾ã«S3ã«ããã·ã¥ãã¦ããããã«ãã¾ãã
4. ãµã¼ããããã¸ã§ãã³ã°: Ansible(æ©è²ã®ç·)
Ansibleã¯ããã«ã¦ã§ã¢ãã©ã¤ãã©ãªã®ã¤ã³ã¹ãã¼ã«ãè¡ãããã«ä½¿ã£ã¦ãã¾ãã以åã¯Packerã§ããã«ã¦ã§ã¢ã®è¨å®ã¾ã§å ¨é¨å ¥ãã®AMIãä½ã£ã¦åã«ããã使ãããã«ãã¦ãã¾ãã(å人ããã°ã«ããã¨ç´ä¸å¹´åã...)ã
ããããªãããã·ã§ã«ã¹ã¯ãªãã製ã®è¬ãã¬ã¼ã ã¯ã¼ã¯ã¿ããã«ãªã£ã¦ãã¾ã£ãã£ã¦ã®ã¨ãã³ã³ãã£ã°é¡ã®å¤æ´ãé »ç¹ãªã¨ããããã¨Packer buildã®æéãå¦ã«ã¤ã©ã¤ãã¨ããã®ããããPackerããããã«ã¦ã§ã¢ä»¥ä¸ã®ã¬ã¤ã¤ã®é¨åãåãé¢ãã¦Ansibleã§ãããã¸ã§ãã³ã°ããããã«æ»ãã¾ãããã¾ããå æ¥Ansible2ç³»ãåºã¾ãããæªã 1ç³»ã§ããã³ã³ãã£ã°ã¬ã¼ã·ã§ã³ã®ãã¹ãã¯ä¾ã«ãã£ã¦Serverspecãå©ç¨ãã¦ãã¾ãããã¹ãã³ã¼ããããã°ãã¤ã§ãä»ã®ãã¼ã«ã«ä¹ãæãããã¨ãã§ãããã以åã®ããã«å ¨é¨å ¥ãã®AMIæ¹å¼ã«ãæ»ããããããã¸ã§ãã³ã°å¾ã«ãããã¤ãè¡ãã°ãã®ãµã¼ãã¯ãµã¼ãã¹readyã«ãªãã¾ããã¢ããªã±ã¼ã·ã§ã³ã®ãããã¤ã«ããã¡ããCircle CIã使ã£ã¦ãã¾ãã
ããã§ãCircle CIããEC2ã¤ã³ã¹ã¿ã³ã¹ã«ansible-playbookããç°¡åãªTipsã«ã¤ãã¦ç´¹ä»ãã¾ããããã¾ããªæé ã¯ä»¥ä¸ã«ãªãã¾ãã
- ç§å¯æ å ±ã®å¾©å·
- Circle CIã®ã³ã³ããã®IPãåå¾ãã
- aws-cliãªã©ã§å¯¾è±¡ã®EC2ã¤ã³ã¹ã¿ã³ã¹ã®sshãã¼ã(from Circle CI)ãéæ¾ãã
- ãããã¸ã§ãã³ã°
- sshãã¼ããéãã
ã¾ãç§å¯æ å ±ã®å¾©å·ã§ããå種ãã¡ã¤ã«ãgithubã«æ ¼ç´ããéãã»ãã¥ãªãã£ä¸ãªãã¹ãæ ¼ç´ããããªããã®ãããã¾ããã¯ã¬ãã³ã·ã£ã«ãæ¸ããããã¡ã¤ã«ããç§å¯éµãSSL証ææ¸ãªã©ã«ã§ãããã®ãããªãã¡ã¤ã«ããªãå ´åã¯æ°ã«ããªãã¦ãè¯ãã§ãããããå ´åã¯ansible-vaultã使ã£ã¦å¯¾è±¡ã®ãã¡ã¤ã«ãæå·åãã¦git pushãã¦ããã¾ããä¸è¨ã®ããã«ãã¦æå·åã§ãã¾ãã
ansible-vault encrypt FILE
ããã¦Circle CIããgit pullããéãããã次ã®ããã«ãã¦å¾©å·ãã¾ããansible_vault_password.txtã¯å¾©å·ã®ãã¹ã¯ã¼ããæ¸ããããã¡ã¤ã«ã§ãã
ansible-vault decrypt FILE --vault-password-file=ansible_vault_password.txt
Circle CIããããå ´åã復å·ã®ãã¹ã¯ã¼ãã¯Circle CIã®ç°å¢å¤æ°è¨å®ã§ANSIBLE_VAULT_PASSWORDãªã©ã¨ãã¦æ ¼ç´ãã¦ããã¾ããCircle CIã«ã¯ç°å¢å¤æ°ããã¹ãã³ã°ãã¦æ ¼ç´ãã¦ããã便å©ãªæ©è½ããããAWS_ACCESS_KEY_IDãªã©ãåæ§ã«ãã¦æ±ãã¾ãã
ããã§ç»é²ããããã®ã¯circle.ymlå ã§$ANSIBLE_VAULT_PASSWORDãªã©ã¨ãã¦ä½¿ããã¨ãã§ãã¾ãã次ã®ããã«ãã¦å¾©å·ã§ãã¾ãã
pre: - pip install -r requirements.txt - echo $ANSIBLE_VAULT_PASSWORD > ansible_vault_password.txt - ansible-vault decrypt secret_file --vault-password-file=ansible_vault_password.txt
ãã¨ã®æé 3, 4, 5ã«ã¤ãã¦ã¯Circle CIããEC2ãµã¼ãã®sshãã¼ããéæ¾ãã¦ãããã¸ã§ãã³ã°ãå®è¡ããå®äºå¾ã«sshãã¼ããéãã¦ããã¾ãã§ãã
5. DNS: Roadworker(ãã³ã¯(///)ã®ç·)
DNSã®ã¬ã³ã¼ã管çã«ã¯Terraformã§ã¯ãªãRoadworkerã使ã£ã¦ãã¾ããå ¥ç¤¾ãã¦ããã«å°å ¥ããã®ãRoadworkerã§ãããããä¹ãæããçç±ããªãã®ã§ããã¯ãã®ã¾ã¾åãã¦ãã¾ããRoute53ã®DNSã¬ã³ã¼ããRubyã®DSLã§è¨è¿°ã§ãã¾ãã
hosted_zone "toreta.in." do #### Toreta corporate site #### rrset "toreta.in.", "A" do ttl 300 resource_records( "54.64.225.166" ) end end
è¨ãå°½ãããã¦ãããã¨ã§ãããã³ã¼ãåãããã¨ã«ããã³ã¡ã³ããã¤ãããã¾ãããgitã§å¤æ´å±¥æ´ã管çã§ããããã«ãªãã¾ãã
6. ç£è¦
ç£è¦ã«ã¤ãã¦ã¯èªåã®ããã°ã«ä»¥åæ¸ããã®ã§ããããã®ã¨ããã大ããå¤ãã£ã¦ããªãã§ãã
7. éç¨ã®æ¹éã¨èãã¦ãããã¨
ä»åè¿°ã¹ãã·ã¹ãã ã«ã¤ãã¦ã®éç¨æ¹éã«ã¤ãã¦æ¸ãã¾ããããã«ã¤ãã¦ã¯è³å¦ããã¨æãã¾ããããã¡ãã«ã¤ãã¦ã¯ç§ã¯ãã®ããã«èãã¦éç¨ãã¦ãã¾ãã
ãã¹ãåã¯ã¤ããªãããã¼ã«ã ããæ°ã«ãã
æ¤è¨¼æãé¤ãããµã¼ãã«sshããã±ã¼ã¹ã¯ã»ã¨ãã©ãªãã§ããEC2ã¿ã°ãMackerelã«ãµã¼ãã¹å/ãã¼ã«åãã¤ãããµã¼ãã¹ãã¼ã³ãå¾ã¯"ãã¼ããã©ã³ãµã®é ä¸ã«Appãã¼ã«ããã£ããµã¼ããä½å°ããã"ã¨ã ãèªèããã°è¯ãã¨æã£ã¦ãã¾ãããµã¼ãã¹ã¨ãã¼ã«ã ããæ°ã«ãã¾ãã ãã®è¨èã¯ãã¾ã浸éãã¦ãã¾ããããPETS or CATTLEã¨ãããã®ãããã¾ãããªã³ãã¬ã§éç¨ããã¦ãããµã¼ãã¯ååãã¤ããæ éãããç´ãã¦ãããããããããããã®ããã«ã±ã¢ãããã¯ã©ã¦ãã®ãµã¼ã群ã¯å®¶çã®å¦ãéã«æ±ããã¨ããèãæ¹ã§ãããã£ã¹ãã¼ã¶ãã«ã§ã¯ãªãã³ã³ãã¼ãã³ãã¯ãªãã¹ãããã¼ã¸ãã»ãµã¼ãã¹ã«å¯ããEC2ã§éç¨ãããã®ã¯ãªãã¹ã家çã¨ãã¦æ±ããã¢ããªã±ã¼ã·ã§ã³ãµã¼ãã ãã«ãã¾ãã
ç°å¸¸ãªã¤ã³ã¹ã¿ã³ã¹ã¯åçç¡ç¨ã§è½ã¨ã
EC2ã§ç¨¼åããã¦ããMySQLãµã¼ããªã©ãããå ´åã¯å¥ã¨ãã¦ããã¼ããã©ã³ãµé ä¸ã§åçã«è² è·åæ£ããã¦ãããµã¼ãã¯ãç°å¸¸æã¯å ¨å°ã§åãç°å¸¸ãçºçããã¯ãã§ãããªã®ã§åºæ¬çã«ã¯"appãµã¼ãã1å°ã ããããã"ã¿ãããªã±ã¼ã¹ã§ã¯èª¿æ»èªä½ãããªãã§ã(ä¸æ¥ä¸åãªããNå°ä¸ã®1å°ã...ã¨ãã£ãäºæ¡ãé »çºããã®ã§ããã°ãããã«èª¿æ»ãã¾ãã)ãappãµã¼ãã§ä¸éã«æ±ããªããã°ãªããªãã®ã¯ãã°ã ãã ã¨æã£ã¦ãã¾ãããã°ã¯fluendãªã©ãå©ç¨ãã¦BigQueryãS3ã«è»¢éãã¦ããã®ã§ããã®ãµã¼ãã®Fluentdã®ãã¡ã¤ã«ãããã¡ãã¼ãã«ãªã£ã¦ãããã¨ã確èªãã¦ããæ»ãã§ãããã¾ãã
èªååããããªã
ã¤ã³ãã©ãã³ã¼ãåããã®ã¯ãçååã人çãã¹ã®è»½æ¸ãããã主ãªç®çã ã¨æã£ã¦ãã¾ãã大æµã®ãã¨ã¯èªååã§ããã¨æã£ã¦ã¯ãã¾ãããç§ã¯"èªååã§ç²å¼ããããããªãããã¯ããæåã§è¯ã"ã¨ããèãæ¹ã§ããããã¥ã¡ã³ãã¨æä½æ¥ã§ã«ãã¼ããã®ã¯ç¾å®çãªè½ã¨ãæã ã¨èãã¦ãã¾ãããªã®ã§é©åº¦ã«è«¦ãã¾ããå ·ä½çã«ã©ãã諦ããã®ãã¨ããã¨åé ã§è¿°ã¹ãRDSå¨ãã¨ã...ã
ä»å¾ã®ãããããã¨
- ã³ã¢æ©è½ã®AWSå
- ã³ã³ããã®æå¹æ´»ç¨
- ã³ã¹ãåæ¸(ãã£ããã©ãéãªã®ã§...俺ã®...)
- è£å´ã®ãã¡ã©åãã¦ããé¨åãç´è§£ãã¦ãã
- ã¡ããã¨ãããã°åºç¤ãä½ãã¦ããª...
ãç´æ
ã³ã¢é¨åã¯æ©ããã¬ã¬ã·ã¼åãã¦ãã¾ãããansibleã§ã®å®è¡ã¯ãã¤ãããã¯ã¤ã³ãã³ããªã使ã£ã¦ããªãã£ãããéè¦ãªã¯ã¬ãã³ã·ã£ã«ãã³ã¼ãã«ãã¿æ¸ãã®ç®æããã£ããã¨ãç´ãããé¨åã¯å¤ã ããã¾ãããã®ä»ããã¨ãã¨è² åµã«ãªã£ã¦ããç®æãç§ãçã¿åºãã¦ãã¾ã£ãéãããã¾ãã ä¸ç·ã«æ´åãã¦ããã仲éãã»ããã§ãããã°åºç¤ããã¼ã¿åæåºç¤ãä½ããããããããªãããªããªããã¨ãå±±ã®ããã«ããã¾ããèå³ãæã£ã¦ãããæ¹ããã®è¨äºãè¦ã¦"è²´æ§ã®ããæ¹ã¯æ¢ã«----ç§ã2000å¹´åã«ééããéã ããã"ã¨æã£ãæ¹ãã¾ããã®ãã¿ããããæ¹ãªã©ãå¾ ã¡ãã¦ããã¾ãã
ããã