ã¯ããã« ããã«ã¡ã¯ãã³ãŒãã¬ãŒããšã³ãžãã¢ã®æºå£ã§ãã ã¡ãã¬ãŒã§ã¯ãä»å¹Ž 7 æã«çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããŸããã 詳现ã¯ãã·ã¹ãã æŠèŠãã®ç« ã§ã玹ä»ããŸãããã·ã¹ãã ã®å
šäœåãšããŠã¯ä»¥äžã®ããã«ãªã£ãŠãããŸãã ã¯ãŒã¯ãããŒã·ã¹ãã ãšèãããããã©ããªã·ã¹ãã ãæãæµ®ãã¹ãŸããïŒ ç³è«è
ãã·ã¹ãã ã§ç³è«ãããšãäºãå®ããããæ¿èªè
ãžæ¿èªäŸé Œãã¡ãŒã«ã§éç¥ãããç³è«å
容ã®ç¢ºèªåã³æ¿èªã®ããã«ã·ã¹ãã ãžãã°ã€ã³ããããšããæµããããããã¯ãŒã¯ãããŒã·ã¹ãã ã§ã¯ãªãããªãšæããŸãã æã
ã¯ã³ãŒãã¬ãŒãéšéãšããŠã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠããŸããæ
ã«ãã¡ãã¬ãŒã®çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã«ãããŠã äŸ¿å© ã§ åçç ãªã·ã¹ãã ãç®æããŠéçºãè¡ããŸãããä»å ChatOps ã®æŠå¿µãåãå
¥ããããšã§ãäžè¬çãªã¯ãŒã¯ãããŒã·ã¹ãã ãããæŽç·Žãããã·ã¹ãã ãæ§ç¯ã§ããããªãšæããŸãã æ¬çš¿ã§ã¯ã·ã¹ãã æŠèŠåã³ãè£åŽã®ä»çµã¿ãã玹ä»ããŠãããŸãã æåŸãŸã§ãä»ãåãããã ããã°å¹žãã§ãã ChatOps ãšã¯ ChatOps ãšã¯ããã£ãããµãŒãã¹ïŒChatïŒãããŒã¹ãšããŠãã·ã¹ãã éçšïŒOpsïŒãè¡ãããšããæå³ã§ãããã£ããæžããšãã·ã¹ãã ãã Chat ãžã¡ãã»ãŒãžãé£ã°ããæ¬¡ã®ã¢ã¯ã·ã§ã³ãåã Chat ç»é¢ã§éå§ã§ããããšãããã®ãšãªããŸãã(äžèšãããŒã¯ãããŸã§äžäŸã§ã) ChatOps ã«ã¯ä»¥äžã®ã¡ãªããããããšèããŠããŸãã åžžã«ç«ã¡äžããŠããããŒã«ãšããå
±éã€ã³ã¿ãŒãã§ãŒã¹ã§ãã ã€ã³ã¿ã©ã¯ãã£ããªã³ãã¥ãã±ãŒã·ã§ã³ã«ã€ãªãããã¹ããŒãã£ã§ãã å
±æãããããèšé²ã«æ®ãããã æ¬çš¿ã§ã¯ã詳ãã説æã¯ããŸããããèå³ãããæ¹ã¯äºäŸçã解説ããŠãããµã€ããããã®ã§ãæ¯éæ¢ããŠã¿ãŠãã ããã ãªã ChatOps ãªã®ã çšè°ç³è«ã«ãããŠã¯ æ¿èªè
ãããå€åŒãããŠããã£ãŠ Ãà åã«ãªã£ãã¯ãã ãã©ãéé¡ééã£ãŠãªãïŒã ç³è«è
ããããŸããã倿Žãå¿ããŸãããå·®æ»ããé¡ãããŸãã ãªã©ã®ã³ãã¥ãã±ãŒã·ã§ã³ã床ã
çºçããŸãã éåžžã®ã·ã¹ãã ã§ããã°ã確èªäºé
ãããéã¯ã·ã¹ãã å
ã®ã³ãã¥ãã±ãŒã·ã§ã³æ©èœã䜿ãããããã¯ãChat ã« URL ãçšè°çªå·ã転èšããŠç¢ºèªã®ããã®ã³ãã¥ãã±ãŒã·ã§ã³ãåãããšãæ³å®ãããŸãã ã¡ãã¬ãŒå
ã®æ¥åã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack äžã§æ®ã©å®çµããŠããŸãã Slack ã§ã¯ãªãä»ã®å Žæã§äŒè©±ãçºçãããšæ
å ±ã忣ããŸãããSlack ã« URL ã転èšãããšãã£ãè¡çºããå¥ã·ã¹ãã ãžã®ãã°ã€ã³ãªã©ãéå¹çã§ãã ããã§ã å
±éã€ã³ã¿ãŒãã§ãŒã¹ã® Chat ãäžå¿ã«ã·ã¹ãã æ§ç¯ããïŒ ChatOps ãæ¡çšããçšè°ã¯ãŒã¯ãããŒãæ§ç¯ããŠã¿ãããšèããŸãããçµæãçšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã®æ
å ±ã Slack ãžé£æºããçšè°ã«ãããã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack ã«éçŽãæ¿èªè¡çºã Slack äžã§å¯èœããšããã·ã¹ãã ãæ§ç¯ããããšãã§ããŸããã ã·ã¹ãã æŠèŠ ç³è« ç³è«è
㯠TeamSpirit äžã§çšè°å
容ãèšå
¥ããçšè°ç³è«ãè¡ããŸãã TeamSpirit ãšã¯ã倿 管çãå·¥æ°ç®¡çãçµè²»ç²Ÿç®ãªã©ã管çã§ããã¯ã©ãŠããµãŒãã¹ã§ããSalesforce ããã©ãããã©ãŒã ãšããŠæ¡çšããŠãããã¢ã€ãã¢æ¬¡ç¬¬ã§ãããããªã«ã¹ã¿ãã€ãºãå¯èœã§ãã Slack ããç³è«ã§ããããã«ããã®ã ChatOps ã®ããã¹ãå§¿ãããããŸããããéå»ã®ç³è«ããã³ããŒããããç³è«çš®å¥ããšã«å
¥åããé
ç®ãç°ãªãçã®èŠä»¶ãèæ
®ããTeamSpirit ããç³è«ããããã«èšèšããŸãããç³è«ã®å°ç·ã«ã€ããŠã¯ãä»åŸãããããä»çµã¿ã«ç£šãäžããŠãããããšèããŠããŸãã æ¿èª ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒäžãããšãSlack ã®çšè°ãã£ã³ãã«ã«ç³è«å
容åã³æ·»ä»ãã¡ã€ã«ãèªåæçš¿ãããŸãã æ¿èªè
ã¯ç³è«å
容ã«åé¡ããªããã°ãæçš¿ã«é
眮ãããŠãããã¿ã³ãå©çšããŠæ¿èªã»å·®æ»ããè¡ããŸãã æ¿èªè
ã¯çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãžã¢ã¯ã»ã¹ããããšãªããSlack ã§æ¿èªè¡çºãå®çµã§ããŸããçšè°å
容ã«ãããŠç¢ºèªäºé
ãããå Žåã«ã¯ Slack ã®æçš¿ã¹ã¬ããã§ç³è«è
ãšè³ªçå¿çã®ããåããã§ããæ¿èªã»å·®æ»ãã®å€æã«å¿
èŠãªã³ãã¥ãã±ãŒã·ã§ã³ãè¡ããŸãã åŸç¶ã®ã¢ã¯ã·ã§ã³ æ¿èªåŸã«ã¯ã ã»ç³è«è
ã«æ¿èª or å·®æ»ãçµæã Slack ã® DM(ãã€ã¬ã¯ãã¡ãã»ãŒãž)ã§éç¥ãã åŸç¶ã®æ
åœè
ãž Slack ã§éç¥ãã (æ³åæŒå°ãªã©ã®)æ¿èªåŸã¿ã¹ã¯ãäœæãæ
åœè
ã«éç¥ãã çãåŸç¶ã®ã¢ã¯ã·ã§ã³ãžã€ãªãã£ãŠããä»çµã¿ãçšæããŸããã ã·ã¹ãã ã®è£åŽ å
¥åã€ã³ã¿ãŒãã§ãŒã¹ å
¥åç»é¢ã¯ãTeamSpirit ã§æšæºæäŸãããŠãã çšè°ãªããžã§ã¯ã ãå©çšããŸãããå
¥åé
ç®ã¯æšæºã§çšæãããŠããã³ã³ããŒãã³ããå©çšããã¡ãã¬ãŒç¬èªã§å®çŸ©ããŠããŸããæ¿èªããã»ã¹ãå®çŸ©ããã°ãSlack ã䜿ããã« TeamSpirit ã®ã¿ã§ãéçšã¯å¯èœã§ãã Slack éç¥ Salesforce ã®æšæºæ©èœãš Apex ãçšãã Script åŠçã䜿ã£ãŠ Slack éç¥ãããŠããŸãã Apex ãšã¯ãSalesforce å
ã§å©çšããããžãã¹ããžãã¯çšã®ãªããžã§ã¯ãæåã®ããã°ã©ãã³ã°èšèª(ã»ãŒ Java)ã®ããšã§ãã Slack éç¥ãŸã§ã®å€§ããªæµãã¯ä»¥äžã§ãã çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ Slack API ãã³ãŒã«ããSlack ãžæçš¿ 1~4 ã®ããã»ã¹ã詳ããèŠãŠãããŸãã 1. çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒããã¿ã€ãã³ã°ã§æ¿èªããã»ã¹ãèµ°ãããŸãã ç³è«æã®ã¢ã¯ã·ã§ã³ãšããŠã ã¹ããŒã¿ã¹ãç³è«äžããšããŸããã¹ããŒã¿ã¹ãå€ããæ¯ã«åŠçãèµ°ãããŠããã®ã§ãã¹ããŒã¿ã¹å®çŸ©ã¯äžã€èã«ãªããŸãã 2. ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« ããã»ã¹ãã«ããŒãå©çšããããšã§ãçšè°ã¬ã³ãŒããäœæãŸãã¯ç·šéãããšããã«äœããã®åŠçã宿œããããšãå¯èœã§ããä»åã¯ãã¹ããŒã¿ã¹ããç³è«äžãã«ãªã£ãå Žåã« Apex ãã³ãŒã«ããããšããåŠçã«ããŠããŸãã 3. Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ éç¥ã«å¿
èŠãªæ
å ±ãæãããããApex ã®åŠçã§ã¯çšè°ãªããžã§ã¯ãã®ç³è«æ
å ±ãšåãããŠæ¬¡ã®æ¿èªè
æ
å ±ãååŸããŠããŸãã String ownerId = p . OwnerId ; //ç³è«è
ã®ãŠãŒã¶åãååŸ String applicant = [SELECT Username FROM User WHERE Id = : ownerId ]. Username ; //æ¿èªããã»ã¹ã®ã¬ã³ãŒãååŸ String processInstanceId = [SELECT Id FROM ProcessInstance WHERE TargetObjectId = : p . Id ORDER BY CreatedDate DESC limit 1 ]. Id ; //æ¿èªè
ã® ID ãååŸ String approveId = [SELECT OriginalActorId FROM ProcessInstanceWorkitem WHERE ProcessInstanceId = : processInstanceId ]. OriginalActorId ; 4. Slack API ãã³ãŒã«ããSlack ãžæçš¿ Apex ãååŸããæ
å ±ãããšã«ãSlack ã«æçš¿ããŸãã çšè°å
容ãèšèŒããç³è«è
ã»æ¿èªè
ã«å¯ŸããŠã¡ã³ã·ã§ã³ãããããã«ãŠãŒã¶åãèšèŒããŸãã ãŸããä»åã¯æ¿èªè
çšã«ã€ã³ã¿ã©ã¯ãã£ããã¿ã³ãé
眮ããå¿
èŠããã£ãã®ã§ã Block Kit ãå©çšãããã¿ã³ä»ãã¡ãã»ãŒãžãäœæããŸããã { "text" : "hoge" , "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "fuga" } }, ... { "type" : "actions" , "elements" : [ { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "æ¿èª" }, "value" : "Approve" , "style" : "primary" }, { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "å·®æ»ã" }, "value" : "Reject" , "style" : "danger" } ] } ] } TeamSpirit(Salesforce)âSlack ãžã®æçš¿ã¯éçºã«ãããŠèŠåŽãããã€ã³ãã®äžã€ã§ãã Slack ããã®ã¢ã¯ã·ã§ã³ Slack ã®æçš¿ã«åã蟌ãã§ãããã¿ã³ãã¯ãªãã¯ãããéã¯ãLambda ãçµç±ã㊠TeamSpirit(Salesforce)ã® RestAPI ãã³ãŒã«ããæ¿èªåŠçãå®è¡ããŠããŸãã ãŸãæ¿èªåŸã¯ããã¿ã³ããæ¿èªãã¹ã¿ã³ãã«çœ®ãæããŠããŸãã éçºãçµã㊠çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããã«ããããChatOps ã®æŠå¿µãåãå
¥ã Slack ã«é£æºããæ¥åã·ã¹ãã ãæ§ç¯ããŸããã æ¿èªè
ããã¯ãSlack ã§æ¿èªãã³ã¡ã³ããã§ãã瀟å€ããã§ãããã«å¯Ÿå¿ã§ããã®ã§äŸ¿å©ããSalesforce-Slack 飿ºã¯ä»ã«ã掻çšã§ããã®ã§æ¯éãã£ãŠãããããªã©ã®ã³ã¡ã³ããããã ããŸããããŸããæ¿èªåŸã«ãã¹ã¬ããã«ãŠããæ¯èŸŒãé¡ãããŸãããç©åå±ããŸãããçã®ãããšããè¡ã£ãŠãããæ
å ±ã Slack ã«éçŽãããŠããçãéãã®éçšã«ãªã£ãããšæã£ãŠããŸãã Chat ãµãŒãã¹ãå©çšããŠããäŒç€Ÿã§ã¯ãä»åã玹ä»ãã ChatOps ã¯æ¥åå¹çåããã«ããããæå¹ãªææ³ã«ãªãã®ã§ã¯ãªãã§ããããããã¡ããããã¹ãŠ Chat ã«é£æºããã°ãããšãããã®ã§ããªãããã£ããèšèšãéçšæ€èšãè¡ãå¿
èŠããããŸãã ä»åŸã¯ ChatOps ã«éããæ¥åå¹çåã«ã€ãªãããã®ã¯ã©ãã©ããã£ãŠãããããšèããŠããŸãã ãããã« ã¡ãã¬ãŒã®ã³ãŒãã¬ãŒãéšéã§ã¯ã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠãæ¥åå¹çæ¹åã®ããã®éçºãæšé²ããŠããŸããé¢çœããïŒãšæããæ¹ãã¡ãã¬ãŒã§ã©ãã©ãæ¹åããŠã¿ããïŒãšæã£ãŠããã ããæ¹ã¯ããã²åŒç€Ÿæ¡çšããŒãžãããå¿åãé¡ãããŸãïŒ åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp æåŸãŸã§èªãã§ããã ãããããšãããããŸããã
ã¯ããã« ããã«ã¡ã¯ãã³ãŒãã¬ãŒããšã³ãžãã¢ã®æºå£ã§ãã ã¡ãã¬ãŒã§ã¯ãä»å¹Ž 7 æã«çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããŸããã 詳现ã¯ãã·ã¹ãã æŠèŠãã®ç« ã§ã玹ä»ããŸãããã·ã¹ãã ã®å
šäœåãšããŠã¯ä»¥äžã®ããã«ãªã£ãŠãããŸãã ã¯ãŒã¯ãããŒã·ã¹ãã ãšèãããããã©ããªã·ã¹ãã ãæãæµ®ãã¹ãŸããïŒ ç³è«è
ãã·ã¹ãã ã§ç³è«ãããšãäºãå®ããããæ¿èªè
ãžæ¿èªäŸé Œãã¡ãŒã«ã§éç¥ãããç³è«å
容ã®ç¢ºèªåã³æ¿èªã®ããã«ã·ã¹ãã ãžãã°ã€ã³ããããšããæµããããããã¯ãŒã¯ãããŒã·ã¹ãã ã§ã¯ãªãããªãšæããŸãã æã
ã¯ã³ãŒãã¬ãŒãéšéãšããŠã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠããŸããæ
ã«ãã¡ãã¬ãŒã®çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã«ãããŠã äŸ¿å© ã§ åçç ãªã·ã¹ãã ãç®æããŠéçºãè¡ããŸãããä»å ChatOps ã®æŠå¿µãåãå
¥ããããšã§ãäžè¬çãªã¯ãŒã¯ãããŒã·ã¹ãã ãããæŽç·Žãããã·ã¹ãã ãæ§ç¯ã§ããããªãšæããŸãã æ¬çš¿ã§ã¯ã·ã¹ãã æŠèŠåã³ãè£åŽã®ä»çµã¿ãã玹ä»ããŠãããŸãã æåŸãŸã§ãä»ãåãããã ããã°å¹žãã§ãã ChatOps ãšã¯ ChatOps ãšã¯ããã£ãããµãŒãã¹ïŒChatïŒãããŒã¹ãšããŠãã·ã¹ãã éçšïŒOpsïŒãè¡ãããšããæå³ã§ãããã£ããæžããšãã·ã¹ãã ãã Chat ãžã¡ãã»ãŒãžãé£ã°ããæ¬¡ã®ã¢ã¯ã·ã§ã³ãåã Chat ç»é¢ã§éå§ã§ããããšãããã®ãšãªããŸãã(äžèšãããŒã¯ãããŸã§äžäŸã§ã) ChatOps ã«ã¯ä»¥äžã®ã¡ãªããããããšèããŠããŸãã åžžã«ç«ã¡äžããŠããããŒã«ãšããå
±éã€ã³ã¿ãŒãã§ãŒã¹ã§ãã ã€ã³ã¿ã©ã¯ãã£ããªã³ãã¥ãã±ãŒã·ã§ã³ã«ã€ãªãããã¹ããŒãã£ã§ãã å
±æãããããèšé²ã«æ®ãããã æ¬çš¿ã§ã¯ã詳ãã説æã¯ããŸããããèå³ãããæ¹ã¯äºäŸçã解説ããŠãããµã€ããããã®ã§ãæ¯éæ¢ããŠã¿ãŠãã ããã ãªã ChatOps ãªã®ã çšè°ç³è«ã«ãããŠã¯ æ¿èªè
ãããå€åŒãããŠããã£ãŠ Ãà åã«ãªã£ãã¯ãã ãã©ãéé¡ééã£ãŠãªãïŒã ç³è«è
ããããŸããã倿Žãå¿ããŸãããå·®æ»ããé¡ãããŸãã ãªã©ã®ã³ãã¥ãã±ãŒã·ã§ã³ã床ã
çºçããŸãã éåžžã®ã·ã¹ãã ã§ããã°ã確èªäºé
ãããéã¯ã·ã¹ãã å
ã®ã³ãã¥ãã±ãŒã·ã§ã³æ©èœã䜿ãããããã¯ãChat ã« URL ãçšè°çªå·ã転èšããŠç¢ºèªã®ããã®ã³ãã¥ãã±ãŒã·ã§ã³ãåãããšãæ³å®ãããŸãã ã¡ãã¬ãŒå
ã®æ¥åã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack äžã§æ®ã©å®çµããŠããŸãã Slack ã§ã¯ãªãä»ã®å Žæã§äŒè©±ãçºçãããšæ
å ±ã忣ããŸãããSlack ã« URL ã転èšãããšãã£ãè¡çºããå¥ã·ã¹ãã ãžã®ãã°ã€ã³ãªã©ãéå¹çã§ãã ããã§ã å
±éã€ã³ã¿ãŒãã§ãŒã¹ã® Chat ãäžå¿ã«ã·ã¹ãã æ§ç¯ããïŒ ChatOps ãæ¡çšããçšè°ã¯ãŒã¯ãããŒãæ§ç¯ããŠã¿ãããšèããŸãããçµæãçšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã®æ
å ±ã Slack ãžé£æºããçšè°ã«ãããã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack ã«éçŽãæ¿èªè¡çºã Slack äžã§å¯èœããšããã·ã¹ãã ãæ§ç¯ããããšãã§ããŸããã ã·ã¹ãã æŠèŠ ç³è« ç³è«è
㯠TeamSpirit äžã§çšè°å
容ãèšå
¥ããçšè°ç³è«ãè¡ããŸãã TeamSpirit ãšã¯ã倿 管çãå·¥æ°ç®¡çãçµè²»ç²Ÿç®ãªã©ã管çã§ããã¯ã©ãŠããµãŒãã¹ã§ããSalesforce ããã©ãããã©ãŒã ãšããŠæ¡çšããŠãããã¢ã€ãã¢æ¬¡ç¬¬ã§ãããããªã«ã¹ã¿ãã€ãºãå¯èœã§ãã Slack ããç³è«ã§ããããã«ããã®ã ChatOps ã®ããã¹ãå§¿ãããããŸããããéå»ã®ç³è«ããã³ããŒããããç³è«çš®å¥ããšã«å
¥åããé
ç®ãç°ãªãçã®èŠä»¶ãèæ
®ããTeamSpirit ããç³è«ããããã«èšèšããŸãããç³è«ã®å°ç·ã«ã€ããŠã¯ãä»åŸãããããä»çµã¿ã«ç£šãäžããŠãããããšèããŠããŸãã æ¿èª ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒäžãããšãSlack ã®çšè°ãã£ã³ãã«ã«ç³è«å
容åã³æ·»ä»ãã¡ã€ã«ãèªåæçš¿ãããŸãã æ¿èªè
ã¯ç³è«å
容ã«åé¡ããªããã°ãæçš¿ã«é
眮ãããŠãããã¿ã³ãå©çšããŠæ¿èªã»å·®æ»ããè¡ããŸãã æ¿èªè
ã¯çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãžã¢ã¯ã»ã¹ããããšãªããSlack ã§æ¿èªè¡çºãå®çµã§ããŸããçšè°å
容ã«ãããŠç¢ºèªäºé
ãããå Žåã«ã¯ Slack ã®æçš¿ã¹ã¬ããã§ç³è«è
ãšè³ªçå¿çã®ããåããã§ããæ¿èªã»å·®æ»ãã®å€æã«å¿
èŠãªã³ãã¥ãã±ãŒã·ã§ã³ãè¡ããŸãã åŸç¶ã®ã¢ã¯ã·ã§ã³ æ¿èªåŸã«ã¯ã ã»ç³è«è
ã«æ¿èª or å·®æ»ãçµæã Slack ã® DM(ãã€ã¬ã¯ãã¡ãã»ãŒãž)ã§éç¥ãã åŸç¶ã®æ
åœè
ãž Slack ã§éç¥ãã (æ³åæŒå°ãªã©ã®)æ¿èªåŸã¿ã¹ã¯ãäœæãæ
åœè
ã«éç¥ãã çãåŸç¶ã®ã¢ã¯ã·ã§ã³ãžã€ãªãã£ãŠããä»çµã¿ãçšæããŸããã ã·ã¹ãã ã®è£åŽ å
¥åã€ã³ã¿ãŒãã§ãŒã¹ å
¥åç»é¢ã¯ãTeamSpirit ã§æšæºæäŸãããŠãã çšè°ãªããžã§ã¯ã ãå©çšããŸãããå
¥åé
ç®ã¯æšæºã§çšæãããŠããã³ã³ããŒãã³ããå©çšããã¡ãã¬ãŒç¬èªã§å®çŸ©ããŠããŸããæ¿èªããã»ã¹ãå®çŸ©ããã°ãSlack ã䜿ããã« TeamSpirit ã®ã¿ã§ãéçšã¯å¯èœã§ãã Slack éç¥ Salesforce ã®æšæºæ©èœãš Apex ãçšãã Script åŠçã䜿ã£ãŠ Slack éç¥ãããŠããŸãã Apex ãšã¯ãSalesforce å
ã§å©çšããããžãã¹ããžãã¯çšã®ãªããžã§ã¯ãæåã®ããã°ã©ãã³ã°èšèª(ã»ãŒ Java)ã®ããšã§ãã Slack éç¥ãŸã§ã®å€§ããªæµãã¯ä»¥äžã§ãã çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ Slack API ãã³ãŒã«ããSlack ãžæçš¿ 1~4 ã®ããã»ã¹ã詳ããèŠãŠãããŸãã 1. çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒããã¿ã€ãã³ã°ã§æ¿èªããã»ã¹ãèµ°ãããŸãã ç³è«æã®ã¢ã¯ã·ã§ã³ãšããŠã ã¹ããŒã¿ã¹ãç³è«äžããšããŸããã¹ããŒã¿ã¹ãå€ããæ¯ã«åŠçãèµ°ãããŠããã®ã§ãã¹ããŒã¿ã¹å®çŸ©ã¯äžã€èã«ãªããŸãã 2. ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« ããã»ã¹ãã«ããŒãå©çšããããšã§ãçšè°ã¬ã³ãŒããäœæãŸãã¯ç·šéãããšããã«äœããã®åŠçã宿œããããšãå¯èœã§ããä»åã¯ãã¹ããŒã¿ã¹ããç³è«äžãã«ãªã£ãå Žåã« Apex ãã³ãŒã«ããããšããåŠçã«ããŠããŸãã 3. Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ éç¥ã«å¿
èŠãªæ
å ±ãæãããããApex ã®åŠçã§ã¯çšè°ãªããžã§ã¯ãã®ç³è«æ
å ±ãšåãããŠæ¬¡ã®æ¿èªè
æ
å ±ãååŸããŠããŸãã String ownerId = p . OwnerId ; //ç³è«è
ã®ãŠãŒã¶åãååŸ String applicant = [SELECT Username FROM User WHERE Id = : ownerId ]. Username ; //æ¿èªããã»ã¹ã®ã¬ã³ãŒãååŸ String processInstanceId = [SELECT Id FROM ProcessInstance WHERE TargetObjectId = : p . Id ORDER BY CreatedDate DESC limit 1 ]. Id ; //æ¿èªè
ã® ID ãååŸ String approveId = [SELECT OriginalActorId FROM ProcessInstanceWorkitem WHERE ProcessInstanceId = : processInstanceId ]. OriginalActorId ; 4. Slack API ãã³ãŒã«ããSlack ãžæçš¿ Apex ãååŸããæ
å ±ãããšã«ãSlack ã«æçš¿ããŸãã çšè°å
容ãèšèŒããç³è«è
ã»æ¿èªè
ã«å¯ŸããŠã¡ã³ã·ã§ã³ãããããã«ãŠãŒã¶åãèšèŒããŸãã ãŸããä»åã¯æ¿èªè
çšã«ã€ã³ã¿ã©ã¯ãã£ããã¿ã³ãé
眮ããå¿
èŠããã£ãã®ã§ã Block Kit ãå©çšãããã¿ã³ä»ãã¡ãã»ãŒãžãäœæããŸããã { "text" : "hoge" , "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "fuga" } }, ... { "type" : "actions" , "elements" : [ { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "æ¿èª" }, "value" : "Approve" , "style" : "primary" }, { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "å·®æ»ã" }, "value" : "Reject" , "style" : "danger" } ] } ] } TeamSpirit(Salesforce)âSlack ãžã®æçš¿ã¯éçºã«ãããŠèŠåŽãããã€ã³ãã®äžã€ã§ãã Slack ããã®ã¢ã¯ã·ã§ã³ Slack ã®æçš¿ã«åã蟌ãã§ãããã¿ã³ãã¯ãªãã¯ãããéã¯ãLambda ãçµç±ã㊠TeamSpirit(Salesforce)ã® RestAPI ãã³ãŒã«ããæ¿èªåŠçãå®è¡ããŠããŸãã ãŸãæ¿èªåŸã¯ããã¿ã³ããæ¿èªãã¹ã¿ã³ãã«çœ®ãæããŠããŸãã éçºãçµã㊠çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããã«ããããChatOps ã®æŠå¿µãåãå
¥ã Slack ã«é£æºããæ¥åã·ã¹ãã ãæ§ç¯ããŸããã æ¿èªè
ããã¯ãSlack ã§æ¿èªãã³ã¡ã³ããã§ãã瀟å€ããã§ãããã«å¯Ÿå¿ã§ããã®ã§äŸ¿å©ããSalesforce-Slack 飿ºã¯ä»ã«ã掻çšã§ããã®ã§æ¯éãã£ãŠãããããªã©ã®ã³ã¡ã³ããããã ããŸããããŸããæ¿èªåŸã«ãã¹ã¬ããã«ãŠããæ¯èŸŒãé¡ãããŸãããç©åå±ããŸãããçã®ãããšããè¡ã£ãŠãããæ
å ±ã Slack ã«éçŽãããŠããçãéãã®éçšã«ãªã£ãããšæã£ãŠããŸãã Chat ãµãŒãã¹ãå©çšããŠããäŒç€Ÿã§ã¯ãä»åã玹ä»ãã ChatOps ã¯æ¥åå¹çåããã«ããããæå¹ãªææ³ã«ãªãã®ã§ã¯ãªãã§ããããããã¡ããããã¹ãŠ Chat ã«é£æºããã°ãããšãããã®ã§ããªãããã£ããèšèšãéçšæ€èšãè¡ãå¿
èŠããããŸãã ä»åŸã¯ ChatOps ã«éããæ¥åå¹çåã«ã€ãªãããã®ã¯ã©ãã©ããã£ãŠãããããšèããŠããŸãã ãããã« ã¡ãã¬ãŒã®ã³ãŒãã¬ãŒãéšéã§ã¯ã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠãæ¥åå¹çæ¹åã®ããã®éçºãæšé²ããŠããŸããé¢çœããïŒãšæããæ¹ãã¡ãã¬ãŒã§ã©ãã©ãæ¹åããŠã¿ããïŒãšæã£ãŠããã ããæ¹ã¯ããã²åŒç€Ÿæ¡çšããŒãžãããå¿åãé¡ãããŸãïŒ https://www.medley.jp/jobs/ æåŸãŸã§èªãã§ããã ãããããšãããããŸããã
ã¯ããã« ããã«ã¡ã¯ãã³ãŒãã¬ãŒããšã³ãžãã¢ã®æºå£ã§ãã ã¡ãã¬ãŒã§ã¯ãä»å¹Ž 7 æã«çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããŸããã 詳现ã¯ãã·ã¹ãã æŠèŠãã®ç« ã§ã玹ä»ããŸãããã·ã¹ãã ã®å
šäœåãšããŠã¯ä»¥äžã®ããã«ãªã£ãŠãããŸãã ã¯ãŒã¯ãããŒã·ã¹ãã ãšèãããããã©ããªã·ã¹ãã ãæãæµ®ãã¹ãŸããïŒ ç³è«è
ãã·ã¹ãã ã§ç³è«ãããšãäºãå®ããããæ¿èªè
ãžæ¿èªäŸé Œãã¡ãŒã«ã§éç¥ãããç³è«å
容ã®ç¢ºèªåã³æ¿èªã®ããã«ã·ã¹ãã ãžãã°ã€ã³ããããšããæµããããããã¯ãŒã¯ãããŒã·ã¹ãã ã§ã¯ãªãããªãšæããŸãã æã
ã¯ã³ãŒãã¬ãŒãéšéãšããŠã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠããŸããæ
ã«ãã¡ãã¬ãŒã®çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã«ãããŠã äŸ¿å© ã§ åçç ãªã·ã¹ãã ãç®æããŠéçºãè¡ããŸãããä»å ChatOps ã®æŠå¿µãåãå
¥ããããšã§ãäžè¬çãªã¯ãŒã¯ãããŒã·ã¹ãã ãããæŽç·Žãããã·ã¹ãã ãæ§ç¯ã§ããããªãšæããŸãã æ¬çš¿ã§ã¯ã·ã¹ãã æŠèŠåã³ãè£åŽã®ä»çµã¿ãã玹ä»ããŠãããŸãã æåŸãŸã§ãä»ãåãããã ããã°å¹žãã§ãã ChatOps ãšã¯ ChatOps ãšã¯ããã£ãããµãŒãã¹ïŒChatïŒãããŒã¹ãšããŠãã·ã¹ãã éçšïŒOpsïŒãè¡ãããšããæå³ã§ãããã£ããæžããšãã·ã¹ãã ãã Chat ãžã¡ãã»ãŒãžãé£ã°ããæ¬¡ã®ã¢ã¯ã·ã§ã³ãåã Chat ç»é¢ã§éå§ã§ããããšãããã®ãšãªããŸãã(äžèšãããŒã¯ãããŸã§äžäŸã§ã) ChatOps ã«ã¯ä»¥äžã®ã¡ãªããããããšèããŠããŸãã åžžã«ç«ã¡äžããŠããããŒã«ãšããå
±éã€ã³ã¿ãŒãã§ãŒã¹ã§ãã ã€ã³ã¿ã©ã¯ãã£ããªã³ãã¥ãã±ãŒã·ã§ã³ã«ã€ãªãããã¹ããŒãã£ã§ãã å
±æãããããèšé²ã«æ®ãããã æ¬çš¿ã§ã¯ã詳ãã説æã¯ããŸããããèå³ãããæ¹ã¯äºäŸçã解説ããŠãããµã€ããããã®ã§ãæ¯éæ¢ããŠã¿ãŠãã ããã ãªã ChatOps ãªã®ã çšè°ç³è«ã«ãããŠã¯ æ¿èªè
ãããå€åŒãããŠããã£ãŠ Ãà åã«ãªã£ãã¯ãã ãã©ãéé¡ééã£ãŠãªãïŒã ç³è«è
ããããŸããã倿Žãå¿ããŸãããå·®æ»ããé¡ãããŸãã ãªã©ã®ã³ãã¥ãã±ãŒã·ã§ã³ã床ã
çºçããŸãã éåžžã®ã·ã¹ãã ã§ããã°ã確èªäºé
ãããéã¯ã·ã¹ãã å
ã®ã³ãã¥ãã±ãŒã·ã§ã³æ©èœã䜿ãããããã¯ãChat ã« URL ãçšè°çªå·ã転èšããŠç¢ºèªã®ããã®ã³ãã¥ãã±ãŒã·ã§ã³ãåãããšãæ³å®ãããŸãã ã¡ãã¬ãŒå
ã®æ¥åã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack äžã§æ®ã©å®çµããŠããŸãã Slack ã§ã¯ãªãä»ã®å Žæã§äŒè©±ãçºçãããšæ
å ±ã忣ããŸãããSlack ã« URL ã転èšãããšãã£ãè¡çºããå¥ã·ã¹ãã ãžã®ãã°ã€ã³ãªã©ãéå¹çã§ãã ããã§ã å
±éã€ã³ã¿ãŒãã§ãŒã¹ã® Chat ãäžå¿ã«ã·ã¹ãã æ§ç¯ããïŒ ChatOps ãæ¡çšããçšè°ã¯ãŒã¯ãããŒãæ§ç¯ããŠã¿ãããšèããŸãããçµæãçšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã®æ
å ±ã Slack ãžé£æºããçšè°ã«ãããã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack ã«éçŽãæ¿èªè¡çºã Slack äžã§å¯èœããšããã·ã¹ãã ãæ§ç¯ããããšãã§ããŸããã ã·ã¹ãã æŠèŠ ç³è« ç³è«è
㯠TeamSpirit äžã§çšè°å
容ãèšå
¥ããçšè°ç³è«ãè¡ããŸãã TeamSpirit ãšã¯ã倿 管çãå·¥æ°ç®¡çãçµè²»ç²Ÿç®ãªã©ã管çã§ããã¯ã©ãŠããµãŒãã¹ã§ããSalesforce ããã©ãããã©ãŒã ãšããŠæ¡çšããŠãããã¢ã€ãã¢æ¬¡ç¬¬ã§ãããããªã«ã¹ã¿ãã€ãºãå¯èœã§ãã Slack ããç³è«ã§ããããã«ããã®ã ChatOps ã®ããã¹ãå§¿ãããããŸããããéå»ã®ç³è«ããã³ããŒããããç³è«çš®å¥ããšã«å
¥åããé
ç®ãç°ãªãçã®èŠä»¶ãèæ
®ããTeamSpirit ããç³è«ããããã«èšèšããŸãããç³è«ã®å°ç·ã«ã€ããŠã¯ãä»åŸãããããä»çµã¿ã«ç£šãäžããŠãããããšèããŠããŸãã æ¿èª ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒäžãããšãSlack ã®çšè°ãã£ã³ãã«ã«ç³è«å
容åã³æ·»ä»ãã¡ã€ã«ãèªåæçš¿ãããŸãã æ¿èªè
ã¯ç³è«å
容ã«åé¡ããªããã°ãæçš¿ã«é
眮ãããŠãããã¿ã³ãå©çšããŠæ¿èªã»å·®æ»ããè¡ããŸãã æ¿èªè
ã¯çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãžã¢ã¯ã»ã¹ããããšãªããSlack ã§æ¿èªè¡çºãå®çµã§ããŸããçšè°å
容ã«ãããŠç¢ºèªäºé
ãããå Žåã«ã¯ Slack ã®æçš¿ã¹ã¬ããã§ç³è«è
ãšè³ªçå¿çã®ããåããã§ããæ¿èªã»å·®æ»ãã®å€æã«å¿
èŠãªã³ãã¥ãã±ãŒã·ã§ã³ãè¡ããŸãã åŸç¶ã®ã¢ã¯ã·ã§ã³ æ¿èªåŸã«ã¯ã ã»ç³è«è
ã«æ¿èª or å·®æ»ãçµæã Slack ã® DM(ãã€ã¬ã¯ãã¡ãã»ãŒãž)ã§éç¥ãã åŸç¶ã®æ
åœè
ãž Slack ã§éç¥ãã (æ³åæŒå°ãªã©ã®)æ¿èªåŸã¿ã¹ã¯ãäœæãæ
åœè
ã«éç¥ãã çãåŸç¶ã®ã¢ã¯ã·ã§ã³ãžã€ãªãã£ãŠããä»çµã¿ãçšæããŸããã ã·ã¹ãã ã®è£åŽ å
¥åã€ã³ã¿ãŒãã§ãŒã¹ å
¥åç»é¢ã¯ãTeamSpirit ã§æšæºæäŸãããŠãã çšè°ãªããžã§ã¯ã ãå©çšããŸãããå
¥åé
ç®ã¯æšæºã§çšæãããŠããã³ã³ããŒãã³ããå©çšããã¡ãã¬ãŒç¬èªã§å®çŸ©ããŠããŸããæ¿èªããã»ã¹ãå®çŸ©ããã°ãSlack ã䜿ããã« TeamSpirit ã®ã¿ã§ãéçšã¯å¯èœã§ãã Slack éç¥ Salesforce ã®æšæºæ©èœãš Apex ãçšãã Script åŠçã䜿ã£ãŠ Slack éç¥ãããŠããŸãã Apex ãšã¯ãSalesforce å
ã§å©çšããããžãã¹ããžãã¯çšã®ãªããžã§ã¯ãæåã®ããã°ã©ãã³ã°èšèª(ã»ãŒ Java)ã®ããšã§ãã Slack éç¥ãŸã§ã®å€§ããªæµãã¯ä»¥äžã§ãã çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ Slack API ãã³ãŒã«ããSlack ãžæçš¿ 1~4 ã®ããã»ã¹ã詳ããèŠãŠãããŸãã 1. çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒããã¿ã€ãã³ã°ã§æ¿èªããã»ã¹ãèµ°ãããŸãã ç³è«æã®ã¢ã¯ã·ã§ã³ãšããŠã ã¹ããŒã¿ã¹ãç³è«äžããšããŸããã¹ããŒã¿ã¹ãå€ããæ¯ã«åŠçãèµ°ãããŠããã®ã§ãã¹ããŒã¿ã¹å®çŸ©ã¯äžã€èã«ãªããŸãã 2. ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« ããã»ã¹ãã«ããŒãå©çšããããšã§ãçšè°ã¬ã³ãŒããäœæãŸãã¯ç·šéãããšããã«äœããã®åŠçã宿œããããšãå¯èœã§ããä»åã¯ãã¹ããŒã¿ã¹ããç³è«äžãã«ãªã£ãå Žåã« Apex ãã³ãŒã«ããããšããåŠçã«ããŠããŸãã 3. Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ éç¥ã«å¿
èŠãªæ
å ±ãæãããããApex ã®åŠçã§ã¯çšè°ãªããžã§ã¯ãã®ç³è«æ
å ±ãšåãããŠæ¬¡ã®æ¿èªè
æ
å ±ãååŸããŠããŸãã String ownerId = p . OwnerId ; //ç³è«è
ã®ãŠãŒã¶åãååŸ String applicant = [SELECT Username FROM User WHERE Id = : ownerId ]. Username ; //æ¿èªããã»ã¹ã®ã¬ã³ãŒãååŸ String processInstanceId = [SELECT Id FROM ProcessInstance WHERE TargetObjectId = : p . Id ORDER BY CreatedDate DESC limit 1 ]. Id ; //æ¿èªè
ã® ID ãååŸ String approveId = [SELECT OriginalActorId FROM ProcessInstanceWorkitem WHERE ProcessInstanceId = : processInstanceId ]. OriginalActorId ; 4. Slack API ãã³ãŒã«ããSlack ãžæçš¿ Apex ãååŸããæ
å ±ãããšã«ãSlack ã«æçš¿ããŸãã çšè°å
容ãèšèŒããç³è«è
ã»æ¿èªè
ã«å¯ŸããŠã¡ã³ã·ã§ã³ãããããã«ãŠãŒã¶åãèšèŒããŸãã ãŸããä»åã¯æ¿èªè
çšã«ã€ã³ã¿ã©ã¯ãã£ããã¿ã³ãé
眮ããå¿
èŠããã£ãã®ã§ã Block Kit ãå©çšãããã¿ã³ä»ãã¡ãã»ãŒãžãäœæããŸããã { "text" : "hoge" , "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "fuga" } }, ... { "type" : "actions" , "elements" : [ { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "æ¿èª" }, "value" : "Approve" , "style" : "primary" }, { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "å·®æ»ã" }, "value" : "Reject" , "style" : "danger" } ] } ] } TeamSpirit(Salesforce)âSlack ãžã®æçš¿ã¯éçºã«ãããŠèŠåŽãããã€ã³ãã®äžã€ã§ãã Slack ããã®ã¢ã¯ã·ã§ã³ Slack ã®æçš¿ã«åã蟌ãã§ãããã¿ã³ãã¯ãªãã¯ãããéã¯ãLambda ãçµç±ã㊠TeamSpirit(Salesforce)ã® RestAPI ãã³ãŒã«ããæ¿èªåŠçãå®è¡ããŠããŸãã ãŸãæ¿èªåŸã¯ããã¿ã³ããæ¿èªãã¹ã¿ã³ãã«çœ®ãæããŠããŸãã éçºãçµã㊠çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããã«ããããChatOps ã®æŠå¿µãåãå
¥ã Slack ã«é£æºããæ¥åã·ã¹ãã ãæ§ç¯ããŸããã æ¿èªè
ããã¯ãSlack ã§æ¿èªãã³ã¡ã³ããã§ãã瀟å€ããã§ãããã«å¯Ÿå¿ã§ããã®ã§äŸ¿å©ããSalesforce-Slack 飿ºã¯ä»ã«ã掻çšã§ããã®ã§æ¯éãã£ãŠãããããªã©ã®ã³ã¡ã³ããããã ããŸããããŸããæ¿èªåŸã«ãã¹ã¬ããã«ãŠããæ¯èŸŒãé¡ãããŸãããç©åå±ããŸãããçã®ãããšããè¡ã£ãŠãããæ
å ±ã Slack ã«éçŽãããŠããçãéãã®éçšã«ãªã£ãããšæã£ãŠããŸãã Chat ãµãŒãã¹ãå©çšããŠããäŒç€Ÿã§ã¯ãä»åã玹ä»ãã ChatOps ã¯æ¥åå¹çåããã«ããããæå¹ãªææ³ã«ãªãã®ã§ã¯ãªãã§ããããããã¡ããããã¹ãŠ Chat ã«é£æºããã°ãããšãããã®ã§ããªãããã£ããèšèšãéçšæ€èšãè¡ãå¿
èŠããããŸãã ä»åŸã¯ ChatOps ã«éããæ¥åå¹çåã«ã€ãªãããã®ã¯ã©ãã©ããã£ãŠãããããšèããŠããŸãã ãããã« ã¡ãã¬ãŒã®ã³ãŒãã¬ãŒãéšéã§ã¯ã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠãæ¥åå¹çæ¹åã®ããã®éçºãæšé²ããŠããŸããé¢çœããïŒãšæããæ¹ãã¡ãã¬ãŒã§ã©ãã©ãæ¹åããŠã¿ããïŒãšæã£ãŠããã ããæ¹ã¯ããã²åŒç€Ÿæ¡çšããŒãžãããå¿åãé¡ãããŸãïŒ åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp æåŸãŸã§èªãã§ããã ãããããšãããããŸããã
ã¯ããã« ããã«ã¡ã¯ãã³ãŒãã¬ãŒããšã³ãžãã¢ã®æºå£ã§ãã ã¡ãã¬ãŒã§ã¯ãä»å¹Ž 7 æã«çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããŸããã 詳现ã¯ãã·ã¹ãã æŠèŠãã®ç« ã§ã玹ä»ããŸãããã·ã¹ãã ã®å
šäœåãšããŠã¯ä»¥äžã®ããã«ãªã£ãŠãããŸãã ã¯ãŒã¯ãããŒã·ã¹ãã ãšèãããããã©ããªã·ã¹ãã ãæãæµ®ãã¹ãŸããïŒ ç³è«è
ãã·ã¹ãã ã§ç³è«ãããšãäºãå®ããããæ¿èªè
ãžæ¿èªäŸé Œãã¡ãŒã«ã§éç¥ãããç³è«å
容ã®ç¢ºèªåã³æ¿èªã®ããã«ã·ã¹ãã ãžãã°ã€ã³ããããšããæµããããããã¯ãŒã¯ãããŒã·ã¹ãã ã§ã¯ãªãããªãšæããŸãã æã
ã¯ã³ãŒãã¬ãŒãéšéãšããŠã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠããŸããæ
ã«ãã¡ãã¬ãŒã®çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã«ãããŠã äŸ¿å© ã§ åçç ãªã·ã¹ãã ãç®æããŠéçºãè¡ããŸãããä»å ChatOps ã®æŠå¿µãåãå
¥ããããšã§ãäžè¬çãªã¯ãŒã¯ãããŒã·ã¹ãã ãããæŽç·Žãããã·ã¹ãã ãæ§ç¯ã§ããããªãšæããŸãã æ¬çš¿ã§ã¯ã·ã¹ãã æŠèŠåã³ãè£åŽã®ä»çµã¿ãã玹ä»ããŠãããŸãã æåŸãŸã§ãä»ãåãããã ããã°å¹žãã§ãã ChatOps ãšã¯ ChatOps ãšã¯ããã£ãããµãŒãã¹ïŒChatïŒãããŒã¹ãšããŠãã·ã¹ãã éçšïŒOpsïŒãè¡ãããšããæå³ã§ãããã£ããæžããšãã·ã¹ãã ãã Chat ãžã¡ãã»ãŒãžãé£ã°ããæ¬¡ã®ã¢ã¯ã·ã§ã³ãåã Chat ç»é¢ã§éå§ã§ããããšãããã®ãšãªããŸãã(äžèšãããŒã¯ãããŸã§äžäŸã§ã) ChatOps ã«ã¯ä»¥äžã®ã¡ãªããããããšèããŠããŸãã åžžã«ç«ã¡äžããŠããããŒã«ãšããå
±éã€ã³ã¿ãŒãã§ãŒã¹ã§ãã ã€ã³ã¿ã©ã¯ãã£ããªã³ãã¥ãã±ãŒã·ã§ã³ã«ã€ãªãããã¹ããŒãã£ã§ãã å
±æãããããèšé²ã«æ®ãããã æ¬çš¿ã§ã¯ã詳ãã説æã¯ããŸããããèå³ãããæ¹ã¯äºäŸçã解説ããŠãããµã€ããããã®ã§ãæ¯éæ¢ããŠã¿ãŠãã ããã ãªã ChatOps ãªã®ã çšè°ç³è«ã«ãããŠã¯ æ¿èªè
ãããå€åŒãããŠããã£ãŠ Ãà åã«ãªã£ãã¯ãã ãã©ãéé¡ééã£ãŠãªãïŒã ç³è«è
ããããŸããã倿Žãå¿ããŸãããå·®æ»ããé¡ãããŸãã ãªã©ã®ã³ãã¥ãã±ãŒã·ã§ã³ã床ã
çºçããŸãã éåžžã®ã·ã¹ãã ã§ããã°ã確èªäºé
ãããéã¯ã·ã¹ãã å
ã®ã³ãã¥ãã±ãŒã·ã§ã³æ©èœã䜿ãããããã¯ãChat ã« URL ãçšè°çªå·ã転èšããŠç¢ºèªã®ããã®ã³ãã¥ãã±ãŒã·ã§ã³ãåãããšãæ³å®ãããŸãã ã¡ãã¬ãŒå
ã®æ¥åã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack äžã§æ®ã©å®çµããŠããŸãã Slack ã§ã¯ãªãä»ã®å Žæã§äŒè©±ãçºçãããšæ
å ±ã忣ããŸãããSlack ã« URL ã転èšãããšãã£ãè¡çºããå¥ã·ã¹ãã ãžã®ãã°ã€ã³ãªã©ãéå¹çã§ãã ããã§ã å
±éã€ã³ã¿ãŒãã§ãŒã¹ã® Chat ãäžå¿ã«ã·ã¹ãã æ§ç¯ããïŒ ChatOps ãæ¡çšããçšè°ã¯ãŒã¯ãããŒãæ§ç¯ããŠã¿ãããšèããŸãããçµæãçšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã®æ
å ±ã Slack ãžé£æºããçšè°ã«ãããã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack ã«éçŽãæ¿èªè¡çºã Slack äžã§å¯èœããšããã·ã¹ãã ãæ§ç¯ããããšãã§ããŸããã ã·ã¹ãã æŠèŠ ç³è« ç³è«è
㯠TeamSpirit äžã§çšè°å
容ãèšå
¥ããçšè°ç³è«ãè¡ããŸãã TeamSpirit ãšã¯ã倿 管çãå·¥æ°ç®¡çãçµè²»ç²Ÿç®ãªã©ã管çã§ããã¯ã©ãŠããµãŒãã¹ã§ããSalesforce ããã©ãããã©ãŒã ãšããŠæ¡çšããŠãããã¢ã€ãã¢æ¬¡ç¬¬ã§ãããããªã«ã¹ã¿ãã€ãºãå¯èœã§ãã Slack ããç³è«ã§ããããã«ããã®ã ChatOps ã®ããã¹ãå§¿ãããããŸããããéå»ã®ç³è«ããã³ããŒããããç³è«çš®å¥ããšã«å
¥åããé
ç®ãç°ãªãçã®èŠä»¶ãèæ
®ããTeamSpirit ããç³è«ããããã«èšèšããŸãããç³è«ã®å°ç·ã«ã€ããŠã¯ãä»åŸãããããä»çµã¿ã«ç£šãäžããŠãããããšèããŠããŸãã æ¿èª ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒäžãããšãSlack ã®çšè°ãã£ã³ãã«ã«ç³è«å
容åã³æ·»ä»ãã¡ã€ã«ãèªåæçš¿ãããŸãã æ¿èªè
ã¯ç³è«å
容ã«åé¡ããªããã°ãæçš¿ã«é
眮ãããŠãããã¿ã³ãå©çšããŠæ¿èªã»å·®æ»ããè¡ããŸãã æ¿èªè
ã¯çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãžã¢ã¯ã»ã¹ããããšãªããSlack ã§æ¿èªè¡çºãå®çµã§ããŸããçšè°å
容ã«ãããŠç¢ºèªäºé
ãããå Žåã«ã¯ Slack ã®æçš¿ã¹ã¬ããã§ç³è«è
ãšè³ªçå¿çã®ããåããã§ããæ¿èªã»å·®æ»ãã®å€æã«å¿
èŠãªã³ãã¥ãã±ãŒã·ã§ã³ãè¡ããŸãã åŸç¶ã®ã¢ã¯ã·ã§ã³ æ¿èªåŸã«ã¯ã ã»ç³è«è
ã«æ¿èª or å·®æ»ãçµæã Slack ã® DM(ãã€ã¬ã¯ãã¡ãã»ãŒãž)ã§éç¥ãã åŸç¶ã®æ
åœè
ãž Slack ã§éç¥ãã (æ³åæŒå°ãªã©ã®)æ¿èªåŸã¿ã¹ã¯ãäœæãæ
åœè
ã«éç¥ãã çãåŸç¶ã®ã¢ã¯ã·ã§ã³ãžã€ãªãã£ãŠããä»çµã¿ãçšæããŸããã ã·ã¹ãã ã®è£åŽ å
¥åã€ã³ã¿ãŒãã§ãŒã¹ å
¥åç»é¢ã¯ãTeamSpirit ã§æšæºæäŸãããŠãã çšè°ãªããžã§ã¯ã ãå©çšããŸãããå
¥åé
ç®ã¯æšæºã§çšæãããŠããã³ã³ããŒãã³ããå©çšããã¡ãã¬ãŒç¬èªã§å®çŸ©ããŠããŸããæ¿èªããã»ã¹ãå®çŸ©ããã°ãSlack ã䜿ããã« TeamSpirit ã®ã¿ã§ãéçšã¯å¯èœã§ãã Slack éç¥ Salesforce ã®æšæºæ©èœãš Apex ãçšãã Script åŠçã䜿ã£ãŠ Slack éç¥ãããŠããŸãã Apex ãšã¯ãSalesforce å
ã§å©çšããããžãã¹ããžãã¯çšã®ãªããžã§ã¯ãæåã®ããã°ã©ãã³ã°èšèª(ã»ãŒ Java)ã®ããšã§ãã Slack éç¥ãŸã§ã®å€§ããªæµãã¯ä»¥äžã§ãã çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ Slack API ãã³ãŒã«ããSlack ãžæçš¿ 1~4 ã®ããã»ã¹ã詳ããèŠãŠãããŸãã 1. çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒããã¿ã€ãã³ã°ã§æ¿èªããã»ã¹ãèµ°ãããŸãã ç³è«æã®ã¢ã¯ã·ã§ã³ãšããŠã ã¹ããŒã¿ã¹ãç³è«äžããšããŸããã¹ããŒã¿ã¹ãå€ããæ¯ã«åŠçãèµ°ãããŠããã®ã§ãã¹ããŒã¿ã¹å®çŸ©ã¯äžã€èã«ãªããŸãã 2. ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« ããã»ã¹ãã«ããŒãå©çšããããšã§ãçšè°ã¬ã³ãŒããäœæãŸãã¯ç·šéãããšããã«äœããã®åŠçã宿œããããšãå¯èœã§ããä»åã¯ãã¹ããŒã¿ã¹ããç³è«äžãã«ãªã£ãå Žåã« Apex ãã³ãŒã«ããããšããåŠçã«ããŠããŸãã 3. Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ éç¥ã«å¿
èŠãªæ
å ±ãæãããããApex ã®åŠçã§ã¯çšè°ãªããžã§ã¯ãã®ç³è«æ
å ±ãšåãããŠæ¬¡ã®æ¿èªè
æ
å ±ãååŸããŠããŸãã String ownerId = p . OwnerId ; //ç³è«è
ã®ãŠãŒã¶åãååŸ String applicant = [SELECT Username FROM User WHERE Id = : ownerId ]. Username ; //æ¿èªããã»ã¹ã®ã¬ã³ãŒãååŸ String processInstanceId = [SELECT Id FROM ProcessInstance WHERE TargetObjectId = : p . Id ORDER BY CreatedDate DESC limit 1 ]. Id ; //æ¿èªè
ã® ID ãååŸ String approveId = [SELECT OriginalActorId FROM ProcessInstanceWorkitem WHERE ProcessInstanceId = : processInstanceId ]. OriginalActorId ; 4. Slack API ãã³ãŒã«ããSlack ãžæçš¿ Apex ãååŸããæ
å ±ãããšã«ãSlack ã«æçš¿ããŸãã çšè°å
容ãèšèŒããç³è«è
ã»æ¿èªè
ã«å¯ŸããŠã¡ã³ã·ã§ã³ãããããã«ãŠãŒã¶åãèšèŒããŸãã ãŸããä»åã¯æ¿èªè
çšã«ã€ã³ã¿ã©ã¯ãã£ããã¿ã³ãé
眮ããå¿
èŠããã£ãã®ã§ã Block Kit ãå©çšãããã¿ã³ä»ãã¡ãã»ãŒãžãäœæããŸããã { "text" : "hoge" , "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "fuga" } }, ... { "type" : "actions" , "elements" : [ { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "æ¿èª" }, "value" : "Approve" , "style" : "primary" }, { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "å·®æ»ã" }, "value" : "Reject" , "style" : "danger" } ] } ] } TeamSpirit(Salesforce)âSlack ãžã®æçš¿ã¯éçºã«ãããŠèŠåŽãããã€ã³ãã®äžã€ã§ãã Slack ããã®ã¢ã¯ã·ã§ã³ Slack ã®æçš¿ã«åã蟌ãã§ãããã¿ã³ãã¯ãªãã¯ãããéã¯ãLambda ãçµç±ã㊠TeamSpirit(Salesforce)ã® RestAPI ãã³ãŒã«ããæ¿èªåŠçãå®è¡ããŠããŸãã ãŸãæ¿èªåŸã¯ããã¿ã³ããæ¿èªãã¹ã¿ã³ãã«çœ®ãæããŠããŸãã éçºãçµã㊠çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããã«ããããChatOps ã®æŠå¿µãåãå
¥ã Slack ã«é£æºããæ¥åã·ã¹ãã ãæ§ç¯ããŸããã æ¿èªè
ããã¯ãSlack ã§æ¿èªãã³ã¡ã³ããã§ãã瀟å€ããã§ãããã«å¯Ÿå¿ã§ããã®ã§äŸ¿å©ããSalesforce-Slack 飿ºã¯ä»ã«ã掻çšã§ããã®ã§æ¯éãã£ãŠãããããªã©ã®ã³ã¡ã³ããããã ããŸããããŸããæ¿èªåŸã«ãã¹ã¬ããã«ãŠããæ¯èŸŒãé¡ãããŸãããç©åå±ããŸãããçã®ãããšããè¡ã£ãŠãããæ
å ±ã Slack ã«éçŽãããŠããçãéãã®éçšã«ãªã£ãããšæã£ãŠããŸãã Chat ãµãŒãã¹ãå©çšããŠããäŒç€Ÿã§ã¯ãä»åã玹ä»ãã ChatOps ã¯æ¥åå¹çåããã«ããããæå¹ãªææ³ã«ãªãã®ã§ã¯ãªãã§ããããããã¡ããããã¹ãŠ Chat ã«é£æºããã°ãããšãããã®ã§ããªãããã£ããèšèšãéçšæ€èšãè¡ãå¿
èŠããããŸãã ä»åŸã¯ ChatOps ã«éããæ¥åå¹çåã«ã€ãªãããã®ã¯ã©ãã©ããã£ãŠãããããšèããŠããŸãã ãããã« ã¡ãã¬ãŒã®ã³ãŒãã¬ãŒãéšéã§ã¯ã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠãæ¥åå¹çæ¹åã®ããã®éçºãæšé²ããŠããŸããé¢çœããïŒãšæããæ¹ãã¡ãã¬ãŒã§ã©ãã©ãæ¹åããŠã¿ããïŒãšæã£ãŠããã ããæ¹ã¯ããã²åŒç€Ÿæ¡çšããŒãžãããå¿åãé¡ãããŸãïŒ åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp æåŸãŸã§èªãã§ããã ãããããšãããããŸããã
ã¯ããã« ããã«ã¡ã¯ãã³ãŒãã¬ãŒããšã³ãžãã¢ã®æºå£ã§ãã ã¡ãã¬ãŒã§ã¯ãä»å¹Ž 7 æã«çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããŸããã 詳现ã¯ãã·ã¹ãã æŠèŠãã®ç« ã§ã玹ä»ããŸãããã·ã¹ãã ã®å
šäœåãšããŠã¯ä»¥äžã®ããã«ãªã£ãŠãããŸãã ã¯ãŒã¯ãããŒã·ã¹ãã ãšèãããããã©ããªã·ã¹ãã ãæãæµ®ãã¹ãŸããïŒ ç³è«è
ãã·ã¹ãã ã§ç³è«ãããšãäºãå®ããããæ¿èªè
ãžæ¿èªäŸé Œãã¡ãŒã«ã§éç¥ãããç³è«å
容ã®ç¢ºèªåã³æ¿èªã®ããã«ã·ã¹ãã ãžãã°ã€ã³ããããšããæµããããããã¯ãŒã¯ãããŒã·ã¹ãã ã§ã¯ãªãããªãšæããŸãã æã
ã¯ã³ãŒãã¬ãŒãéšéãšããŠã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠããŸããæ
ã«ãã¡ãã¬ãŒã®çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã«ãããŠã äŸ¿å© ã§ åçç ãªã·ã¹ãã ãç®æããŠéçºãè¡ããŸãããä»å ChatOps ã®æŠå¿µãåãå
¥ããããšã§ãäžè¬çãªã¯ãŒã¯ãããŒã·ã¹ãã ãããæŽç·Žãããã·ã¹ãã ãæ§ç¯ã§ããããªãšæããŸãã æ¬çš¿ã§ã¯ã·ã¹ãã æŠèŠåã³ãè£åŽã®ä»çµã¿ãã玹ä»ããŠãããŸãã æåŸãŸã§ãä»ãåãããã ããã°å¹žãã§ãã ChatOps ãšã¯ ChatOps ãšã¯ããã£ãããµãŒãã¹ïŒChatïŒãããŒã¹ãšããŠãã·ã¹ãã éçšïŒOpsïŒãè¡ãããšããæå³ã§ãããã£ããæžããšãã·ã¹ãã ãã Chat ãžã¡ãã»ãŒãžãé£ã°ããæ¬¡ã®ã¢ã¯ã·ã§ã³ãåã Chat ç»é¢ã§éå§ã§ããããšãããã®ãšãªããŸãã(äžèšãããŒã¯ãããŸã§äžäŸã§ã) ChatOps ã«ã¯ä»¥äžã®ã¡ãªããããããšèããŠããŸãã åžžã«ç«ã¡äžããŠããããŒã«ãšããå
±éã€ã³ã¿ãŒãã§ãŒã¹ã§ãã ã€ã³ã¿ã©ã¯ãã£ããªã³ãã¥ãã±ãŒã·ã§ã³ã«ã€ãªãããã¹ããŒãã£ã§ãã å
±æãããããèšé²ã«æ®ãããã æ¬çš¿ã§ã¯ã詳ãã説æã¯ããŸããããèå³ãããæ¹ã¯äºäŸçã解説ããŠãããµã€ããããã®ã§ãæ¯éæ¢ããŠã¿ãŠãã ããã ãªã ChatOps ãªã®ã çšè°ç³è«ã«ãããŠã¯ æ¿èªè
ãããå€åŒãããŠããã£ãŠ Ãà åã«ãªã£ãã¯ãã ãã©ãéé¡ééã£ãŠãªãïŒã ç³è«è
ããããŸããã倿Žãå¿ããŸãããå·®æ»ããé¡ãããŸãã ãªã©ã®ã³ãã¥ãã±ãŒã·ã§ã³ã床ã
çºçããŸãã éåžžã®ã·ã¹ãã ã§ããã°ã確èªäºé
ãããéã¯ã·ã¹ãã å
ã®ã³ãã¥ãã±ãŒã·ã§ã³æ©èœã䜿ãããããã¯ãChat ã« URL ãçšè°çªå·ã転èšããŠç¢ºèªã®ããã®ã³ãã¥ãã±ãŒã·ã§ã³ãåãããšãæ³å®ãããŸãã ã¡ãã¬ãŒå
ã®æ¥åã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack äžã§æ®ã©å®çµããŠããŸãã Slack ã§ã¯ãªãä»ã®å Žæã§äŒè©±ãçºçãããšæ
å ±ã忣ããŸãããSlack ã« URL ã転èšãããšãã£ãè¡çºããå¥ã·ã¹ãã ãžã®ãã°ã€ã³ãªã©ãéå¹çã§ãã ããã§ã å
±éã€ã³ã¿ãŒãã§ãŒã¹ã® Chat ãäžå¿ã«ã·ã¹ãã æ§ç¯ããïŒ ChatOps ãæ¡çšããçšè°ã¯ãŒã¯ãããŒãæ§ç¯ããŠã¿ãããšèããŸãããçµæãçšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã®æ
å ±ã Slack ãžé£æºããçšè°ã«ãããã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack ã«éçŽãæ¿èªè¡çºã Slack äžã§å¯èœããšããã·ã¹ãã ãæ§ç¯ããããšãã§ããŸããã ã·ã¹ãã æŠèŠ ç³è« ç³è«è
㯠TeamSpirit äžã§çšè°å
容ãèšå
¥ããçšè°ç³è«ãè¡ããŸãã TeamSpirit ãšã¯ã倿 管çãå·¥æ°ç®¡çãçµè²»ç²Ÿç®ãªã©ã管çã§ããã¯ã©ãŠããµãŒãã¹ã§ããSalesforce ããã©ãããã©ãŒã ãšããŠæ¡çšããŠãããã¢ã€ãã¢æ¬¡ç¬¬ã§ãããããªã«ã¹ã¿ãã€ãºãå¯èœã§ãã Slack ããç³è«ã§ããããã«ããã®ã ChatOps ã®ããã¹ãå§¿ãããããŸããããéå»ã®ç³è«ããã³ããŒããããç³è«çš®å¥ããšã«å
¥åããé
ç®ãç°ãªãçã®èŠä»¶ãèæ
®ããTeamSpirit ããç³è«ããããã«èšèšããŸãããç³è«ã®å°ç·ã«ã€ããŠã¯ãä»åŸãããããä»çµã¿ã«ç£šãäžããŠãããããšèããŠããŸãã æ¿èª ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒäžãããšãSlack ã®çšè°ãã£ã³ãã«ã«ç³è«å
容åã³æ·»ä»ãã¡ã€ã«ãèªåæçš¿ãããŸãã æ¿èªè
ã¯ç³è«å
容ã«åé¡ããªããã°ãæçš¿ã«é
眮ãããŠãããã¿ã³ãå©çšããŠæ¿èªã»å·®æ»ããè¡ããŸãã æ¿èªè
ã¯çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãžã¢ã¯ã»ã¹ããããšãªããSlack ã§æ¿èªè¡çºãå®çµã§ããŸããçšè°å
容ã«ãããŠç¢ºèªäºé
ãããå Žåã«ã¯ Slack ã®æçš¿ã¹ã¬ããã§ç³è«è
ãšè³ªçå¿çã®ããåããã§ããæ¿èªã»å·®æ»ãã®å€æã«å¿
èŠãªã³ãã¥ãã±ãŒã·ã§ã³ãè¡ããŸãã åŸç¶ã®ã¢ã¯ã·ã§ã³ æ¿èªåŸã«ã¯ã ã»ç³è«è
ã«æ¿èª or å·®æ»ãçµæã Slack ã® DM(ãã€ã¬ã¯ãã¡ãã»ãŒãž)ã§éç¥ãã åŸç¶ã®æ
åœè
ãž Slack ã§éç¥ãã (æ³åæŒå°ãªã©ã®)æ¿èªåŸã¿ã¹ã¯ãäœæãæ
åœè
ã«éç¥ãã çãåŸç¶ã®ã¢ã¯ã·ã§ã³ãžã€ãªãã£ãŠããä»çµã¿ãçšæããŸããã ã·ã¹ãã ã®è£åŽ å
¥åã€ã³ã¿ãŒãã§ãŒã¹ å
¥åç»é¢ã¯ãTeamSpirit ã§æšæºæäŸãããŠãã çšè°ãªããžã§ã¯ã ãå©çšããŸãããå
¥åé
ç®ã¯æšæºã§çšæãããŠããã³ã³ããŒãã³ããå©çšããã¡ãã¬ãŒç¬èªã§å®çŸ©ããŠããŸããæ¿èªããã»ã¹ãå®çŸ©ããã°ãSlack ã䜿ããã« TeamSpirit ã®ã¿ã§ãéçšã¯å¯èœã§ãã Slack éç¥ Salesforce ã®æšæºæ©èœãš Apex ãçšãã Script åŠçã䜿ã£ãŠ Slack éç¥ãããŠããŸãã Apex ãšã¯ãSalesforce å
ã§å©çšããããžãã¹ããžãã¯çšã®ãªããžã§ã¯ãæåã®ããã°ã©ãã³ã°èšèª(ã»ãŒ Java)ã®ããšã§ãã Slack éç¥ãŸã§ã®å€§ããªæµãã¯ä»¥äžã§ãã çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ Slack API ãã³ãŒã«ããSlack ãžæçš¿ 1~4 ã®ããã»ã¹ã詳ããèŠãŠãããŸãã 1. çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒããã¿ã€ãã³ã°ã§æ¿èªããã»ã¹ãèµ°ãããŸãã ç³è«æã®ã¢ã¯ã·ã§ã³ãšããŠã ã¹ããŒã¿ã¹ãç³è«äžããšããŸããã¹ããŒã¿ã¹ãå€ããæ¯ã«åŠçãèµ°ãããŠããã®ã§ãã¹ããŒã¿ã¹å®çŸ©ã¯äžã€èã«ãªããŸãã 2. ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« ããã»ã¹ãã«ããŒãå©çšããããšã§ãçšè°ã¬ã³ãŒããäœæãŸãã¯ç·šéãããšããã«äœããã®åŠçã宿œããããšãå¯èœã§ããä»åã¯ãã¹ããŒã¿ã¹ããç³è«äžãã«ãªã£ãå Žåã« Apex ãã³ãŒã«ããããšããåŠçã«ããŠããŸãã 3. Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ éç¥ã«å¿
èŠãªæ
å ±ãæãããããApex ã®åŠçã§ã¯çšè°ãªããžã§ã¯ãã®ç³è«æ
å ±ãšåãããŠæ¬¡ã®æ¿èªè
æ
å ±ãååŸããŠããŸãã String ownerId = p . OwnerId ; //ç³è«è
ã®ãŠãŒã¶åãååŸ String applicant = [SELECT Username FROM User WHERE Id = : ownerId ]. Username ; //æ¿èªããã»ã¹ã®ã¬ã³ãŒãååŸ String processInstanceId = [SELECT Id FROM ProcessInstance WHERE TargetObjectId = : p . Id ORDER BY CreatedDate DESC limit 1 ]. Id ; //æ¿èªè
ã® ID ãååŸ String approveId = [SELECT OriginalActorId FROM ProcessInstanceWorkitem WHERE ProcessInstanceId = : processInstanceId ]. OriginalActorId ; 4. Slack API ãã³ãŒã«ããSlack ãžæçš¿ Apex ãååŸããæ
å ±ãããšã«ãSlack ã«æçš¿ããŸãã çšè°å
容ãèšèŒããç³è«è
ã»æ¿èªè
ã«å¯ŸããŠã¡ã³ã·ã§ã³ãããããã«ãŠãŒã¶åãèšèŒããŸãã ãŸããä»åã¯æ¿èªè
çšã«ã€ã³ã¿ã©ã¯ãã£ããã¿ã³ãé
眮ããå¿
èŠããã£ãã®ã§ã Block Kit ãå©çšãããã¿ã³ä»ãã¡ãã»ãŒãžãäœæããŸããã { "text" : "hoge" , "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "fuga" } }, ... { "type" : "actions" , "elements" : [ { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "æ¿èª" }, "value" : "Approve" , "style" : "primary" }, { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "å·®æ»ã" }, "value" : "Reject" , "style" : "danger" } ] } ] } TeamSpirit(Salesforce)âSlack ãžã®æçš¿ã¯éçºã«ãããŠèŠåŽãããã€ã³ãã®äžã€ã§ãã Slack ããã®ã¢ã¯ã·ã§ã³ Slack ã®æçš¿ã«åã蟌ãã§ãããã¿ã³ãã¯ãªãã¯ãããéã¯ãLambda ãçµç±ã㊠TeamSpirit(Salesforce)ã® RestAPI ãã³ãŒã«ããæ¿èªåŠçãå®è¡ããŠããŸãã ãŸãæ¿èªåŸã¯ããã¿ã³ããæ¿èªãã¹ã¿ã³ãã«çœ®ãæããŠããŸãã éçºãçµã㊠çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããã«ããããChatOps ã®æŠå¿µãåãå
¥ã Slack ã«é£æºããæ¥åã·ã¹ãã ãæ§ç¯ããŸããã æ¿èªè
ããã¯ãSlack ã§æ¿èªãã³ã¡ã³ããã§ãã瀟å€ããã§ãããã«å¯Ÿå¿ã§ããã®ã§äŸ¿å©ããSalesforce-Slack 飿ºã¯ä»ã«ã掻çšã§ããã®ã§æ¯éãã£ãŠãããããªã©ã®ã³ã¡ã³ããããã ããŸããããŸããæ¿èªåŸã«ãã¹ã¬ããã«ãŠããæ¯èŸŒãé¡ãããŸãããç©åå±ããŸãããçã®ãããšããè¡ã£ãŠãããæ
å ±ã Slack ã«éçŽãããŠããçãéãã®éçšã«ãªã£ãããšæã£ãŠããŸãã Chat ãµãŒãã¹ãå©çšããŠããäŒç€Ÿã§ã¯ãä»åã玹ä»ãã ChatOps ã¯æ¥åå¹çåããã«ããããæå¹ãªææ³ã«ãªãã®ã§ã¯ãªãã§ããããããã¡ããããã¹ãŠ Chat ã«é£æºããã°ãããšãããã®ã§ããªãããã£ããèšèšãéçšæ€èšãè¡ãå¿
èŠããããŸãã ä»åŸã¯ ChatOps ã«éããæ¥åå¹çåã«ã€ãªãããã®ã¯ã©ãã©ããã£ãŠãããããšèããŠããŸãã ãããã« ã¡ãã¬ãŒã®ã³ãŒãã¬ãŒãéšéã§ã¯ã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠãæ¥åå¹çæ¹åã®ããã®éçºãæšé²ããŠããŸããé¢çœããïŒãšæããæ¹ãã¡ãã¬ãŒã§ã©ãã©ãæ¹åããŠã¿ããïŒãšæã£ãŠããã ããæ¹ã¯ããã²åŒç€Ÿæ¡çšããŒãžãããå¿åãé¡ãããŸãïŒ åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp æåŸãŸã§èªãã§ããã ãããããšãããããŸããã
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã https://www.medley.jp/jobs/
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ã¯ããã« ã¯ãããŸããŠãã¡ãã¬ãŒæ°åå
¥ç€Ÿ 2 幎ç®ã®æ£®å·ã§ãã ã€ã³ãã©çµéšããŸã 4 ã¶æã»ã©ã®æªçè
ã§ããã AWS èªå®è³æ Œã¯ã©ãŠããã©ã¯ãã£ã·ã§ã㌠ã®è©Šéšã«åæ Œããããšãã§ããŸãããäžäœã®è³æ ŒååŸã«åããŠä»åŸãå匷ããŠãããŸãã å
æ¥ç§ãæ
åœãããŠããã ãã CloudFront ã®ã¢ã©ãŒãæ¹åã«ã€ããŠãåé¡ã®åå ãšå¯Ÿå¿æ¹æ³ãæ¬èšäºã§æžãããŠããã ããŸãã ãããããã°ãä»ãåããã ããã èæ¯ãšåé¡ åŒç€Ÿãéå¶ããŠãããããã¯ãã®äžã€ ãžã§ãã¡ãã¬ãŒ ã§ã¯ã€ã³ãã©ç°å¢ã« AWS ãå©çšããŠããŸãã ç£èŠã«ã¯ CloudWatch ã Datadog ãªã©ã䜿çšããŠããŸãããµãŒãã¹ã®ç°åžžãæ€ç¥ããããã®èšå®ã®ã²ãšã€ã«ãCloudFront ã®ãšã©ãŒã¬ã¹ãã³ã¹å¢å ãæ€ç¥ããããã®ã¢ã©ãŒãéç¥ããããŸãã CloudFront ãè¿ãã¬ã¹ãã³ã¹ã®ãã¡ãç¹å®ã®æéç¯å²ã®äžã§ 4xx, 5xx ç³»ã®ãšã©ãŒãè¿ããå²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠãCloudWatch ã¢ã©ãŒã ãã Lambda ãéã㊠Slack ã«éç¥ãè¡ã£ãŠããŸãã ãšããããããé ãå¢ã« CloudFront ã§ã® 4xx ç³»ãšã©ãŒã¬ã¹ãã³ã¹ã®çºçå²åãå¢å ããã¢ã©ãŒãã®éç¥é »åºŠãæ³å®ä»¥äžã«é«ããªã£ãŠããŸããŸããã åå 調æ»ãè¡ã£ããšãããå·æ°ãã瀟å
ã·ã¹ãã ã«ãŠä»¥äž 2 ã€ã®åå ã§ã¢ã©ãŒããçºçããŠããããšãåãããŸããã åå 1. 瀟å€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã§ã¢ã©ãŒããçºç CloudFront ã®ãã°ã確èªãããšããã瀟å€ãµãŒãã¹ïŒSlack, Google ã¹ãã¬ããã·ãŒããªã©ïŒããã®ã¢ã¯ã»ã¹ã«å¯ŸããŠã¹ããŒã¿ã¹ã³ãŒã 403 ãè¿ããŠããã¬ã¹ãã³ã¹ãã°ãæ°å€ãèšé²ãããŠããŸããã ãããã®ãµãŒãã¹ã«åŒç€Ÿã®ç€Ÿå
管çã·ã¹ãã ã® URL ããã¹ãããããšããã¬ãã¥ãŒã衚瀺ããããã®ãªã¯ãšã¹ããéä¿¡ãããŸããããã®æã®ãªã¯ãšã¹ãã瀟å€ããã®ã¢ã¯ã»ã¹ãšã㊠WAF ã§å¶éãããŠããŸããã ã€ã³ãã©å·æ°åããçŸåšãŸã§çšŒåããŠãã CloudFront ã®ãã°ã確èªãããšããããã¡ãã§ãåæ§ã®ãšã©ãŒã¬ã¹ãã³ã¹ãçºçããŠããããšãåãããŸããããããããšã©ãŒå²åå¢å ã®ã¢ã©ãŒããé »çºããããšã¯çŸåšã§ãã»ãšãã©ãããŸããã 以åã¯ãžã§ãã¡ãã¬ãŒãæã€ã·ã¹ãã å
šäœãžã®ã¢ã¯ã»ã¹ãã²ãšã€ã® CloudFront ã§åŠçããŠãããããã¢ã©ãŒãéç¥ã®å²åãšããŠèšç®ããéã®æ¯æ°ã倧ããã瀟å€ããã®ã¢ã¯ã»ã¹ã«ãããšã©ãŒãçºçããŠããŠãããã®å²åãéŸå€ãè¶
éããããšãå°ãªãã£ãããã ãšèããããŸãã ã€ã³ãã©æ§æãå·æ°ããããšããã£ããã«ããããŸã§ç®ç«ã£ãŠããªãã£ã瀟å€ããã®ã¢ã¯ã»ã¹ãšããåé¡ã衚é¢åããŠããã®ã§ãã åå 2. å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºç CloudWatch ã¢ã©ãŒã ã§ã¯ãäžå®æéå
ã§ã®ã¬ã¹ãã³ã¹ã®ãã¡ã4xx, 5xx ç³»ã®ãšã©ãŒããšã«ãã®å²åãéŸå€ãè¶
éããããšãæ€ç¥ããŠã¢ã©ãŒããçºçãããèšå®ãšããŠããŸããã ããããæ·±å€ãªã©å©çšè
ãå°ãªãæéã«äžåºŠã§ããšã©ãŒãçºçãããšããã®å²åãè·³ãäžãã£ãŠããŸãããšã§ã¢ã©ãŒãçºçé »åºŠãå¢å ãã誀æ€ç¥ãšèšããç¶æ
ã«ãªã£ãŠããŸããã 以äžã®ç»åã§ã¯ã4xx ç³»ãšã©ãŒã®å²åãå€éã« 100%ãšãªã£ãŠããç®æã確èªã§ããŸããïŒè¡šç€ºæé㯠UTC ã§ãïŒ å¯Ÿå¿æ¹æ³ 2 ã€ã®åå ã«å¯Ÿãããããã察å¿ãè¡ããŸããã å¯Ÿå¿ 1. ç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ããšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã åãµãŒãã¹ã®èšå®ã«ããããã¬ãã¥ãŒè¡šç€ºã«ããã¢ã¯ã»ã¹ã忢ãããéžæè¢ãèããããŸãããããã該åœãããµãŒãã¹ãã¹ãŠã«èšå®ãè¡ãã®ã¯é£ããã管çãè€éã«ãªãããã§ãã ããã§ãç¹å®ã®ç€Ÿå€ãµãŒãã¹ããã®ã¢ã¯ã»ã¹ã ãšã©ãŒæ€ç¥ã®å¯Ÿè±¡å€ãšãã æ¹éã§å¯Ÿå¿ãè¡ããŸããã ãã°ã®ãã¹ãŠã CloudWatch ã¢ã©ãŒã ã®è©äŸ¡å¯Ÿè±¡ãšããŠããããã«ã誀æ€ç¥ãšèšããã¢ã©ãŒããçºçããŠããã®ãçŸç¶ã§ãããããã£ãŠãè©äŸ¡ãããããã°ã ãã«çµã CloudWatch ã§è©äŸ¡ãããããšãã§ããã°è§£æ±ºãå³ããŸããä»åã§ããã°ãç¹å®ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ãé€å€ã㊠CloudWatch ã«æž¡ããšããåŠçãæ±ããããŸãã ãã®å®çŸã®ãããä»åæ°ãã«äœæããã®ã Lambda ã®é¢æ°ã§ãã S3 ã« CloudFront ã®ãã°ãä¿åãããããšãããªã¬ãŒã« Lambda ãèµ·åãããããã«èšå®ããŸããã ãã°ããšã«èšé²ãããŠãããªã¯ãšã¹ãå
ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãã IP ã¢ãã¬ã¹ãªã©ã確èªããé€å€å¯Ÿè±¡ãã©ãããå€å®ããŸãã ããããŠéžå¥ãééãããã°ãä»åºŠã¯ã¹ããŒã¿ã¹ã³ãŒãã® 5 ã€ã®ã¯ã©ã¹ïŒ1xx, 2xx, 3xx, 4xx, 5xx ç³»ïŒããšã«æ¯ãåããŸãã ãã ããCloudFront ã§ã¯ã¹ããŒã¿ã¹ã³ãŒãã« 000 ãå
¥ãããšããããŸãã https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html ã¹ããŒã¿ã¹ã³ãŒã 000 ã¯ã¢ã©ãŒãã§æ€ç¥ãããšããã§å¯Ÿå¿ã§ããããšãç¹ã«ãªããããæ€ç¥å¯Ÿè±¡ããé€å€ããæ¹éãšããŸããã ïŒS3 ã®ãã°ãçŽæ¥ç¢ºèªãããš 000 ãªã®ã§ãããAthena ã§ãã°ã確èªãããš 0 ã§è¡šç€ºããããããå°ãããããŸããïŒ ãããã£ãæå³ããªãå€ãã¹ããŒã¿ã¹ã³ãŒãã«å«ãŸããŠããå Žåãªã©ãæ€ç¥ã§ããããã«ããããã5 ã€ã®ã¯ã©ã¹ä»¥å€ã®å€ãå«ãŸããŠããå Žåã« UNKNOWN_STATUS_CODE ãªã¯ã©ã¹ãšããŠåé¡ããããã«ããŸããã å¿
èŠãªãã®ã«çµã£ããã°ã 6 ã€ã®ã¹ããŒã¿ã¹ãã¿ãŒã³ã«åããããããã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ãž PUT ãããŸãã ãããŸã§ã Lambda ã®ä»äºãšãªããŸãã åã¹ããŒã¿ã¹ã®ãã°ã®ä»¶æ°ã CloudWatch ã¡ããªã¯ã¹ã§ç¢ºèªã§ããããã«ãªã£ãã®ã§ãã¬ã¹ãã³ã¹å
šäœã«ããã 4xx, 5xx ç³»ãšã©ãŒã®å²åãç®åºã§ããŸãããããå
ã«éŸå€ãèšå®ãã以åã®ãããªã¢ã©ãŒããäœæããããšãã§ããŸããã å¯Ÿå¿ 2. CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ã調æŽãã å©çšè
ãå°ãªãæéã«ãšã©ãŒã¬ãŒããé«ããªãã¢ã©ãŒããçºçããä»¶ã«ã€ããŠã¯ã CloudWatch ã¢ã©ãŒã ã®æ€ç¥ã«ãŒã«ãèª¿æŽ ããããšã«ãã£ãŠå¯Ÿå¿ããŸããã äžå®æéã§ã®ãšã©ãŒæ°ã«éŸå€ãå®ããè¶
éããéã«ã¢ã©ãŒããéç¥ããããã«å€æŽããŸãããã€ãŸããå²åã§ã¯ãªã絶察æ°ã§å€æãããããã«ããŠããŸãã 以äžã®ç»åã®ç·è²ã®ã°ã©ããæ°ããªæ€ç¥ã«ãŒã«ã§åç
§ãããã®ãšãªããŸããæ©è²ã§ç€ºããŠããã®ã 4xx ç³»ãšã©ãŒã®å²åã§ãããããã 100%ãšãªã£ãŠããç®æã«ãããŠãæ°ããªæ€ç¥ã«ãŒã«ã«ã¯åå¿ããŠããªãããšãåãããŸãã 察å¿ãçµã㊠Lambda ãçšããéèšåŠçã®äœæãšãã¢ã©ãŒãã®æ€ç¥ã«ãŒã«ã®èª¿æŽãè¡ãããšã§ãCloudFront ã®ãšã©ãŒç£èŠç²ŸåºŠãåäžãããããšãã§ããŸããã 以åã¯é »ç¹ã«ã¢ã©ãŒããããã£ãŠããŸãããã察å¿åŸã¯ãã£ããèœã¡çããèŠããŠããŸãã ã·ã¹ãã ã®å®å®çšŒåãå®çŸããããã«ããé©åã«ã¢ã©ãŒããæ€ç¥ã§ããããã«ä»åŸãæ¹åãå³ã£ãŠãããããšæããŸãã ä»åã®èª²é¡ã«å¯Ÿããè§£æ±ºææ®µãšããŠã¯ã·ã³ãã«ãªå¯Ÿå¿ã§ãã£ãããšã¯æããŸãããç§ã«ã¯å®ãã®å€ãçŽäœæ²æãªçµéšãšãªããŸããã AWS ã®åºæ¬çãªãµãŒãã¹ã®é£æºãåŠã¶ããšãã§ããããšã«å ããæ°ãã«äœæãã AWS ã®ãµãŒãã¹ã®èª²éé¡ã®è©Šç®ããå®è¡èšç»ãå®ããŠããã®å®è£
ãªã©äºåæºåãæèããŠåãçµãããšãã§ããŸãããæµãŸããç°å¢ã®äžãæ¥ã
åŠã°ããŠããã ããŠãããŸãã ãããã« ã¡ãã¬ãŒã§ã¯ãå»çãã«ã¹ã±ã¢ã®æªæ¥ãã€ããããšããããã·ã§ã³ãæ²ããåãããã¯ãã®éçºã»éå¶ãé²ããããŠããŸãã ãšã³ãžãã¢ã»ãã¶ã€ããŒãã¯ããå€ãã®ããžã·ã§ã³ã§æ°ããªã¡ã³ããŒãåéããŠããŸãããèå³ããæã¡ããã ããæ¹ã¯ããã²ãæ°è»œã«ã話ããããŠããã ããã°ãšæããŸãïŒ ãããŸã§ãä»ãåãããã ããããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã https://www.medley.jp/jobs/
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ã第äžéçºã°ã«ãŒãã®ç¢éã§ãããžã§ãã¡ãã¬ãŒéçºãšã³ãžãã¢ãšããŠãäž»ã«ããã¯ãšã³ããæ
åœããŠããŸãã çŽè¿ã§ã¯ããžã§ãã¡ãã¬ãŒãå
æãªãªãŒã¹ãã ãåç»éžèã æ©èœã®éçºãããžã§ã¯ãã«æºãã£ãŠãããåç»ãã¡ã€ã«ã®ã¢ããããŒãïŒé
ä¿¡ç°å¢ã®èšèšã»å®è£
ãè¡ã£ãŠããŸããã ä»åã®ããã°ã§ã¯ããã®ãåç»éžèãæ©èœã®éçºã«å©çšãã AWS Elemental MediaConvert ãµãŒãã¹ãšã hls.js ãšãã OSS ã©ã€ãã©ãªã«ã€ããŠç޹ä»ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ãåç»éžèãæ©èœ ã¯ããã«ãä»åãªãªãŒã¹ãããåç»éžèãæ©èœã«ã€ããŠæŠèŠã玹ä»ããŸãã æ°åã³ãããŠã€ã«ã¹æææ¡å€§ã«ãã£ãŠã察é¢ã§ã®é¢æ¥ã«äžå®ãæããããå
Œ
±äº€éæ©é¢ã®å©çšãé£ãããªã£ããããããšã«ãããæºè¶³ãªè»¢è·æŽ»åãã§ããªããªã£ãŠããæ¹ãããã£ãããããšæããŸãã ãã®ãããªèª²é¡ã解決ããããã«ããžã§ãã¡ãã¬ãŒã§ã¯ãªã¢ã«ã¿ã€ã ã«ãªã³ã©ã€ã³ã§é¢æ¥ãè¡ããWEB 颿¥ããšãäºæ¥è
ããããããèšå®ãã質åã«å¯ŸããŠå¿åè
ãåç»ã§åçãéããåç»éžèãã® 2 ã€ã®æ©èœãæäŸéå§ããããŸããã ref. WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»éžèïŒåç»é¢æ¥ïŒã¯ãè¿å¹Žå¢å åŸåã«ãããªã³ã©ã€ã³éžèã®äžçš®ã§ããäžè¬çã«ãæ±è·è
/ 就掻çã PC ã»ã¹ããŒããã©ã³çã®ã«ã¡ã©ã§ãäºãçšæãããèšåã«å¿ããŠåç»ãæ®åœ±ããäŒæ¥ã«éãããšã§éžèãè¡ããŸãã ref. WEB 颿¥ã»åç»éžèãšã¯ïŒ 宿œã®æµãã䜿çšããŒã«ããããŒã泚æç¹ãªã©ã培åºè§£èª¬ïŒ ç§ãã¡ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯ãäºæ¥æããããããèšå®ãã質åã«å¯ŸããŠãæ±è·è
ãåçåç»ãæåºããããšãã§ããŸããäºæ¥æãæ±è·è
ããåç»ã§è³ªåã»åçãéãããšã§ãæžé¡ã ãã§ã¯äŒãããªãé°å²æ°ã匷ã¿ãçžæã«äŒããããšãã§ããŸãã WEB 颿¥ã»åç»éžèæ©èœã®ãªãªãŒã¹ã®ãç¥ãã åç»é
ä¿¡ãµãŒãã¹ã®èšèšãã€ã³ã Web ã¢ããªã§ãã®ãããªåç»é
ä¿¡ãµãŒãã¹ãéçºããå ŽåãããŠãŒã¶ã«ããåç»ã¢ããããŒãç°å¢ããšããŠãŒã¶ãžã®åç»ã®é
ä¿¡ã»åçç°å¢ããæäŸããå¿
èŠããããŸãã ãžã§ãã¡ãã¬ãŒã§æ±ãåç»ã¯äžè¬å
¬éããããã®ã§ã¯ãªããå
¬éæ¡ä»¶ãè€éã§ãã ãã£ãŠä»åã¯ããã®ãåç»ã¢ããããŒãïŒé
ä¿¡ç°å¢ããèªãµãŒãã¹å
ã«æ§ç¯ããæ¹éããšãã以äžã®ãããªåç»ãŸããã®èšèšãã€ã³ãã«ã€ããŠæ€èšã»æè¡éžå®ãè¡ãããšã«ããŸããã ïŒãã¡ãããèŠä»¶ã«ãã£ãŠã¯ YouTube ããæ³äººåãåç»é
ä¿¡ãã©ãããã©ãŒã ãå¥çŽããæ¹ãæè»œãªå ŽåãããããšæããŸãïŒ åç»ã®é²ç»ã»æ®åœ± ãµããŒããããåç»ãã¡ã€ã«ã®ãã©ãŒããããã©ãããã Web ã¢ããªå
ã«é²ç»æ©èœãèšããã åç»ã®ã¢ããããŒãïŒã¹ãã¬ãŒãžïŒ åç»ãã¡ã€ã«ã®ããªããŒã·ã§ã³ã§ãåç»ãã¡ã€ã«ã®è§£æããè¡ãã åç»ãã¡ã€ã«ã®ã¢ããããŒãå
ïŒã¹ãã¬ãŒãžïŒãã©ãã«ããã åç»ã®ãšã³ã³ãŒã åç»ãã¡ã€ã«ã®ãšã³ã³ãŒã圢åŒïŒH.264ãHLS çïŒãã©ãããã éåæãšã³ã³ãŒãã®å Žåãã¹ããŒã¿ã¹æ€ç¥ã»ãšã©ãŒãã³ããªã³ã°ãã©ãããã åç»ã®é
ä¿¡ïŒããŠã³ããŒãïŒ é
信圢åŒïŒããŠã³ããŒãïŒã¹ããªãŒãã³ã°ïŒãã©ãããã æå·åãããå Žåã埩å·ãã©ã®ããã«è¡ãã åç»ãã¡ã€ã«ã®å
¬éæ¹æ³ïŒã¢ã¯ã»ã¹å¶éïŒãã©ãããã åç»ã®åç Web ããŒãžäžã§åçãããã®ãããã®å Žåã®è¡šç€ºã»åçå¶åŸ¡ãã©ãããã ãã©ãŠã¶ãµããŒããã©ããŸã§ã«ããããé察å¿ã»ãšã©ãŒæã®å¶åŸ¡ãã©ãããã ä»åã¯ãäžèšã®å€ªåã§èšèŒãã ãåç»ã®ãšã³ã³ãŒããã« MediaConvert ãã ãåç»ã®åçãã« hls.js ãããããæ¡çšããŠããŸãã åé
ã®è©³çްã¯çããŸãããå
šäœãéããŠå€§ãŸãã«ã以äžã®ãããŒã§ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçããå®çŸããããšã«ããŸããã ãã©ãŠã¶ãã Ajax ã§åç»ã S3 ãžã¢ããããŒããã MediaConvert ãåç»ã HLS 圢åŒã«ãšã³ã³ãŒãïŒå€æïŒãã ãã©ãŠã¶ã§ hls.js ã䜿ãåç»ã CloudFront ããã¹ããªãŒãã³ã°åœ¢åŒã§åä¿¡ãåçãã ä»åã¯ãã®ãåç»ã¢ããããŒã â ãšã³ã³ãŒãïŒå€æïŒâ é
ä¿¡ã»åçãã«çŠç¹ãçµããMediaConvert ãš hls.js ãã©ã®ããã«äœ¿ã£ãã®ãã玹ä»ããŸãã MediaConvert ã«ãã HLS ãšã³ã³ãŒã AWS Elemental MediaConvert ã¯ãS3 ãšã®èŠªåæ§ãé«ããã¡ã€ã«ããŒã¹ã®åç»å€æãµãŒãã¹ã§ããèªåã§ ffmpeg ãªã©ã䜿ã£ãŠåç»ãšã³ã³ãŒããµãŒããæ§ç¯ã»ç®¡çããããšãªããã¹ã±ãŒã©ãã«ãªåç»å€æåŠçãæè»œã«ã·ã¹ãã ã«çµã¿èŸŒãããšãã§ããŸãã ref. AWS Elemental MediaConvert æéã¯åºåããåç»ã®åçæéã«å¿ããåŸé課éã§ããAWS ã³ã³ãœãŒã«ãã GUI ããŒã¹ã§ãšã³ã³ãŒãèšå®ãäœæãããããžã§ãïŒãšã³ã³ãŒãåŠçïŒãç»é²ããããšãã§ããŸãã ãŸããä» AWS ãµãŒãã¹åæ§ã« API ãæäŸãããŠãããAWS CLI ãåèšèªã® SDK ã䜿ã£ãŠããã°ã©ã ãããšã³ã³ãŒãåŠçãç»é²ããããšãã§ããã·ã¹ãã 飿ºã容æã§ãã # CLI ã§ãšã³ã³ãŒããžã§ããç»é²ããäŸ $ aws --endpoint-url https://abcd1234.mediaconvert.region-name-1.amazonaws.com --region region-name-1 mediaconvert create-job --cli-input-json file://~/job.json äžèš CLI ã³ãã³ãã§äžã®ãããªãšã³ã³ãŒãèšå®ãèšèŒãã JSON ã䜿ããžã§ããäœæãããšãS3 äžã®åç»ãã¡ã€ã«ããµã¯ããšãšã³ã³ãŒãããŠãããŸãããžã§ãã¯ãã¥ãŒã€ã³ã°ãããå
éšã§äžŠååŠçãããããã倧éã®ãšã³ã³ãŒãèŠæ±ã«ãç°¡åã«å¿ããããšãã§ããŸãã { ... "Settings" : { "Inputs" : [ { # å
¥åå
ã® S3 ãã±ããäžã®åç»ãã¡ã€ã« key ãæå® "FileInput" : "s3://testcontent/720/example_input_720p.mov" } ], "OutputGroups" : [ { "OutputGroupSettings" : { "FileGroupSettings" : { # åºåå
ã® S3 ãã±ãã key ãæå® "Destination" : "s3://testbucket/output" } }, # åç»ã»é³å£°ã®ãšã³ã³ãŒãèšå®ãæå® # ããã§å質ã¬ãã«æ¯ã«æ¯ãåããè€æ°ã®ãã¡ã€ã«ãåºåããã # ãµã ãã€ã« jpg ãäœæãããããããšãå¯èœ "Outputs" : [ { "VideoDescription" : { ⊠}, "AudioDescriptions" : { ⊠} } ] } ] } } ref. AWSCLI ã䜿çšãã AWSElemental MediaConvertCreateJob ã®äŸ ãšã³ã³ãŒããå®äºãããžã§ãã¯ãcron + SDK ãªã©ã§ API ãä»ããŠå®æãã§ãã¯ããä»ã«ãCloudWatch Events ã«ããã€ãã³ãç£èŠ â Lambda ã§åŠçãããããªããšãã§ããŸãã ref. AWS Elemental MediaConvert ã«ãã CloudWatch ã€ãã³ã ã®äœ¿çš ãªãåç»ãåãšã³ã³ãŒãããã®ã éåžžããŠãŒã¶ããã¢ããããŒããããåç»ãã¡ã€ã«ã¯ãæ¢ã«äœããã®ã³ãŒããã¯ã§å§çž®ãã .mp4 ã .mov ãªã©ã®ã³ã³ãããã©ãŒãããã«å€æãããŠããããšãæ®ã©ã§ãã ããã Web ããŒãžã§ <video> ã¿ã°ã䜿ããããåç»ãã¡ã€ã«ãåçããããšããå Žåã ãåç»ãã©ãŒãããã«ãã©ãŠã¶ãé察å¿ã ãšåçã§ããªãã ãšããç°å¢äŸååé¡ããããŸãã ãã©ãŠã¶ãšåç»ãã©ãŒãããã®ãµããŒã衚 ref. HTML5 video > Browser support ãã®åé¡ã«å¯Ÿå¿ãããããå€ãã®åç»é
ä¿¡ãµãŒãã¹ã§ã¯ããŠãŒã¶ã®åç»ãå€ãã®ç°å¢ã§åçå¯èœãª MP4 ã³ã³ãããã©ãŒãããïŒH.264 + AAC ã³ãŒããã¯ïŒãªã©ã®åœ¢åŒãžãåãšã³ã³ãŒããããŠããŸãã ãžã§ãã¡ãã¬ãŒã®åç»éžèã§ã¯äžèšç®çã«å ããŠãåç»é²èЧæã®åç·ã»ç«¯æ«è² è·ãæãã ãHTTP ã¹ããªãŒãã³ã°åœ¢åŒã ã§åç»ãé
ä¿¡ããããã«ãã¢ããããŒããããåç»ãå
šãŠ HLS åœ¢åŒ ã«ãšã³ã³ãŒãããŠããŸãã HLS - HTTP Live Streaming åœ¢åŒ HLS 㯠HTTP Live Streaming ã®ç¥ã§ãApple 瀟ã®éçºããèŠæ Œã§ããHTTP ããŒã¹ã®ã¹ããªãŒãã³ã°éä¿¡ãããã³ã«ã§ã现åãã«ãã MP4 åç»ãã¡ã€ã«ãåå²ããŠã³ããŒããããããšã§åç»ã®ã¹ããªãŒãã³ã°é
ä¿¡ãå®çŸããŠããŸãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ã¯ .ts ãšããåå²ãããã¡ãã£ã¢ãã¡ã€ã«çŸ€ãšã .m3u8 ãšãããã¡ãã£ã¢ãã¡ã€ã«ã®ååŸå
ãç§æ°ãªã©ãèšèŒããããã¹ããã¡ã€ã«ã§æ§æãããŸãã .m3u8 ãã¡ã€ã«ã®äŸïŒãããã§ã¹ããã¡ã€ã«ããã¬ã€ãªã¹ããã¡ã€ã«ãšãïŒ #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-0.ts #EXTINF:9.97663, media-1.ts #EXTINF:7.10710, media-2.ts #EXT-X-ENDLIST ref. RFC 8216: HTTP Live Streaming HLS ã¯ä»ã®ã¹ããªãŒãã³ã°åœ¢åŒãšæ¯èŒããŠãã©ã€ãé
ä¿¡ / VOD ã©ã¡ãã«ã察å¿å¯èœãªããšã察å¿ãã©ãŠã¶ãå€ãããšãå°çšã®é
ä¿¡ãµãŒãã䜿ããã«é
ä¿¡å¯èœãªããšãªã©ãããè¿å¹Žã®åç»é
ä¿¡ãµãŒãã¹ã§åºãå©çšãããŠããŸãã Web ãšã³ãžãã¢ã®èŠç¹ããèŠãŠãã HTTP ããŒã¹ãªãããã£ãã·ã¥ã HTTPS æå·åãªã©ãæ¢å Web æè¡ãšæãåãããããšãæ³åãããããæ±ããããå°è±¡ã§ããã MediaConvert ã® HLS ãšã³ã³ãŒããžã§ãèšå® å®éã«ããã°ã©ã ãã API çµç±ã§ HLS ãšã³ã³ãŒããžã§ããç»é²ããéã®èšå® JSON ã¯ã以äžã®ããã« GUI ã§ãžã§ããã³ãã¬ãŒããäœæããŠç¢ºèªããããšãã§ããŸãã ãã®ã JSON ã衚瀺ãã§ãåè¿°ãã CLI ã³ãã³ã mediaconvert create-job --cli-input-json ã«æž¡ãã JSON ã衚瀺ãããŸããå®è£
ã®éã«ã¯ãã¡ããåèã«ããªããã ãŠãŒã¶ãŒã¬ã€ã ãåç
§ããŠå©çšãããæ©èœã«ããããèšå®ã远å ããŠããããšãããããããŸãã æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã å©çšåã« IAM ã§ MediaConvert çšããŒã«ã®èšå®ãå¿
èŠã§ã ã¹ããã 3. IAM æš©éã®èšå® AWS ã³ã³ãœãŒã«ã® Service Quotas > AWS ãµãŒãã¹ > AWS Elemental MediaConvert ãã確èªã§ããŸããããšã³ã³ãŒã䞊è¡åŠçã®åæå®è¡æ°äžé㯠20 ã«ãªã£ãŠããŸã AWS ã«ãŒãã¢ã«ãŠã³ã 1 ã€ã«ã€ã 1 ãµãŒãã¹ãå²åœãŠãããã®ã§ããããå¢ããããå Žåã¯ç³è«ãå¿
èŠã§ã ãšã³ã³ãŒããžã§ãããã¥ãŒã€ã³ã°ããããã¥ãŒããäœæããŠããžã§ãã®ç»é²æã«éžã¹ãã®ã§ãããäžèšããã䞊è¡åŠçã®åæå®è¡æ°äžéãã¯ãã®ããã¥ãŒãæ¯ã«åçã«æ¯ãåããããŸã äŸãã°ãæ¬çªãã¥ãŒããšãæ€èšŒãã¥ãŒãã® 2 ã€ã®ãã¥ãŒãäœæããå Žåãããããã®äžŠè¡åŠçã®åæå®è¡æ°äžé㯠10 ãã€ã«ãªãã®ã§æ³šæããŠãã ãã ãããã§ã¹ãæé圢åŒïŒManifest duration formatïŒã«æŽæ°ïŒINTEGERïŒãæå®ããŠãããšãiOS Safari ã§ãåç»ã®å®éã®åçæéãšãåçãã¬ã€ã€ãŒã®ã·ãŒã¯ããŒã«è¡šç€ºãããåèšæéã«ãºã¬ãçãããåé¡ããããŸãã æµ®åå°æ°ç¹ïŒFLOATING POINTïŒã«å€æŽããããšã§å¯Ÿå¿ããŸããããããã§ã¹ããã¡ã€ã«ã«åºåãããå .ts ãã¡ã€ã«ã®é·ãããæµ®åå°æ°ç¹ â æŽæ°ã«å€æããåãäžããããããšã§ãºã¬ãçããŠããããã§ãã hls.js ã«ãã HLS åç»ã®åçå¶åŸ¡ MediaConvert ã«ãã HLS 圢åŒã«ãšã³ã³ãŒããããåç»ããWeb ãã©ãŠã¶ã§åçããããã«å¿
èŠãªã®ããhls.js ã§ãã ref. video-dev/hls.js å®ã¯ HLS ã«ããã¹ããªãŒãã³ã°é
ä¿¡ã¯ãçŸç¶ Safari ãªã©éããããã©ãŠã¶ã§ãããã€ãã£ãã§ãµããŒããããŠããŸããã ref. https://caniuse.com/http-live-streaming ãã® HLS åç»ã Safari 以å€ã® Google Chrome ã IE11 ãªã©ã®äž»èŠãã©ãŠã¶ã§åçå¯èœã«ãããããhls.js ãå©çšãããŠããŸããå
éšçã«ã¯ãé察å¿ãã©ãŠã¶ç°å¢ã«ãããŠããã©ãŠã¶ã® MediaSource æ¡åŒµ ã䜿ã£ãŠ HLS åç»ãåçãã仿§ã«ãªã£ãŠããŸãã Video.js ãšã®æ¯èŒ 䌌ããããªã©ã€ãã©ãªã« Video.js ãšãããã®ããããå°å
¥ãè¿·ã£ãã®ã§ãã ⊠Video.js 㯠UI ãã»ããã«ãªã£ãã HLS ã«å¯Ÿå¿ããåçãã¬ã€ã€ãŒãã©ã€ãã©ãª HLS 察å¿ä»¥å€ã«ããåå¹ãç« åããªã©æ©èœãè±å¯ hls.js ã¯ãã©ãŠã¶æšæºã® <video> ã¿ã°ã§ HLS ã«å¯Ÿå¿ããããšã ããç®çã«ããã HLS ã¯ã©ã€ã¢ã³ããã©ã€ãã©ãª UI ãªã©ã¯ãªããåç»åçãã¬ã€ã€ãŒã¯ãã©ãŠã¶æšæºã®ãŸãŸ âŠãšãäžèšã®ããã« hls.js ã®æ¹ãã·ã³ãã«ã«ããããããšãå®çŸã§ãããããä»å㯠hls.js ãæ¡çšããŸããã GitHub ã®ã¹ã¿ãŒæ°ã¯å
çºã® Video.js ã®æ¹ãå€ãã®ã§ãããhls.js ãéçºã¯æŽ»çºã§ãæ¥æ¬ã§ã¯ ã°ãã·ãŒ ãããäžççã«ã¯ TED ã Twitter ã§ãæ¡çšãããŠãããååå®çžŸãããããšæããŸãã hls.js ã«ããå®è£
åºæ¬çã«ã¯ README ã® Getting Started ã®éãã§å®è£
ã§ããŸããäžéš README ã®ãµã³ãã«ã³ãŒãããæç²ããŠè§£èª¬ãããšâŠ var video = document . getElementById ( "video" ); var videoSrc = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" ; if ( Hls . isSupported ()) { var hls = new Hls (); hls . loadSource ( videoSrc ); hls . attachMedia ( video ); hls . on ( Hls . Events . MANIFEST_PARSED , function () { video . play (); }); } äžèš Hls.isSupported() ã®åå²ã§ãHLS ããã€ãã£ããµããŒãããŠããªããã©ãŠã¶ã®åŠçãå®è£
ããŠããŸãã æ¬æ¥ <video> ã® src 屿§ã«ã»ããããã¹ã .m3u8 ãã¡ã€ã«ã® URL ãž hls.loadSource() ã§ã¢ã¯ã»ã¹ãããã¯ã©ã€ã¢ã³ããã XHR ãªã¯ãšã¹ããé£ã°ããŸãããã®åŸ hls.attachMedia() ã§ã€ã³ã¹ã¿ã³ã¹ã DOM äžã® <video> ã¿ã°ã«çŽã¥ããŠããŸãã else if ( video . canPlayType ( 'application/vnd.apple.mpegurl' )) { video . src = videoSrc ; video . addEventListener ( 'loadedmetadata' , function () { video . play (); }); } äžèšã®åå²ã iOS Safari ãªã©ãHLS åç»ããã€ãã£ããµããŒãããŠãããã©ãŠã¶åãã®åŠçã§ããåçŽã« .m3u8 ãžã® URL ã <video> ã¿ã°ã® src ãžä»äžããŠããã ãã§ããã ïŒãµã³ãã«ã³ãŒãã§ã¯ããããã§ã¹ããã¡ã€ã«ã®ããŒãåŸã«èªååçãããããã«ãªã£ãŠããããã§ãïŒ æ³šæç¹ã»ã€ãŸã¥ãããã€ã³ã hls.js ã¯ã©ã€ã¢ã³ããååŸãã HLS åç»ãã¡ã€ã«çŸ€ã¯ãCORS ãããã§ GET ãªã¯ãšã¹ããèš±å¯ãããç°å¢ã«èšçœ®ããå¿
èŠããããŸã .m3u8 ãããã§ã¹ããã¡ã€ã«ãã¢ããªã® API ãªã©ããè¿åŽããå ŽåãContent-Type ã application/x-mpegURL ã«ããŠæž¡ãå¿
èŠããããŸã iOS Safari ãªã©ã® hls.js é察å¿ãã©ãŠã¶åãã®å®è£
ãæèããå¿
èŠããããŸã hls.js ã«ããå¶åŸ¡ãè€éã«ãªãã±ãŒã¹ã§ã¯ãåããããªå¶åŸ¡ã hls.js é察å¿ãã©ãŠã¶åãã«å®è£
ã§ãããïŒãã€ã¡ãŒãžã§ããªããšææ»ããçºçãããã§ã ãã®ä»ãããã³ããšã³ãã§ã¯ <video> ã¿ã°ã®ãã©ãŠã¶æ¯ã®æåãã衚瀺ã®éãã«æéãããããŸãããïŒããçšåºŠäºæ³ã¯ããŠããŸãããããã¯ãã¡ãã£ã¢ã®åãæ±ãã¯é£ããâŠïŒ hls.js èªäœã¯å°å
¥ãæè»œã§ããµã¯ããš HLS åç»ã®ãã«ããã©ãŠã¶å¯Ÿå¿ãå®çŸã§ãããšãŠã䜿ããããã£ãã§ãã@types ãååšããã®ã§ãTypeScript ç°å¢ã§ãé£ãªãå®è£
ã§ããŸããã SSR ã HLS + AES-128 ã®åçã«ã察å¿ããŠããã®ã§ãèå³ã®ããæ¹ã¯äžåºŠ å
¬åŒããã¥ã¡ã³ã ã確èªããŠã¿ãŠãã ããã ãããã« åŸæ¥ãåç»é
ä¿¡ãµãŒãã¹ãæ§ç¯ããå Žåãffmpeg ãèŒãããšã³ã³ãŒããµãŒãããã¹ããªãŒãã³ã°é
ä¿¡ãµãŒããå¥å»ºãŠããŠãè² è·ã«å¿ããŠã¹ã±ãŒã«ãããŠâŠã®ãããªèšèšãå¿
èŠã ã£ãããšæããŸãã ä»åãMediaConvert ãã¯ãããšãã AWS ãµãŒãã¹ãš hls.js ãå©çšããããšã§ãæè»œã«ãã¹ã±ãŒã©ãã«ãªåç»ãšã³ã³ãŒãïŒHTTP ã¹ããªãŒãã³ã°é
ä¿¡ç°å¢ãæ§ç¯ããããšãã§ããŸããã ãžã§ãã¡ãã¬ãŒã®åç»éžèã¯ãŸã ãªãªãŒã¹ããã°ããã§ãã®ã§ãä»åŸåé¿ãèŠãªããããããªãæ¹åãéããŠãããããšæããŸããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp