ã¯ããã«
SREãã¼ã ã® @minamijoyo ã§ãã å æ¥ CrowdWorks (crowdworks.jp) ã®æ¬çªç°å¢ã®Railsã¢ããªã±ã¼ã·ã§ã³ã Docker (AWS ECS: Elastic Container Service) ã«ç§»è¡ãã¾ããã
CrowdWorksã¯2012å¹´ã«ãµã¼ãã¹ãéå§ãã2019å¹´10æç¾å¨ãã¦ã¼ã¶æ°ã¯300ä¸äººãæéã§æ°ååè¦æ¨¡ã®ãä»äºãããã¨ãããããå½å æ大ç´ã®ã¯ã©ã¦ãã½ã¼ã·ã³ã°ãã©ãããã©ã¼ã ã«ã¾ã§æé·ãã¾ããã ãµã¼ãã¹ã®è¦æ¨¡æ¡å¤§ã«åããã¦ãã½ã¼ã¹ã³ã¼ããæ°åä¸è¡è¦æ¨¡ã«æé·ãã 決ãã¦å°ããã¯ãªãè¦æ¨¡ã®Railsã¢ããªã±ã¼ã·ã§ã³ã«æé·ãã¾ããã
CrowdWorksã®éçºç°å¢ã«Dockerãå°å ¥ãããã®ã¯ãããããã3å¹´ååã®2016å¹´ã®4æé ã2017å¹´1æé ã«ã¯CrowdWorksæ¬ä½ããåãåºãããä¸é¨ã®æ©è½ã§æ¬çªç°å¢ã«æå ¥ããã ãã®å¾æ°è¦ã«è¿½å ãããå¨è¾ºãµã¼ãã¹ãæ°è¦äºæ¥ãªã©ã§ã¯æåããDockerãå©ç¨ãããããã«ãªãã¾ããã ããããªããCrowdWorksã®ã³ã¢é¨åã§ããã¢ããªã·ãã¯ãªRailsã¢ããªã±ã¼ã·ã§ã³(é称CrowdWorksæ¬ä½)ã¯ãããããæ®éã®EC2ãµã¼ãã§é·ããéç¨ããã¦ãã¾ããã
éçºç°å¢ãæ°è¦ã®æ¬çªç°å¢ã«Dockerãå°å ¥ããã®ã¯ããã»ã©é£ããã¯ããã¾ããã ãããæ¢åã®æ¬çªç°å¢ãDockerã«ç§»è¡ããã«ã¯ãç¾è¡ã®ã·ã¹ãã ã®ä»æ§ãå¶ç´äºé ãªã©èæ ®ãã¹ããã¤ã³ããå¤ãå°é£ãä¼´ãã¾ãã ãããä¼ç¤¾ã®ä¸»åäºæ¥ã§ãããããªãã«è¦æ¨¡ã¨æ´å²ããWebã¢ããªã±ã¼ã·ã§ã³ãªãå°æ´ã§ãã å¤æ´ã«ä¼´ããªã¹ã¯ã大ããã®ã¯ãã¡ããã§ãããããããæ´å²ããWebã¢ããªã±ã¼ã·ã§ã³ã¯ã³ã³ãããã¬ã³ããªã¼ã§ã¯ãªããã¨ãå¤ãã Dockerã«ç§»è¡ããããã«ã¯åã«Dockerfileãæ¸ãã°ããã¨ããåç´ãªè©±ã§ã¯ããã¾ããã ã¢ããªã±ã¼ã·ã§ã³ã®ã¢ã¼ããã¯ãã£ã¬ãã«ã§ã®å¤æ´ãå¿ è¦ã§ãã
ãããæè¡çè² åµã¨è¨ã£ã¦ãã¾ãã®ã¯ç°¡åã§ãããããããDockerã®åæãªãªã¼ã¹ã¯2013å¹´ã§ãã¤ãã¥ã¼ã¿ãã«ãªã¤ã³ãã©ãæå±ãããããã«ãªã£ã¦ããã®ãããæ°å¹´ã®åºæ¥äºã§ãã ãããã以åããããã¢ããªã±ã¼ã·ã§ã³ã«ã³ã³ãããã¬ã³ããªã¼ãæ±ããã®ã¯ã¡ãã£ã¨å³ããããªã¨æãã¾ãã
CrowdWorksã§ã¯ããã¾ã§ããæ¬çªç°å¢ã§Dockerãå©ç¨ãã¦ãã¾ããããå°è¦æ¨¡ãªå¨è¾ºã®ãµã¼ãã¹ã§å©ç¨ãã¦ããã®æ©æµã¯éå®çã§ããã ã¨ããã®ããå¤ãã®æ©è½ã¯ä¾ç¶ã¨ãã¦CrowdWorksæ¬ä½ã«å®è£ ããã¦ãããç¶æ管çä¸ã®å¤ãã®åé¡ãå¿ ç¶çã«CrowdWorksæ¬ä½ã«é¢é£ããããã§ãã ã¨ã¯ããDockerã«ç§»è¡ããããã«è§£æ±ºãã¹ã課é¡ã¯å¤ããçµç¹çãªåªå 度ã®é«ãæ¡ä»¶ã次ãã次ã«éã£ã¦ãããããªããªãé£ããæ代ãç¶ãã¾ããã
ããããDockerã¨ããã½ããã¦ã§ã¢ãçãæ®ããã¯ãã¦ããã Webã¢ããªã±ã¼ã·ã§ã³ãã³ã³ããåãã¦ããæ代ã®æµãã¯å·»ãæ»ããã¨ã¯ãªãããã§ããã ã³ã³ãããã¬ã³ããªã¼ã§ã¯ãªãCrowdWorksæ¬ä½ããæ¯ãé£ããã°ã£ã¦å°ããã¤ã³ã³ãããã¬ã³ããªã¼ã«ãã¦ãããªãéããæã ã«å¹¸ãã訪ããªããã¨ã¯æããã§ããã
ãã®è¨äºã§ã¯ãã³ã³ãããã¬ã³ããªã¼ã§ã¯ãªãã£ãCrowdWorksæ¬ä½ã®Railsã¢ããªã±ã¼ã·ã§ã³ãDocker(ECS)ã«ç§»è¡ããããã«ãã£ããã¨ãç´¹ä»ãã¾ãã ç¶²ç¾ çãªã¿ã¹ã¯ã®ä¸è¦§ãæããã¨ã¡ãã£ã¨æ¸ããããªãã®ã§ãã³ã³ãããã¬ã³ããªã¼ã§ã¯ãªãä¾åããã©ããã£ã¦è±å´ããã®ããä¸å¿ã«ãããããã¤ã³ãã§å¦ãã ç¥è¦ãå ±æãã¾ãã
ç®æ¬¡
ã³ã³ããã¨ãåéã«ãªãã¾ã§
cronä¾åããã®è±å´
ã¾ãæåã«æãä»ããã®ã¯cronãããã§ãã å°ããªRailsã¢ããªã±ã¼ã·ã§ã³ã®ã¡ãã£ã¨ããããããcronã§æ¸ãã®ã¯ä½ãåé¡ããã¾ããããããã¹ã¢ã¼ã«ã¹ã¿ã¼ãã¨ãã¦ã¯ããã§ãããã ããããªãããã¡ãã£ã¨ãã¤ãããã追å ãããçµæãå½æã®CrowdWorksã«ã¯80åãããã®ããããå æ°ã«cronã§åãã¦ãããã©ã®ããããæå/失æãã¦ããã®ã管çãã¥ããç¶æ³ã§ããã ã¾ãcronã®å®ç¾©ã®ç®¡çã«ã¯ whenever ã¨ããgemã使ã£ã¦ã Capistrano ã§ãããã¤ããã¿ã¤ãã³ã°ã§crontabãçæãã¦ãã¾ããã ããã¯Railsã¢ããªã±ã¼ã·ã§ã³ã®ãªãã¸ããªã§ã¸ã§ãã¹ã±ã¸ã¥ã¼ã«ã管çã§ããã®ã§ã便å©ã§ããåé¢Dockeråããã¨ãã«ã¡ãã£ã¨é¢åãªãã¨ã«ãªãã¾ãã ã¨ããã®ãcronã¯è¤æ°ããã»ã¹ãããã¯ã°ã©ã¦ã³ãã§åãã¢ã¼ããã¯ãã£ã§ãããDockerã¯1ããã»ã¹ããã©ã¢ã°ã©ã¦ã³ãã§åãã¢ã¼ããã¯ãã£ãªã®ã§ãcrondãDockerã³ã³ããã®ä¸ã§ã¯ãªãå¤ã§åãããã¨ã«ãªãã¾ãã ã¤ã¾ãããã¯crontabã®å®ç¾©ãã³ã³ããã®å¤ã«å¿ è¦ã«ãªãã¾ãã
ãããã管çãã¥ããã¨ããçæçãªåé¡ã解決ãã¤ã¤ããã®å¾ã®Dockeråã¸ã®ä»è¾¼ã¿ã¨ãã¦ãã¾ãã¯ãã¸ã§ãã¹ã±ã¸ã¥ã¼ã©ã® Rundeck ãå°å ¥ãã¾ããã Rundeckã¯è¯ããæªããWebç»é¢ãä»ããé«æ©è½ãªcronã¿ãããªãã®ã§ããã¼ã¿ããã¼ã®ãããªã¸ã§ãã®ä¾åé¢ä¿ã®ãããããã管çããã«ã¯ä¸åãã§ãããcronããã®ç§»è¡å ã¨ãã¦ã¯ããã§ãããã ãã©ã°ã¤ã³ãå ¥ãããã¨ã§ã¸ã§ã失ææã®Slackã¸ã®éç¥ãªã©ãå¯è½ã§ããå ·ä½çã«ã¯ä»¥ä¸ã®ãã©ã°ã¤ã³ã使ãã¾ããã
- Rundeck Git Plugin : å ¬å¼ã®çµã¿è¾¼ã¿ãã©ã°ã¤ã³ã§ããã¸ã§ãå®ç¾©ã®ããã¯ã¢ããç¨ã«ä½¿ã£ã¦ã¾ãã
- Rundeck EC2 Nodes Plugin : SSHå ã®EC2ã¤ã³ã¹ã¿ã³ã¹ã®ä¸è¦§åå¾ã«ä½¿ã£ã¦ãã¾ãã
- Rundeck Fluentd Plugin : ã¸ã§ãã®å®è¡çµæãfluentdã«åºåããããã«ä½¿ã£ã¦ã¾ãã
- Rundeck Simple Slack Notification Plugin : ã¸ã§ãã®å®è¡çµæãSlackã«éç¥ããããã«ä½¿ã£ã¦ãã¾ãã
ã¾ããQiitaã«Tipsãããã¤ãæ¸ããã®ã§ããªã«ãã®åèã«ãªããã¨æãè²¼ã£ã¦ããã¾ãã
- Rundeckã®å段ã«nginxãé ç½®ãã¦httpsåãã
- oauth2_proxyã§Rundeckã«GitHubèªè¨¼ã§ãã°ã¤ã³ãã
- Rundeckã§æå®ã®æé帯ã«åãã¦ãã¸ã§ããç¹å®ãã
Rundeckãå°å ¥ãã¦ããã£ããã¨ã¯ãã¸ã§ãã®èª¬ææã«é害対å¿ã®æé ã®ã¡ã¢ãªã©ãæ¸ãããããã®ã§ãç¶æ管çã®ãã¦ãã¦ã®å ±æã«å¤§å¤ä¾¿å©ã§ãã éã«æ³¨æãã¹ããã¤ã³ãã¨ãã¦ã¯ãã¸ã§ãå®è¡ã®åº¦ã«å®è¡å±¥æ´ãªã©ã®ã¡ã¿ãã¼ã¿ãã§ããã®ã§ã1åééãªã©ã®çãã¸ã§ããã¹ã±ã¸ã¥ã¼ãªã³ã°ããã¨ãå®è¡ãã°ãè¥å¤§åãã¦éããªããã¡ãªã®ã§æä½5åééã§ãããããçããã®ã¯å¸¸é§ããã»ã¹ã«ãããªã©ãããã以å¤ã®æ¹æ³ã§åãããæ¹ãããããã§ãã ã¾ããéçºè ãèªç±ã«ã¹ã±ã¸ã¥ã¼ã«ç»é²ããã¨ãRundeckãã®ãã®ã®ã¡ã³ããã³ã¹ã¦ã£ã³ãã¦ã確ä¿ã§ããªããªãã®ã§ããã®æé帯ã¯ã¸ã§ããã¹ã±ã¸ã¥ã¼ãªã³ã°ããªãã§ãã¨ãããããªç¤¾å åãã®éç¨æ¨æºã®ã¬ã¤ãã©ã¤ã³ãä½ã£ãããã¾ããã
Postfixä¾åããã®è±å´ï¼ã¡ã¼ã«éä¿¡ç·¨ï¼
CrowdWorksã¯ã·ã¹ãã ä¸æ§ã ãªã¡ã¼ã«ãéä¿¡ãã¦ãã¾ãã ã¡ã«ãã¬é ä¿¡ã®ä»çµã¿ã¯CrowdWorksæ¬ä½ã¨ã¯å¥ãªã®ã§ãããä¾ãã°ä»äºã®å¿åãå¥ç´ãªã©ã®ã¤ãã³ãã®ã¿ã¤ãã³ã°ã§ã¦ã¼ã¶ã«ã¡ã¼ã«éä¿¡ããæ©è½ã¯CrowdWorksæ¬ä½ã«ããã¾ãã ã¡ã¼ã«éä¿¡ãã¦ã¼ã¶æ°ãå°ãªããã°ã©ã®ãããªã¢ã¼ããã¯ãã£ã§ãéä¿¡ã§ããã¨æãã¾ããã1æ¥æ°åä¸éè¦æ¨¡ãéä¿¡ãããã¨ããã¨å¤å°ã®å·¥å¤«ãå¿ è¦ã§ãã CrowdWorksã¯ã¡ã¼ã«é ä¿¡ã®åºç¤ã¨ã㦠SendGrid ãå©ç¨ãã¦ãã¾ããRailsã¢ããªã±ã¼ã·ã§ã³ããã¯ã¢ããªã±ã¼ã·ã§ã³ãµã¼ãã®ãã¼ã«ã«ã«ç«ã¦ãPostfixã§ãããã¡ãªã³ã°ãã¦SendGridã«éä¿¡ãã¦ãã¾ããã ããããªããPostfixã®ã¡ã¼ã«ãããã¡ã¨ã¯è¦ããã«ã¢ããªã±ã¼ã·ã§ã³ã®ç¶æ ãªã®ã§ããããã¤ãã¦ã³ã³ãããåèµ·åããã¨æªéä¿¡ã®ã¡ã¼ã«ã®å 容ããªããªã£ã¦ãã¾ãã¾ããã³ã³ããåããå ´åã«Postfixãã©ãã«ãããå¿ è¦ãããã¾ããã Postfixã ãå¥ã«ã¡ã¼ã«ãµã¼ãã¨ãã¦åãåºãã¨ããé¸æè¢ããªãã¯ãªãã§ããããããªãã®æµéã¨å¯ç¨æ§ãæ±ããããã¡ã¼ã«ãµã¼ãã¯ã§ããã°ç®¡çãããããã¾ãããã¨ããããã§Postfixãå»æ¢ãã¦SendGridã¸ç´æ¥éä¿¡ãããã¨ã«æ±ºãã¾ããã
ã¾ãã¯æ¥ç¶æ§æãå¤æ´ããäºåæºåã¨ã㦠ã Postfixã®ã¬ã¤ã¤ã§å¦çãã¦ãããã¹ãç°å¢ã®ã¡ã¼ã«èª¤çé²æ¢å¦ç ãã¢ããªã±ã¼ã·ã§ã³ã¬ã¤ã¤ã«ç§»æ¤ãã¾ãããããã¯ããã¹ãç°å¢ã§ãã£ãã社å¤ã«ã¡ã¼ã«éä¿¡ããªãããã«ã@crowdworks.co.jp
以å¤ã¸ã®ã¡ã¼ã«éä¿¡ãå¶éããä»çµã¿ã ã£ãã®ã§ããã
Postfixãçµç±ããã«ã¡ã¼ã«ãéãå ´åãã¢ããªã±ã¼ã·ã§ã³ã®ã¬ã¤ã¤ã§ãã§ãã¯ããå¿
è¦ãããã¾ãã
ããã«ã¯ mail_interceptor ã¨ããgemã使ãã¾ããããã®gemã使ãã¨æå®ã®ãã¡ã¤ã³ä»¥å¤ã¸ã®ã¡ã¼ã«éä¿¡ã®å®å
ãæ¸ãæãããã¨ãå¯è½ã§ãã
ä»çµã¿çã«ã¯ActionMailerã®ï¼å³å¯ã«ã¯mail gemã®ï¼interceptorã¨ããæ©è½ã§å®è£
ããã¦ãã¾ãã
æºåãã§ããã®ã§ã試ãã«ä¸é¨ã®ãµã¼ãã ãåç´ã«Postfixãçµç±ããã«SendGridã«éä¿¡ãã¦ã¿ãã¨ãããå½ããåã§ããã¡ã¼ã«éä¿¡ã®ããã©ã¼ãã³ã¹ãä¸ããã¾ããã å¦çããããã»ã¹æ°ãå¢ãããããã¦ãå¤å°ããã©ã¼ãã³ã¹ã¯æ¹åãã¾ããããããããªããã¡ã¼ã«éä¿¡ã®åº¦ã«é½åº¦SMTPã³ãã¯ã·ã§ã³ãå¼µãæ§é èªä½ã¯å¤ããã¾ããã ã¾ãSendGridã«SMTPæ¥ç¶/åæãé«é »åº¦ã§è¡ãã¨ä¸å®æã«æ¥ç¶ã¨ã©ã¼ãè¿ããã¨ãåããã¾ããã
ãã®æç¹ã§SendGridã®WebAPIã¸ã®ç§»è¡ãæ¤è¨ããã®ã§ããã調ã¹ãã¨ãã WebAPIã¯æåã³ã¼ããæå®ã§ãã ãã¡ã¼ã«éä¿¡ã®æåã³ã¼ããISO-2022-JPããUTF-8ã«å¤æ´ããå¿ è¦ãããã¾ããã ç¾ä»£ã§UTF-8ã®ã¡ã¼ã«ãèªããªã人ãªã©ããã®ã ãããã¨ããæ°æã¡ãããã¤ã¤ãã¨ã³ãã¦ã¼ã¶ã®ç°å¢ã«ä¾åãã¦å½±é¿ç¯å²ãèªã¿ãããªãã¨ãããããããããªãã¡ããã¨èª¿æ»ï¼æ¤è¨¼ãã¦ããããã®ã§WebAPIã¸ã®ç§»è¡ã¯ä¸æ¦è¦éãã¾ããã
æ¹ãã¦ããèããã¨ããããããªã³ã©ã¤ã³å¦çã®ä¸ã§ã¡ã¼ã«éä¿¡ãè¡ã£ã¦ããç®æã§SendGridã¨æ¥ç¶ã¨ã©ã¼ã«ãªãã¨ãããã¾ã§ã¯Postfixã®ã¡ã¼ã«ãããã¡ã§åéããã¦ããã®ããã¢ããªã±ã¼ã·ã§ã³ã¬ãã«ã§ã®ã¨ã©ã¼ã«ãªãã¡ã¼ã«ãåéã§ãã¾ããã ã¨ããããã§ã¨ã«ããã¡ã¼ã«éä¿¡å¦çãéåæã«ãã¾ããä½æ¦ã«åºã¾ãããéåæå¦çãªãæ¥ç¶ã¨ã©ã¼ã§ãã¡ãã£ã¨å¾ ã£ã¦ãªãã©ã¤ãå¯è½ã ããã§ãã å½æCrowdWorksæ¬ä½ã§ã¡ã¼ã«éä¿¡ããã¦ããç®æã¯200ç®æããããããä¸é¨ã®å¦ç㯠delayed_job ã使ã£ã¦éåæã«éä¿¡ããã¦ããã®ã§ãããåæçã«éä¿¡ããã¦ããç®æãæ¹ãã¦è¦ç´ãã¦ã¿ãã¨ãå¿ ãããåæçã«éãå¿ è¦ããªããã¨ãåããã¾ããã ã¨ããããã§ãä¼å¡ç»é²/éä¼/ãã¹ã¯ã¼ããªã»ãããªã©å³æã«ã¡ã¼ã«ãéãã¹ãä¸é¨ã®ä¾å¤å¦çãé¤ããã¡ã¼ã«éä¿¡ãã¦ããç®æãéåæå¦çã«æ¸ãæãã¾ããã¾ãããä½ãå¤æ´ããã«ãæ°ã®æ´åã¤ããã§ãã
å¤å°ã®ããã©ã¼ãã³ã¹ã®å£åã¯éåæå¦çã«ãã¦å¦çããããã»ã¹æ°ãå¢ãããªã©ã§è§£æ±ºã®ç®å¦ãç«ã¡ã¾ããããåé¡ã¯ããã ãã§ã¯ããã¾ããã§ããã
ã¨ã©ã¼ãç£è¦ãã¦ããã¨ãããã¤ãã®ã¡ã¼ã«ãã¢ãã¬ã¹ãã©ã¼ãããä¸æ£ã§å¼¾ããããã¨ãåããã¾ããã
調æ»ã®ããéä¿¡ãããã¨ãã¦ããçãã¼ã¿ã確èªããã¨ãã¡ã¼ã«ã¢ãã¬ã¹ã®ãã¡ã¤ã³é¨åã« hoge@example .com
ã®ããã«ãã¡ã¤ã³åã®ä¸é¨ã«åè§ã¹ãã¼ã¹ãå«ãã¦ã¼ã¶ãè¤æ°ãã¦ãã¨ã©ã¼ãçºçãã¦ãã¾ããã
ããããªããéå»ã®ã¡ã¼ã«éä¿¡ã®ãã°ããã¯ããããã®ã¡ã¼ã«ã¢ãã¬ã¹ã«ã¯ã¡ã¼ã«ã¯éä¿¡ã§ãã¦ããããã§ãã
調ã¹ãã¨ãããã©ãããã¡ã¼ã«ã¢ãã¬ã¹ã®å®å ã®ãã©ã¼ãããã«ã¯æ´å²ããããæ㯠RFC822 ã§ãã¡ã¤ã³é¨åã«åè§ã¹ãã¼ã¹ãå ¥ã£ã¦ãã®ãæå¹ãªãã©ã¼ãããã ã£ããããããã®å¾ RFC2822 ã§èªããããªããªã£ã¦ãã¾ãã以ä¸RFC2822ããã®å¼ç¨ã§ãã ï¼â»æ³¨: æ¬æä¸ã«ããCFWSã¨ããã®ã¯ç°¡åã«è¨ãã¨ãã¯ã¤ãã¹ãã¼ã¹ã®ãã¨ã§ããå³å¯ã«ã¯3.2.3ã§å®ç¾©ããã¦ãã¾ããï¼
4.4. Obsolete Addressing There are three primary differences in addressing. First, mailbox addresses were allowed to have a route portion before the addr-spec when enclosed in "<" and ">". The route is simply a comma-separated list of domain names, each preceded by "@", and the list terminated by a colon. Second, CFWS were allowed between the period-separated elements of local-part and domain (i.e., dot-atom was not used). In addition, local-part is allowed to contain quoted-string in addition to just atom. Finally, mailbox-list and address-list were allowed to have "null" members. That is, there could be two or more commas in such a list with nothing in between them. A.6.1. Obsolete addressing Note in the below example the lack of quotes around Joe Q. Public, the route that appears in the address for Mary Smith, the two commas that appear in the "To:" field, and the spaces that appear around the "." in the jdoe address. ---- From: Joe Q. Public <[email protected]> To: Mary Smith <@machine.tld:[email protected]>, , jdoe@test . example Date: Tue, 1 Jul 2003 10:52:37 +0200 Message-ID: <[email protected]> Hi everyone. ----
ãã®åæ®ãéã«å ¥ã£ã¦ãPostfixãäºææ§ç¶æã®ããã«(?)æé»ã«ã¹ãã¼ã¹ãåé¤ãã¦ããããã§ãããPostfixã®ããã¥ã¡ã³ãããã¯ãã®ãããªæåã«ã¤ãã¦èª¬æã¯è¦ã¤ããããªãã£ãã®ã§ããã試ãã¦ã¿ãã¨ãã®ãããªåä½ããã¦ãã¾ããã åè§ã¹ãã¼ã¹ãã¡ã¼ã«ã¢ãã¬ã¹ã®ä¸é¨ã«å ¥ã£ã¦ãã¾ãçç±ã¯ã仮説ã®åãåºã¾ããããã¹ããå ¥åããã¨ãã®ãããªå¾åãããããã§ãã
æ¬æ¥ã§ããã°å ¥åå¤ã®ããªãã¼ã·ã§ã³ã§å¼¾ãã¹ãã¨ããã§ãããæ®å¿µãªããå½æã¡ã¼ã«ã¢ãã¬ã¹ã®ããªãã¼ã·ã§ã³å®è£ ã®ã«ã¼ã«ãè¥å¹²ç·©ãããã®ãããªãã¼ã¿ãæ°¸ç¶åããã¦ãã¾ã£ã¦ããã¾ããã 対çã¨ãã¦ãã¾ãã¯ã¡ã¼ã«ã¢ãã¬ã¹ãå ¥åå¯è½ãªå ´æã®å ¥åå¤ã®ããªãã¼ã·ã§ã³ãå¼·åãã¾ããã 次ã«ãæ¢ã«æ°¸ç¶åããã¦ãããã¼ã¿ã®ãã¡ããã©ã¼ãããä¸æ£ãã¤ã¡ã¼ã«ã¢ãã¬ã¹ç¢ºèªæ¸ã¿ã®ãã¼ã¿ã調æ»ãããã¼ã¿ã®è£æ£ä½æ¥ãè¡ããã¨ã§ãæ£å¸¸ã«ã¡ã¼ã«ãéä¿¡ã§ããããã«ãªãã¾ããã
ç§ã¯ãã Dockeråãããã£ãã ããªã®ã«ããªãã§ãããªãã¨ããã¦ãããã ããã¨æãã¤ã¤ãyak shavingæãã³ããªãã
ããã§æ®å¿µãªãç¥ããã§ãã
Postfixããã£ã¦ãããã¨ã¯ã¡ã¼ã«éä¿¡ã ãã§ã¯ããã¾ãããã¡ã¼ã«åä¿¡ãããã¾ãã(。âáºâ)
Postfixä¾åããã®è±å´ï¼ã¡ã¼ã«åä¿¡ç·¨ï¼
CrowdWorksã®ã·ã¹ãã ããéä¿¡ãããã¡ã¼ã«ã®éä¿¡å
ã®ã¡ã¼ã«ã¢ãã¬ã¹ã¯ [email protected]
ã¨ãªã£ã¦ããã®ã§ããã
ãã®éä¿¡å°ç¨ã®ã¡ã¼ã«ã¢ãã¬ã¹ã«ããã£ããè¿ä¿¡ãã¦ãã¾ãæ¹ãä¸å®æ°ããã®ã§ããã®ã¡ã¼ã«ã¢ãã¬ã¹å®ã«éä¿¡ãããã¡ã¼ã«ãåä¿¡ãã¦ãéä¿¡å°ç¨ã¢ãã¬ã¹ã§ããæ¨ããç¥ããããã¹ããæ©è½ãããã¾ããã
ããã¯Postfixã§ã¡ã¼ã«ãåä¿¡ãã¦ãRubyã®ã¹ã¯ãªããã§ãã¼ã¹ããéä¿¡è
ã«èªåã§è¿ä¿¡ãããããªä»çµã¿ã§åãã¦ãã¾ããã
ã¾ãããã¡ã¤ã³ç®¡çè
å®ã®ã¡ã¼ã«ãã社å
ã®ã¡ã¼ãªã³ã°ãªã¹ãã«èªå転éãããããªè¨å®ãPostfixã«ããã¦ãã¾ããã
Postfixã®ä¾åãæ¨ã¦ãããã«ã¯ããã®ã¡ã¼ã«èªåè¿ä¿¡ï¼è»¢éæ©è½ããªãã¨ãããå¿
è¦ãããã¾ããã
ã¡ã¼ã«åä¿¡ã¯ããã»ã©æµéãå¤ããªãã¯ãªãã£ã«ã«ãªä½¿ããæ¹ã¯ãã¦ããªãã£ãã®ã§ããã£ã±ããæ軽ã«ã¡ã¼ã«ãµã¼ãå¥ã«ç«ã¦ããã¨ããèªæãå¤å°ããã¾ãããã ã¡ã¼ã«ãµã¼ãã¯ãã®æ§è³ªä¸ã¤ã³ã¿ã¼ãããanyã«å ¬éããå¿ è¦ããããã»ãã¥ãªãã£ãããé©ç¨ã®éç¨ãèããã¨ããã£ã±ã管çãããããã¾ããã ã¨ããããã§ã AWS SES (Simple Email Service) + SNS (Simple Notification Service) + Lambdaã§ãµã¼ãã¬ã¹æ§æã«ãã£ã¬ã³ã¸ãã¦ã¿ã¾ããã
AWS SESã¯ã¡ã¼ã«éä¿¡/å信両æ¹ã§ãã¾ãããåä¿¡æ©è½ã®ã¿ãå©ç¨ããè¿ä¿¡ã転éãªã©ã§ã¡ã¼ã«éä¿¡ãå¿ è¦ãªç®æã¯SendGridçµç±ã«éç´ãã¾ããã ããã¯ã¡ã¼ã«éä¿¡ããã«ã¯ãã¡ã¤ã³èªè¨¼ããã¦ã³ã¹ã®ç®¡çãªã©ãå¿ è¦ã«ãªãããã§ãã
ã¾ãSESã¨Lambdaãé£æºãããå ´åãSESããç´æ¥Lambdaãããã¯ãããã¿ã¼ã³ã¨ãSES => SNS => Lambda ã§SNSãæããã¿ã¼ã³ã®2種é¡ã®é¸æè¢ãããã¾ãããè¥å¹²ã¡ãªãã¡ãç°ãªãã¾ãã
SESããLambdaãç´æ¥ããã¯ããå ´åã¯ãã¡ã¼ã«æ¬æã¯å ¥åã¤ãã³ãã«å«ã¾ãããã¡ã¼ã«æ¬æã¯S3ãçµç±ãã¦å¥éåå¾ããå¿ è¦ãããã¾ãã ä¸æ¹ãSNSãçµç±ããå ´åã150KB以ä¸ã®ã¡ã¼ã«ãåä¿¡ã§ããªãã¨ããå¶éãããã¾ãããã¡ã¼ã«æ¬æãå ¥åã¤ãã³ãã«å«ã¾ãã¾ãã
ä»åã¯æ·»ä»ãã¡ã¤ã«ãªã©å¤§ããªãã¼ã¿ãæ±ããªããããå®è£ ãç°¡åãªSNSãçµç±ããæ§æã«ãã¾ããã
ãã®æã®ã¤ã³ãã©ç³»ã®ã¡ãã£ã¨ããæ©è½ã¯å人çã«ã¯Goã§æ¸ããã¨ãå¤ãã®ã§ããããã®ç§»æ¤ä½æ¥ããããã¨ãã¦ããå½æãã¡ããã©AWS Lambdaã®å ¬å¼Rubyãµãã¼ããçºè¡¨ããã移æ¤å ã®ãªãªã¸ãã«ãRubyã ã£ããã¨ãããã ä»äºãªã®ã§ä»æ¹ããªããªã¼ããã¼ä»æ¹ããªãï¼æ£èªã¿ï¼ã¨ã¶ã¤ã¶ã¤è¨ããªãããRuby on Lambdaã§éã³ã¾ããã ã¾ãCrowdWorksã§ã¯Lambdaã®ãããã¤ã« apex ã¨ãããã¼ã«ã使ã£ã¦ããã®ã§ããã Ruby対å¿ããããã®ããã ãæ¸ãã¦ã³ã³ããªãã¥ã¼ããããããã¾ããã
ããããRuby対å¿ã®ãããã¯ããã«ãã¼ã¸ãã¦ããããã®ã§ãããæ®å¿µãªãã¨ã«apexã¯ãããæ¸ãã¦ã2019å¹´10æç¾å¨ãã¡ã³ããã³ã¹åæ¢ç¶æ ã«ãªã£ã¦ããã®ã§æ³¨æãå¿ è¦ã§ãã ã¡ã³ããã®æ¹ããªããªãæéãåãããããã¿ã¤ãºã®ç®å¦ãç«ã¤ã¾ã§ä¸æ¦åæ¢ããã¨ã®ãã¨ã§ããã¯ã¼ãOSSã¯é£ããã§ããã æ¢åã®apexã使ã£ã¦ããããã¸ã§ã¯ããããã«å¥ã®ãã¼ã«ã«ç§»è¡ããå¿ è¦æ§ã¯ãªãã¨ã¯æãã¾ãããæ°è¦ã®ããã¸ã§ã¯ãã§apexæ¡ç¨ããã®ã¯ç¾æç¹ã§ã¯ããããã§ãã¾ããã apexã¯AWS Lambdaãæ£è¦ã«Goã©ã³ã¿ã¤ã ããµãã¼ãããåãããGoã§æ¸ãã¦ãã«ããããã¤ããªãNodeã©ã³ã¿ã¤ã ã§åãããã¨ã«ããæ¬ä¼¼çã«Goããµãã¼ããã¦ããå人çã«éå®ãã¦ããã¾ãããã ãã®å¾ Go ãAWS Lambdaã§æ£å¼ã«ãµãã¼ããããã®ã§ãããã¦apexã使ãã¡ãªããã¯èãã¦ãã¦ããããã«æãã¾ãã
å®è£ ãã¦å®éã«ã¡ã¼ã«ãåä¿¡ãã¦ã¿ãã¨ãèªåè¿ä¿¡ã¯æ¦ãåé¡ãªãåãã¾ãããã転éã«ã¯è¥å¹²åé¡ããããã¨ããããã¾ããã Postfixã§ã¯ã¡ã¼ã«è»¢éããã¨ãã«SMTPã§éãã¦ããã®ã§ãéä¿¡å ã¡ã¼ã«ã¢ãã¬ã¹ãç¶æããå½¢ã§ã¡ã¼ã«è»¢éãã§ããã®ã§ããã SESãæãã§ãã¾ãã¨ããã§SMTPãããã³ã«ã¨ãã¦ä¸æ¦çµç«¯ãã¦ãã¾ããå¾ç¶ã®å¦çã«ã¯ã¡ã¼ã«ãã¼ã¿ããã ã®æååã¨ãã¦æ¸¡ãããã®ã§ãLambdaããå¥ã®ã¡ã¼ã«ã¢ãã¬ã¹ã«è»¢éãããã¨ããã¨ãå½ç¶ãªããéä¿¡å ã¡ã¼ã«ã¢ãã¬ã¹ãå¼ãç¶ããã¨ã¯ã§ãã¾ããã ä»åã¯ããã¡ã¤ã³ç®¡çè å®ã®ã¡ã¼ã«ã®å 容ãèªããã°å®å®³ãªãã®ã§ã転éããéã«ãªãªã¸ãã«ã®ã¡ã¼ã«ããããæ¬æã®å é ã«å·®ãè¾¼ãã§éä¿¡ãç´ãããã«ãã¾ããããä¸è¬çãªã¡ã¼ã«è»¢éã®ç¨éã«ä½¿ãã®ã¯ã¡ãã£ã¨é£ããããªå°è±¡ã§ãã
ã¾ãã転éã®æ¬æãå å·¥ããããã«ã¡ã¼ã«ã®æ¬æããã¼ã¹ããå¿ è¦ãããã®ã§ããã ãã¡ã¤ã³ç®¡çè å®ã«å±ãã¡ã¼ã«ã«HTMLãã¼ããããªãã¦ãTEXTãã¼ãããããã¨ãåæã«ãã¦ããã¨ãã¼ã¹ã«å¤±æãããã¨ããã£ããã éä¿¡å ã®ã¡ã¼ã©ã®ããã°ã©ã ã«ããã®ãcharsetã®æå®ããã¾ããã¼ã¹ã§ããªããã¿ã¼ã³ãè¦ã¤ãããã ã¡ã¼ã«ã®ä¸çã¯ããªã¨ã¼ã·ã§ã³ãããããã§ãã¡ã¼ã«é£ããã§ããã¡ã¼ã«ä½ãããããªãã
ããã«ã¤ã³ã¿ã¼ãããanyã«æãã¦ããã¨ã¹ãã ãHTMLã¡ã¼ã«ãæ·»ä»ãã¡ã¤ã«ãæãã¦ãã¦ã150KBãè¶ ããå ´åãããã¾ããã ä»åã®ç¨éã§ã¯ã150KBãè¶ ãããã®ã¯åºæ¬çã«ãªãã®ã§ãçè«ä¸å®å®³ãªãã¯ããªã®ã§ããã æ©ã¾ãããã¨ã«ã150KBãè¶ ããå ´åã¯CloudWatch ã®ã¡ããªã¯ã¹ã«SES => SNSã®PublishFailureã¨ãã¦è¨é²ãããã ãã§ãä½ãåå ã ã£ãããç¹å®ããæ段ãããã¾ãããã¤ããã ä»æ¹ããªãã®ã§SESã®åä¿¡ã«ã¼ã«ã§ããªãªã¸ãã«ã®ã¡ã¼ã«ã®çãã¼ã¿ããããã°ç¨ã«S3ã«ä¿åããããã«ãã¦ãS3ã®ã©ã¤ããµã¤ã¯ã«ã«ã¼ã«ã§ä¸å®æéãéãããã®ã¯åé¤ãããããªè¨å®ã追å ãã¾ããã
çµå±S3ã«ã¡ã¼ã«ãã¼ã¿ãä¿åãããã¨ã«ãªã£ãã®ã§ãSES => Lambdaã§SNSæã¾ãªãæ¹ãããã£ãã®ã§ã¯ãªããã¨è¥å¹²è² ããæ°æã¡ã«ãªãã¾ããã SNSçµç±ã§åãåãã¨ã¤ãã³ãã«ã¡ã¼ã«æ¬æãå ¥ã£ã¦ãã®ã§ãLambdaã®ãã¹ãæ¸ãããããã®ãç°¡åã§ããã£ãã®ã§ããã éç¨ãèããã¨SES=>S3ã«ä¿åãã¤ã¤ãSES=>Lambdaãããã¯ããæ§æã®æ¹ãæå ãããã«æãã¾ãã
Postfixã®ä¾åãæ¨ã¦ãããã«ã ãã¶é ãã¨ããã¾ã§æ¥ã¦ãã¾ã£ãæ°ããã¾ããããã£ã¦ã¿ãªãã¨åãããªãå¦ã³ãå¤ãã£ãã§ãã å¦ãã ãã¨ãè¦ç´ããã¨ã
ã¡ã¼ã«ã¯ã·ã³ãã«ã§ã¯ãªãã 顧客ãæ±ãã¦ããã®ã¯ãAWS SES (Simple Email Service)ã§ã¯ãªããããã¼ã¸ããªElastic Postfixã ã£ãããã§ãã
ã¨ããããã§ãAWSãããããããé¡ããã¾ã |Ïã»`ï¼ãã©ã
Capistranoä¾åããã®è±å´
Postfixã®ä¾åãæ¨ã¦ã¦Dockeråã¸ã®ç®å¦ãç¾å®çã«ãªã£ã¦ãããããã§ããããã¤å¨ãã®æ´åãã¯ããã¾ããã CrowdWorksã®Railsã¢ããªã±ã¼ã·ã§ã³ã®ãããã¤ã¯ Hubot 㨠Capistrano ãçµã¿åããã¦ãSlackããChatopsã§ãããã¤ã§ããããã«ãªã£ã¦ãã¾ããã Capistranoã¯Railsã¢ããªã±ã¼ã·ã§ã³ã®ãããã¤ã§ãã使ãããå®çªãã¼ã«ã§ãããåºæ¬çã«å¯¾è±¡ãµã¼ãã«ãªãªã¼ã¹ç©ãpushåã§é å¸ããã®ã§ããããDockerã¨ã®ç¸æ§ãããããã¾ããã Dockerã§ãããã¤ããå ´åã¯ããªãªã¼ã¹ããã³ã¼ããå«ãã Dockerã¤ã¡ã¼ã¸ããã«ããã¦ã¿ã°ãæã¡ãDockerã®ã¯ã©ã¹ã¿ã§å¿ è¦ãªã¤ã¡ã¼ã¸ãpullãã¦åæ ãããpullåã®ãããã¤ãä¸è¬çã ããã§ãã æ¢ã«CI㯠CircleCIãå©ç¨ãã¦ããã®ã§ãDockerã¤ã¡ã¼ã¸ã®ãã«ãããECSã¯ã©ã¹ã¿ã¸ã®åæ ã®æ示ãªã©ã®ãããã¤ãã¤ãã©ã¤ã³ããCircleCIã®Workflowã¨ãã¦å®è£ ãããã¨ã«ãã¾ããã
å®è£ ããä¸ã§ããã¤ãå¶ç´æ¡ä»¶ãããã¾ãããã大éæã«è¨ãã¨ä»¥ä¸2ã¤ã§ãã
- æ°ç°å¢ã¸ã®ç§»è¡ä½æ¥ã«ã¤ãã¦ãä¸æ°ã«åãæ¿ããã®ã¯ãªã¹ã¯ãé«ãã®ã§æ§ç°å¢ã¨æ°ç°å¢ã«åããªãã¸ã§ã³ããããã¤ãã¦ä¸¦è¡ç¨¼åããããã
- ãããã¤å®äºå¾ã«ãSlackéç¥ããã±ããã®ã¯ãã¼ãºãç£è¦ç³»çµ±ã¸ã®ãããã¤ã¤ãã³ãéç¥ãªã©å¾ç¶ã®å¦çãããã
ã¨ãããã¨ãããHubotã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ã¯ç¶æããªããã並è¡ç¨¼åæéä¸ã¯æ§ç°å¢ã¨æ°ç°å¢ã«ä¸¡æ¹ã«ãããã¤ã§ããããã«ãã¾ããã ãããCircleCIã§å®ç¾ããããããããã¤ç¨ã®ãã©ã³ããç¨æãã¦ãã®ãã©ã³ãã ãã§çºåããWorkflowãå®ç¾©ãã Hubotããæ§ç°å¢ã¸ã®ãããã¤å¦çã«å ãã¦ãæ°ç°å¢ç¨ã¸ã®ãããã¤ããããã¤ç¨ã®ãã©ã³ãã¸ã®force pushã§CircleCIãããã¯ãããããªæ§æã«ãã¾ããã
ä¸ç¹æ¸å¿µç¹ã¨ãã¦ãCrowdWorksã®CircleCIã®è¨å®ãã¡ã¤ã« .circleci/config.yml
ã¯æ¢ã«1000è¡è¿ãããã
ããã«ããã«ãããã¤ãã¤ãã©ã¤ã³ã®ã³ã¼ãã追å ããã®ã¯ã人é¡ã®ç解ãè¶
ããããªæ¸å¿µãããã¾ãããã¤ã¾ãã
é«åº¦ã«çºéããCircleCIã®è¨å®ã¯éæ³ã¨åºå¥ãã¤ããªãã
ãªããããæ¹æ³ã¯ãªããã®ãã¨ãCircleCIã®å·¨å¤§ãªYAMLãåå²ãã¦includeãããããªãã£ã¬ã¯ãã£ãã欲ããã¦ãFeature Requeståºãããã¨æã£ã¦ãã®ã§ããã調ã¹ã¦ããããã¼ã«ã«orbã®Feature Requestãåºã¦ãã¦ã
ã³ã¡ã³ãã§ã¯ã¼ã¯ã¢ã©ã¦ã³ãã¨ã㦠circleci config pack
ã¨ããYAMLããã¼ã¸ããã³ãã³ããç´¹ä»ããã¦ãã¾ããã
CCI-I-704: Local orbs in seperate yml files
ããã使ãã¨èªåã§ãã¼ã¸ã¯ãã¦ãããªããã®ã®ããã¡ã¤ã«åå²ããããã¨ã«ããå¾ãããè¦éãã®è¯ããå¾ãããã®ã§ããã¡ã¤ã«åå²ãã¦ã³ãããåã«ãã¼ã¸ããæ¹æ³ãæ¡ç¨ãã¾ããã
ã¾ããCircleCIããECSã¸ã®ãããã¤ã«ãè¥å¹²å·¥å¤«ãå¿ è¦ã§ããã CrowdWorksã§ã¯ ã¤ã³ãã©ã®ã³ã¼ã管çã« Terraform ãå©ç¨ãã¦ãã¾ãã CircleCIããECSã¸ãããã¤ããå ´åãTerraformã§ECSã¿ã¹ã¯å®ç¾©ãã©ããã£ã¦ç®¡çããã®ããåé¡ã§ããã
Dockerã®ä¸è¬çãªãã¹ããã©ã¯ãã£ã¹ã¨ãã¦Dockerã¤ã¡ã¼ã¸ãlatestãªã©ã®ã¿ã°ã§ãããã¤ããã¨ã docker pullããªãããªãã¨åæ ãããªãããç¾å¨ãããã¤ããã¦ããã½ã¼ã¹ã³ã¼ãã®ãªãã¸ã§ã³ãããããªãã®ã§ã ã¤ã¡ã¼ã¸ã¿ã°ã«ã½ã¼ã¹ã³ã¼ãã®gitã®SHA1ãåãããããªéç¨ããããã¾ãã
ããã¾ã§ECSã§æ°ããDockerã¤ã¡ã¼ã¸ããããã¤ããå ´åã«ããDockerã®ã¤ã¡ã¼ã¸ã¿ã°ã«gitã®SHA1ãªã©ãåãã¦ããã ECSã¿ã¹ã¯å®ç¾©ãã³ãã¼ãã¦ã¤ã¡ã¼ã¸ã¿ã°ãæ¸ãæããæ°ãããªãã¸ã§ã³ãä½æãã ECSãµã¼ãã¹ãæ°ããã¿ã¹ã¯å®ç¾©ã使ãããã«æ´æ°ãã¦ãããã¤ããã¨ããæ¹æ³ããã使ã£ã¦ãã¾ããã ãããã®ãããã¤ããã¼ãèªååããããã® ecs-deploy ã¨ãããã¼ã«ãããã¾ããã CrowdWorksã§ã¯ecs-deployãGoã«ç§»æ¤ãã ecs-goploy ã¨ããããã¾ã§ãã¼ã«ã使ã£ã¦ãã¾ããã
ãã®ãããªãããã¤æ¹æ³ãã¨ã£ãå ´åãECSã¿ã¹ã¯å®ç¾©ã®ãªãã¸ã§ã³ã¯ã¢ããªã±ã¼ã·ã§ã³ã³ã¼ãã®ãããã¤ã®åº¦ã«å¤æ´ã«ãªãã¾ãã ããããªãããECSã¿ã¹ã¯å®ç¾©ãTerraformã§ç®¡çãã¦ããã¨ããã®å¤æ´ãå·®åã¨ãã¦æ¤ç¥ããã¦ãã¾ãã®ã§ã ECSãµã¼ãã¹ã¨ECSã¿ã¹ã¯å®ç¾©ã®éã®é¢é£ã Terraform ã®lifecycleã«ã¼ã«ã§ãignore_changes ãããããªè¨å®ããã¦ãã¾ããã ãã ãã®æ¹æ³ã ã¨ãDockerã¤ã¡ã¼ã¸ä»¥å¤ã®ECSã¿ã¹ã¯å®ç¾©å ã®è¨å®ãå¤æ´ããå ´åã«ãåæ ããã®ã«ã¢ããªã±ã¼ã·ã§ã³ã®ãããã¤ç¶æ ã¨æ´åæ§ã¨åãã®ãé£ããã§ãã
ãªã«ãè¯ãæ¹æ³ã¯ãªããã®ãã¨ECSã¨ã¼ã¸ã§ã³ãã®è¨å®ã調ã¹ã¦ãããã ECS_IMAGE_PULL_BEHAVIOR=always
ã¨ããè¨å®é
ç®ããããdocker pullãå¼·å¶ã§ãããã¨ã«æ°ã¥ãã¾ããã
Amazon ECS ã³ã³ããã¨ã¼ã¸ã§ã³ãã®è¨å®
ããã使ãã¨ãTerraformã§ECSã¿ã¹ã¯å®ç¾©ãã©ããã£ã¦ç®¡çããã®ãåé¡ã解決ãã¾ãã
ããã§ã¯èª¬æã®ããããªãªã¼ã¹åã®ç¾å¨ç¨¼åãã¦ãããã¼ã¸ã§ã³ãrelease-111111
(111111ã¯gitã®SHA1) ã¨ããããã« production-current
ã®ã¿ã°ãä»ãã¦ãããã®ã¨ãã¾ãã
- æ°ããã¤ã¡ã¼ã¸ããªãªã¼ã¹ããå ´åãdocker buildãã¦
release-222222
ã¨production-latest
ããã¿ã°ãä»ãã¦ECRã«pushãã¾ãã - ãªãªã¼ã¹ããç´åã«ã ç¾å¨ã®
production-current
ã¿ã°ããã¼ã«ããã¯ç¨ã«production-old
ã¿ã°ã«ã³ãã¼ãã¦ããã¯ã¢ãããã¾ãã - ãªãªã¼ã¹ããã¿ã¤ãã³ã°ã§ã
production-latest
ã¿ã°ãproduction-current
ã¿ã°ã«ã³ãã¼ãã¾ãã
ãã㧠release-222222
ã« production-current
ãä»ããç¶æ
ã«ãªãã®ã§ã aws ecs update-service --force-new-deployment
ã使ã£ã¦Dockerã¤ã¡ã¼ã¸ããããã¤ãã¾ãã
ãã®ãããã¤æ¹æ³ã使ãã¨ãECSã¿ã¹ã¯å®ç¾©ä¸ã®ã¤ã¡ã¼ã¸ã¿ã°ã¯ production-current
ã§åºå®å¤ã¨ã§ããã®ã§ã
ã¢ããªã±ã¼ã·ã§ã³ãããã¤ã®ãã³ã«æ°ããECSã¿ã¹ã¯å®ç¾©ã®ãªãã¸ã§ã³ãä½æããå¿
è¦ãããã¾ããã
ä¸æ¹ã§ãECRã®ãªãã¸ããªä¸ã¯releaseã®ã¿ã°ãä»ä¸ããã¦ããã®ã§ãç¾å¨ã® production-current
ã¿ã°ã
ã©ã® release-(gitã®SHA1)
ã§ãããã¯ç¹å®å¯è½ã§ãã
ã¡ãªã¿ã«ãDockerã®ã¤ã¡ã¼ã¸ã¿ã°ã³ãã¼ãCircleCIä¸ã§å¥ã®Stepã¨ãªãã¨ãã£ãã·ã¥ãã©ããªãã®ãæ°ã«ãªãããããã¾ãããã awsã³ãã³ãã使ãã°ã pullããã«ã¿ã°ã ãã³ãã¼ãããã¨ã¯å¯è½ã§ãã
AWS ECRä¸ã®Dockerã¤ã¡ã¼ã¸ãpullããã«Dockerã¿ã°ãã³ãã¼ãã
ãã®ãããã¤æ¹æ³ã使ç¨ããå ´åãã¢ããªã±ã¼ã·ã§ã³ã®å¤æ´ããå ´åã®ãããã¤æ¹æ³ã¨ããã®ä»ã®ECSã¿ã¹ã¯å®ç¾©ã®è¨å®é ç®ãå¤æ´ããå ´åã®ãããã¤æ¹æ³ã¯ãåã以ä¸ã®æ¹æ³ã§åæ å¯è½ã§ãã
$ aws ecs update-service \ --cluster <ã¯ã©ã¹ã¿å> \ --service <ãµã¼ãã¹å> \ --task-definition <ã¿ã¹ã¯å®ç¾©å(familyã®ã¿ã§revisionçç¥)> \ --force-new-deployment
AWS CLI Command Reference: ecs update-service
(1) é常ã®ã¢ããªã±ã¼ã·ã§ã³ã®ãããã¤ã®å ´å
Dockerã¤ã¡ã¼ã¸ãæ´æ°ããå ´åã aws ecs update-service --force-new-deployment
ã使ããã¨ã§
ECSã¿ã¹ã¯å®ç¾©ã«å¤æ´ããªãå ´åã§ããããã¤ãããªã¬ã§ãã¾ãã
ãããããECSã¨ã¼ã¸ã§ã³ãã®è¨å®ã§ ECS_IMAGE_PULL_BEHAVIOR=always
ã«ãªã£ã¦ããã®ã§ã
production-current
ã®ãããªåçãªã¿ã°ã§ãdocker pullããªããã¦ã¿ã¹ã¯ãåèµ·åããã¾ãã
çµæã¨ãã¦æ°ããDockerã¤ã¡ã¼ã¸ããããã¤ããã¾ãã
(2) Terraformçµç±ã§ECSã¿ã¹ã¯å®ç¾©ãæ´æ°ããå ´å
terraform apply
ããæç¹ã§Activeãªæ°ããã¿ã¹ã¯å®ç¾©ãä½æãããå¤ãã¿ã¹ã¯å®ç¾©ãINACTIVEç¶æ
ã«ãªãã¾ãã
Terraformã® aws_ecs_service
㧠lifecycle
ã«ã¼ã«ã® ignore_changes
ã使ã task_definition
ã®å¤æ´ãç¡è¦ããããã«
è¨å®ãä»è¾¼ãã§ããã¨ã terraform apply
ããã ãã§ã¯æ°ãããããã¤ã¯ããªã¬ããã¾ããã
ãã£ãã誰ãã®å¥ã®ã¢ããªã±ã¼ã·ã§ã³ãããã¤ã¨éè¤ãããã¤ããªãããã«ããã®æ¹ãå®å
¨ã§ãã
ECSã®ããã¥ã¡ã³ããè¦ãã¨INACTIVEãªç¶æ ã§ã¯ä¸è¦æ°ããã¿ã¹ã¯ã¯èµ·åã§ããªãããã«è¦ãã¾ããã
ã¿ã¹ã¯å®ç¾©ã®ç»é²è§£é¤
å®éã«ã¯è©¦ãã¦ã¿ãã¨ãããECSãµã¼ãã¹ã«é¢é£ä»ãã¦ããECSã¿ã¹ã¯å®ç¾©ãINACTIVEãªç¶æ ã§ã以ä¸ãå¯è½ã§ããµã¼ãã¹æä¾ã«ã¯å®å®³ããã¾ããã
aws ecs update-service --force-new-deployment
ã§ã®ã¿ã¹ã¯åèµ·åaws ecs update-service --desired-count
ã§ã¿ã¹ã¯æ°ã®å¤æ´docker kill
ã§ã³ã³ãããkillããå ´åã®ã¿ã¹ã¯èªå復æ§
ECSãµã¼ãã¹ã«è¨å®ããã¦ããECSã¿ã¹ã¯å®ç¾©ã® revision
ãæ´æ°ããã«ã¯ã
--task-definition
ã family
ã®ã¿æå®ãã revision
ãçç¥ããã¨ææ°ã®Activeãªã¿ã¹ã¯å®ç¾©ãèªåã§ä½¿ããã¾ãã
ã¤ã¾ã terraform apply
ããã®ã¡ã« aws ecs update-service --task-definition
ã§ãããã¤ãããªã¬ããã¨ã
æ°ããECSã¿ã¹ã¯å®ç¾©ã§ã®ãããã¤ãå¯è½ã§ãã
--task-definition
ã¯ã¿ã¹ã¯å®ç¾©ã«å¤æ´ããªãå ´åã«æå®ãã¦ãå®å®³ã¯ããã¾ããã
ä¸è¨ãã¾ã¨ãã㨠--task-definition
㧠revision
çç¥ãfamily
ã®ã¿æå®ããããã« --force-new-deployment
ãæå®ãã¦ããã°ã
terraform apply
å¾ã®ECSã¿ã¹ã¯å®ç¾©ã®åæ ããé常ã®ã¢ããªã±ã¼ã·ã§ã³ã®ãããã¤æ¹æ³ã¨åãã«ãªãã¾ãã
ä¸ç¹æ¸å¿µç¹ãä¸ããã¨ããã¨ã ECS_IMAGE_PULL_BEHAVIOR=always
ã§pullãããDockerã¤ã¡ã¼ã¸ã®ãã£ã·ã¥ã¯
ECSã¯ã©ã¹ã¿å
ã®EC2ãã¹ãã§å
±æãããã®ã§ããããã¤å¦çä¸ã«é害ãªã©ãçºçããã¨ã
ã©ã®ã³ã³ããã«ã©ãã¾ã§æ°ããã¤ã¡ã¼ã¸ãåæ ãããããå³å¯ã«ã³ã³ããã¼ã«ã§ããªããªãã®ã§ããã
æçµçã«ã¯ãã¹ã¦ã®ã³ã³ããããªãªã¼ã¹ãããã¤ã¡ã¼ã¸ã«åæããã¯ãã§ãããä»ã®ã¨ããããããåé¡ã«ãªã£ããã¨ã¯ããã¾ããã
ãããªãªã¼ã¹ããã¤ã¡ã¼ã¸ã«åé¡ãããå ´åã«ã¯ã
ããã¯ã¢ãããã¦ããã production-old
ã®ã¿ã°ã production-current
ã«ã³ãã¼ãã¦ãããã¤ããªããã°æ§ãã¼ã¸ã§ã³ã«æ»ããã¨ã¯ç°¡åã§ãã
Unicornä¾åããã®è±å´
æå¾ã®æµã¯Unicornã§ããã Dockeråã«åããã¦ãRailsã¢ããªã±ã¼ã·ã§ã³ãµã¼ãã Unicorn ãã Puma ã«å¤æ´ãã¾ããã Unicornã¯ãã«ãããã»ã¹ã¢ãã«ã§ã1ã³ã³ããã®ä¸ã«è¤æ°ã®ããã»ã¹ãç«ã¡ä¸ããã®ã§ãçµæã¨ãã¦1ã³ã³ããã®æ¶è²»ã¡ã¢ãªã大ãããªããã³ã³ããã®ã¹ã±ã¸ã¥ã¼ãªã³ã°ããã¥ããã§ãã ä¸æ¹Pumaã¯ãã«ãã¹ã¬ããã¢ãã«ã§åãã®ã§(å³å¯ã«ããã¨ãã«ãããã»ã¹ã§ãåããã¾ãã)ãè¤æ°ã®ã¹ã¬ãããç«ã¡ä¸ããã°1ããã»ã¹ã®ã¡ã¢ãªç©ºéãå ±æããã¾ã¾ä¸¦åå¦çãã§ãã1ããã»ã¹/1ã³ã³ããã¨ãã¦ãããã¤å¯è½ã§ãã ãããã¤å¯è½ãªç²åº¦ãå°ããæ¹ããã¹ã±ã¼ã«ã¢ãã/ã¹ã±ã¼ã«ã¤ã³/ãã¼ãªã³ã°ã¢ãããã¼ãããéã«ãã¯ã©ã¹ã¿ã®ç©ºããªã½ã¼ã¹ãæ´»ç¨ãã¦ã³ã³ããã®ã¹ã±ã¸ã¥ã¼ãªã³ã°ããããããªãã¾ãã ã¡ãªã¿ã«Unicornã®ã¾ã¾ãããã¤ç²åº¦ãå°ããããããã«ã1ããã»ã¹/1ã³ã³ããã§ãããã¤ãããã¨ã¯ã§ããæä½émasterã¨workerã§2ããã»ã¹å¿ è¦ã§ãmasterããã»ã¹åã ããªã¼ãã¼ããããã§ãã¦ãã¾ãã®ã§éå¹çã§ããããã¯å°ããªã¢ããªã±ã¼ã·ã§ã³ã§ã¯åé¡ã«ãªããªãããããã¾ããããCrowdWorksæ¬ä½ã®å ´åãã¢ããªã±ã¼ã·ã§ã³ã®ã³ã¼ããèªã¿è¾¼ãã§ãã ãã§masterããã»ã¹ã«1GBãããã¡ã¢ãªãæã£ã¦ãããã¦ç¡è¦ã§ãã¾ããã
ã¨ããããã§ãUnicornãPumaã«å¤æ´ãã¦ã¿ãã®ã§ããã æ¢åã®Unicornã®ãªã¯ã¨ã¹ãã¿ã¤ã ã¢ã¦ã(ããã©ã«ã60s)ã«ç¸å½ããè¨å®å¤ãPumaã«ã¯ããã¾ããã§ããã ãããªã¯ãã¯ãªãã ããã¨æã£ã¦Issueãæ¼ã£ãã®ã§ãããã©ãããææ³ã¨ãã¦å®è£ ããæ°ã¯ãªãããã§ãã
puma/puma#1244: What's the recommended way to prevent requests running for longer than we'd like?
ããããã¹ãã¼ã¯ã¨ãªããªããã¹ãã ãããããã¯é ãå¦çã«éå®ãã¦ã¿ã¤ã ã¢ã¦ããè¨å®ãã¹ãã ã¨ããæè¦ã¯ãã£ã¨ããªã®ã§ããã ãªãããã®è¦å ã§ã¹ãã¼ã¯ã¨ãªãçºçããå ´åã«ããã¼ã¿ãã¼ã¹ã«è² è·ãããããã¦ã·ã¹ãã å ¨ä½ãä¸å®å®ã«ãªãã®ã¯é¿ãããã¨ããã§ãã
代æ¿æ¡ã¨ãã¦ãä¸è¨ã®Issueã§ç´¹ä»ããã¦ãã rack-timeout ã¨ããRackã¬ã¤ã¤ã§ã¿ã¤ã ã¢ã¦ããçºçãããgemãå°å ¥ãã¾ããã rack-timeoutãå°å ¥ãã¦ãã°ããããã¨ãç¨ã«ããMySQLã³ãã¯ã·ã§ã³ã®æ¥ç¶ã¨ã©ã¼ãçºçããããã«ãªãã¾ããã ã¨ãããã被çé¨ä½ã¨ãã¦mysql2 ã®gemã®ãã¼ã¸ã§ã³ãä¸ãã¦ã¿ããããã®ã§ãããããºã¬ã§ããã
ãã¼ã«ã«ç°å¢ã§æ¬ä¼¼çã«ã¿ã¤ã ã¢ã¦ããçãããããã¦ãããã°ããããé¢é£ããrack-timeout/activerecord/mysql2 gemã®å®è£ ãèªãã ãã㦠SQLå®è¡ä¸ã®ã¿ã¤ã ã¢ã¦ãã®æåã調ã¹ã¾ãããè¦ç´ããã¨ä»¥ä¸ã®ã¨ããã§ãã
- SQLå®è¡ä¸ã«ã¿ã¤ã ã¢ã¦ããèµ·ããã¨ãrack-timeoutã«ããå²ãè¾¼ã¿ãçºçããMySQLã®ã³ãã¯ã·ã§ã³ãåæãããã
- ActiveRecordã®ãã©ã³ã¶ã¯ã·ã§ã³ã®ä¸ã§ä¾å¤ãçºçããã¨ãActiveRecordãrescueãã¦Rollbackãããã¨ããã
- Rollbackãããã¨ãããMySQLã®ã³ãã¯ã·ã§ã³ãåæããã¦ããã®ã§ãRollbackã®çºè¡ã¯å¤±æããã
- å¥éMySQLãµã¼ãå´ã§ã¯ã©ã¤ã¢ã³ãã®åæãæ¤ç¥ãã¦Rollbackã¯ãããã®ã§ãã¼ã¿ã®æ´åæ§ã¯åé¡ãªãã
- é常ãªãRollbackå®äºå¾ã«ActiveRecordã¯åå ã¨ãªã£ãå ã®ä¾å¤ããã©ã³ã¶ã¯ã·ã§ã³ã®å¤å´ã«raiseããªããããRollbackã失æããã®ã§ãRollback失æã¨ã©ã¼ããã©ã³ã¶ã¯ã·ã§ã³ã®å¤ã«æããããã
- ã¤ã¾ãã¿ã¤ã ã¢ã¦ãã¨ã©ã¼ã¯ãã©ã³ã¶ã¯ã·ã§ã³ã®å¤ã«ä¼æ¬ã§ããªãã
- DBã®ã³ãã¯ã·ã§ã³ãä¸åº¦åãã¦ãã®ã§ããã®ã¿ã¤ãã³ã°ã§åæ¥ç¶ãã¦ããå¥ã®DBã»ãã·ã§ã³ã«ãªãã®ã§Rollbackã¯çºè¡ã§ããªãã
- ActiveRecordã¯1HTTPãªã¯ã¨ã¹ããã¨ã«DBã³ãã¯ã·ã§ã³ãåå¾ããåæããã¦ããã°åæ¥ç¶ããæ©è½ãããã®ã§ã1HTTPãªã¯ã¨ã¹ã/1ãã©ã³ã¶ã¯ã·ã§ã³ã§ããã°åé¡ãªãã
ããã«èª¿æ»ãé²ããã¨ä»¥ä¸ã®ãã¨ãåããã¾ããã
- ããæ©è½Aãè¤æ°ä»¶ä¸æ¬ã§å¦çãã便å©ãªä¸æ¬Aæ©è½ãããã
- ä¸æ¬Aæ©è½ã¯ã«ã¼ãããªãã1件ãã¤æ©è½Aãå¼ã³åºãããä¸é¨ã®ã¬ã³ã¼ãã失æããå ´åã§ããå ¨ä½ã¨ãã¦ã¯å¦çãç¶ç¶ããè¨è¨ã«ãªã£ã¦ããã
- ã¤ã¾ããã¼ã¿ãã¼ã¹ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®åä½ã¯Aã®1件ãã¤ã«ãªã£ã¦ããã
- å¦ç件æ°ãé¢é£ãããã¼ã¿ãå¤ãã¨ã¿ã¤ã ã¢ã¦ããçºçãããã¨ãããã
- ããããªãããä¸æ¬ã§å¦çããããã«ä¾å¤ãæ¡ãã¤ã¶ãã¦æ¬¡ã®ã«ã¼ãã«é²ããã¨ããã¨ããã®åæãããDBã³ãã¯ã·ã§ã³ãåå©ç¨ããããã¨ã«ãªãã
- çµæã¨ãã¦æ¬æ¥ã¿ã¤ã ã¢ã¦ãã¨ã©ã¼ãçºçããå ´æã¨ã¯ç°ãªãã次ã®SQLå®è¡æã«å¥å¦ãªDBæ¥ç¶ã¨ã©ã¼ã¨ãã¦è¦³æ¸¬ãããã
æ¬æ¥ã¿ã¤ã ã¢ã¦ããè¨å®ãã¦ããç®çã¯ãDBã«éå°ãªè² è·ããããªããããªã®ã§ããã®ã±ã¼ã¹ã§ã¯ã¿ã¤ã ã¢ã¦ãã§å¦çãæ¢ããã¹ãã§ãã ããããªããããã©ã³ã¶ã¯ã·ã§ã³ã®ä¸ã§rescueãã¦ãRollback失æã¨ã©ã¼ã§ä¸æ¸ãããã¦å¤ã«ä¼ããæ段ããªãã®ã§ã ä»æ¹ããªãã®ã§ãã«ã¼ãã®ç¶ç¶æ¡ä»¶ã®ãã§ãã¯ã§ãDBã³ãã¯ã·ã§ã³ãåæããã¦ãããæ¬ä¼¼çã«ãã©ã³ã¶ã¯ã·ã§ã³ã®å¤ã§ã¿ã¤ã ã¢ã¦ããçºçãããã¨ã«ãã¦åé¿ãã¾ããã
ããããã£ã¨å¯¾è±¡ãé¸ãã§ä¸æ¬ã§å¦çãããã¹ããï¼
ã¿ãããªã®ããããã¾ããããããæ°ãã¤ãã¾ãããã
çæ³çã«ã¯ãã¿ã¤ã ã¢ã¦ãããªãããã«ããã©ã¼ãã³ã¹ã»ãã¥ã¼ãã³ã°ãããªãã ãããã¯ãå¦çãåãä»ãã¾ãããã§ä¸åHTTPãªã¯ã¨ã¹ããè¿ãã¦ãã¾ããçµæãéåæã§ç¢ºèªãããªãããã®ãããã¨ã¯æãã¾ããã å ã Unicornã®ã¿ã¤ã ã¢ã¦ãã§æ»ãã§ãã¨ããå¾ç¶ã®å¦çã¯ã§ãã¦ãªãã£ããã¨ããããä¸æ¦ã¿ã¤ã ã¢ã¦ãã§åãã ãã«çãã¦ããã¾ãããå®ç§ãæ±ããããã¨åã«é²ãã¾ãããã
ãããã«
ãããªãããªã§2019å¹´8æææ¥ã crowdworks.jp ã®ãªã³ã©ã¤ã³ã®ãã©ãã£ãã¯ãå¾ã ã«æ°ç°å¢ã«åãæ¿ãããã®å¾ãããã1ã¶æã»ã©ããã¦åãæ¿ããã¤ãã«å¿µé¡ã®CrowdWorksæ¬ä½ã®Dockeråãå®äºãã¾ããã
é·ãã£ãã§ãã
ãã®ä»ã«ãéå¤ãªåé¡ãããããããã妥åãããã¨ããããã¾ã ã¾ã æ¸ã足ãã¦ããªããã¨ãå¤ã ããã®ã§ãããã ãã¶é·æã«ãªã£ã¦ãã¾ã£ãã®ã§ãããããã«ãã¦ããã¾ãã
ã¯ã©ã¦ãã¯ã¼ã¯ã¹ã§ã¯ãããã¾ã§ãDockerãæ´»ç¨ãã¦ãã¾ãããããªããªã主åäºæ¥ã®ã©çãä¸ã§ã¯æ´»ç¨ã§ãã¦ããããä»ç¤¾ã®äºä¾ãèã度ã«ããªãã¨ãªãã¢ã¤ãã¨ããæ°æã¡ãããã¾ããã ã§ããããããéå»ã®è©±ã§ããã¨ããããã§ã
ã¯ã©ã¦ãã¯ã¼ã¯ã¹ã§ã¯ãã³ã³ãããæ´»ç¨ãã¦å¤æ´ã«å¼·ãå¯ç¨æ§ã®é«ãã¤ã³ãã©ãä½ã£ã¦ããããSREããåéãã¦ããã¾ãï¼ï¼