ã¯ã³ã¯ãªãã¯ã§è€æ°ã®ããã°ã©ã ãã¹ã±ãžã¥ãŒã« â AWS Lambdaã®15åãšããå£ãæã¡ç Žã
FASTãã£ã³ãã«ã®ãªãã¬ãŒã¿ãŒã¯1ã¶æåã®çªçµç·šæãã¹ã±ãžã¥ãŒã«ããDeployãäžåºŠã¯ãªãã¯ããŸãããã®ã¯ã³ã¯ãªãã¯ã®è£åŽã§ã¯ãäœçŸãã®ããã°ã©ã ãäœåãã®MediaLiveã¹ã±ãžã¥ãŒã«ã¢ã¯ã·ã§ã³ãšãªãããããã¯ãã¹ãŠLambdaã®15åãšããå®è¡æéã®äžéå ã§ãé çªéãã«AWSã«éãããå¿ èŠããããŸããéäžã§å€±æãããšãã©ã€ããã£ã³ãã«ã«ç©Žãéããç¶æ ã«ãªã£ãŠããŸããŸããããã§ã¯ãå€§èŠæš¡ãªãã¬ã€ãªã¹ãã®ã¯ã³ã¯ãªãã¯ãããã€ãããã«ä¿¡é Œæ§ã®é«ããã®ã«ãããããããŠãªã次ã®ã¹ããããããã倧ããªLambdaãã§ã¯ãªããç°ãªãã©ã³ã¿ã€ã ãã§ããã®ãã説æããŸãã
æŠèŠ
| åŽé¢ | 詳现 |
|---|---|
| ã©ã³ã¿ã€ã | AWS Lambda (åäžã®åŒã³åºã)ã615ç§ã®ããã¯ãšã³ãã¿ã€ã ã¢ãŠã |
| åºåã¿ãŒã²ãã | MediaLive BatchUpdateScheduleCommand |
| ãããåŠç | ãªã¯ãšã¹ããããæå€§200åã®MediaLiveã¢ã¯ã·ã§ã³ â å®éã«ã¯çŽ25ããã°ã©ã |
| ããã°ã©ã ããšã®ã¢ã¯ã·ã§ã³ | çŽ7ïœ8åïŒå ¥ååãæ¿ã + ã¬ã³ããªã³ã°ããšã®ãŠã©ãŒã¿ãŒããŒã¯4å + SCTE-35 2åïŒãCMãã¬ã€ã¯ãããå Žåã¯ããã«å€ã |
| ãã©ãŒã«ãã㯠| ãããæåŠæã®ããã°ã©ã ããšã®åè©Šè¡ |
| 宿ž¬å€ | çŽ44ç§ã§195ããã°ã©ã ããããã€ïŒããŒã«ã«æž¬å®ïŒ |
| ç®æšå€ | 90ç§ä»¥å ã«360ããã°ã©ã |
| ã¹ã±ãŒã«ã¢ãŠããã¹ | 1ã¶æä»¥äžã®ãã¬ã€ãªã¹ãã«å¯ŸããStep Functionsãã£ã³ãã³ã° â èšç»äžãæªãªãªãŒã¹ |
課é¡
ãã¬ã€ãªã¹ãã®ãããã€ã¯æžã蟌ã¿ã§ã¯ãªãããªãŒã±ã¹ãã¬ãŒã·ã§ã³ã§ãããªãã¬ãŒã¿ãŒãã¹ã±ãžã¥ãŒã«ãããã¹ãŠã®ããã°ã©ã ã«ã€ããŠãMediaLiveã¯å ¥åã®åãæ¿ãææãåã¬ã³ããªã³ã°ã§ãŠã©ãŒã¿ãŒããŒã¯ããªã³ã«ããææãSCTE-35ãã¥ãŒãã€ã³ããæ¿å ¥ããææããããŠCMãæ¿å ¥ããææãæ£ç¢ºã«ç¥ãå¿ èŠããããŸããæ§é çãªãã¬ãã·ã£ãŒã¯æ¬¡ã®ãšããã§ãã
- ã¢ã¯ã·ã§ã³æ°ã¯è¶³ãç®ã§ã¯ãªãæãç®ã§ãã åããã°ã©ã ã¯ãCMãã¬ã€ã¯ã®åã«çŽ7ïœ8åã®ã¢ã¯ã·ã§ã³ãçæããŸã â å ¥ååãæ¿ã1ã€ããŠã©ãŒã¿ãŒããŒã¯ã®ã¢ã¯ãã£ããŒã·ã§ã³4ã€ïŒStaticImageOutputActivateãOutput-Pixel座æšã䜿çšãããããã¬ã³ããªã³ã°ããšã«1ã€ïŒããããŠSCTE-35ããŒã«ãŒ2ã€ã§ããCMãã¬ã€ã¯ããšã«ããã«3ã€ã®ã¢ã¯ã·ã§ã³ã远å ãããŸãã360ããã°ã©ã ã®1ã¶æã¯ãã¯ã€ã€ãŒäžã§çŽ2,800ã¢ã¯ã·ã§ã³ã«çžåœããŸãã
- MediaLiveã¯ãã£ã³ãã«ããšã®é åºã匷å¶ããŸãã ã¹ã±ãžã¥ãŒã«ã¢ã¯ã·ã§ã³ã¯æé軞ã§åºå®ãããäºãã«åç §ãåã£ãŠããŸããAPIãç«¶åãšããŠæåŠãããããåããã£ã³ãã«ãžã®æžã蟌ã¿ã䞊è¡åŠçããããšã¯ã§ããŸããã
- AWS Lambdaã«ã¯15åãšãã峿 ŒãªäžéããããŸãã ããã¯ãœãããªãããã§ããèšå®å¯èœãªé ç®ã§ããããŸããããªãŒã±ã¹ãã¬ãŒã¿ãŒã¯ãã®æéå ã«å®äºããªããã°ãªããããããªããã°ãã£ã³ãã«ã¯å端ã«ãããã€ãããç¶æ ã«ãªããŸãã
- éšåçãªå€±æã¯éçšäžå®¹èªã§ããŸããã 360ããã°ã©ã äž174çªç®ã®ããã°ã©ã ã倱æããŠå®è¡ãäžæãããå Žåããªãã¬ãŒã¿ãŒã¯äœããããã€ãããäœããããªãã£ãã®ããå·®åãšããŠç¢ºèªã§ããŸããããã£ã³ãã«ã¯ééã ããã®ç¶æ ã§å ¬éãããèŠèŽè ã¯ã³ã³ãã³ããæåŸ ããŠããå Žæã«ã¹ã¬ãŒããèŠãããšã«ãªããŸãã
- æåã®ããŒãžã§ã³ã§ã¯ãããã°ã©ã ããšã«1ã€ã®BatchUpdateScheduleãéä¿¡ããããã°ã©ã éã«200msã®ã¹ãªãŒããæãã§ããŸããã ããã¯ããã°ã©ã ãããçŽ2.5ç§ã®ãŠã©ãŒã«ã¿ã€ã ã§ãã360ããã°ã©ã ã§ã¯ãMediaLiveãå®äœæ¥ãå§ããåã«ãã§ã«Lambdaã®äžéãè¶ ããŠããŸããŸãã
ãããã£ãŠãä»äºã¯ãããéãæžã蟌ããããšã§ã¯ãããŸãããMediaLiveãèŠæ±ããé åºä¿èšŒã倱ãããšãªãããæžã蟌ã¿åæ°ãæžãããããéšåçãªå€±æããå埩ããããããŠã1åã®åŒã³åºãå ã§å®äºãããããšã§ãã
æ¢åã®ã¢ãããŒãã倱æããçç±
æãããªåé¿çã¯ãã¹ãŠããã¥ãŒãã³ã°ã®åé¡ã§ã¯ãªããæ§é çãªçç±ã§å€±æããŸãã
- ãLambdaã®ã¿ã€ã ã¢ãŠããå¢ããã°ããããããã¯ã§ããŸããã15åã¯AWSãLambdaã®å®è¡ã«èª²ããŠãã峿 Œãªäžéã§ãããã³ã³ãœãŒã«ã§èšå®ã§ããé ç®ã§ã¯ãããŸãããããšãã§ãããšããŠããã«ã¿ãã°ãå¢ããã«ã€ããŠããã°ã©ã ããšã®ã³ã¹ããå¢å€§ããŸã â ããå€ãã®ãŠã©ãŒã«ã¿ã€ã ãè³Œå ¥ããŠããæ¬¡ã®éçã«å°éããã®ãé ãããã ãã§ãã
- ãECS FargateãEC2ã«ç§»è¡ãããããããæ€èšããŸããããåŽäžããŸãããé·æé皌åããã³ã³ããã¯ãç§ãã¡ãã©ã³ã¿ã€ã ãææããããšãæå³ããŸãããã«ã¹ãã§ãã¯ããªãŒãã¹ã±ãŒãªã³ã°ãã³ãŒã«ãã¹ã¿ãŒããšãŠã©ãŒã ããŒã«ã®ãã¬ãŒããªããIAMã¹ã³ãŒãèšå®ããããŠããŒã¹ãçã«å®è¡ããããµãŒãã¹ã®ãªã³ã³ãŒã«èŒªçªãªã©ã§ããLambdaã¯ãæ¬è³ªçã«ããŒã¹ãæ§ã®é«ãã¯ãŒã¯ããŒãã«å¯ŸããŠãåŒã³åºãããšã®åé¢ãšã¢ã€ãã«ç¶æ ã§ã®ãŒãã³ã¹ããæäŸããŸããåäžã®ããã«ããã¯ã解決ããããã«ãããã諊ããæºåã¯ã§ããŠããŸããã§ããã
- ãMediaLiveã®æžã蟌ã¿ã䞊ååããããMediaLiveã¯ãã£ã³ãã«ããšã«ã¹ã±ãžã¥ãŒã«æŽæ°ãã·ãªã¢ã«åããŸããåããã£ã³ãã«ã«å¯Ÿãã䞊è¡ããBatchUpdateScheduleåŒã³åºãã¯ãã¢ã¯ã·ã§ã³ã¿ã€ã ã©ã€ã³äžã§ç«¶åããæåŠãããŸããå¯äžæ£åœãªäžŠååŠçã¯ããããå ã§ããããããéã§ã¯ãããŸããã
- ãã¯ã©ãã·ã¥ãããŠããªãã¬ãŒã¿ãŒã«å詊è¡ãããããããã¯ææªã®éžæè¢ã§ããããã°ã©ã Nã§ãããã€ãäžæãããå Žåããã£ã³ãã«ã¯UIããã§ã¯èª°ã説æã§ããªãç¶æ ã«ãªããŸãããªãã¬ãŒã¿ãŒã¯å·®åã確èªã§ããããã©ãã¯ããã¯ã¹ãšç©Žã®éããã©ã€ããã£ã³ãã«ãåãåãããšã«ãªããŸããã·ã¹ãã ã¯ããã¹ãŠããããã€ãããããªãã¬ãŒã¿ãŒã察å¿ã§ããããã°ã©ã ããšã®ã¹ããŒã¿ã¹ä»ãã§éšåçãªçµæããããã€ãããã®ã©ã¡ããã§ãªããã°ãªããŸããã
ç§ãã¡ã«æ®ãããå¯äžã®ã¬ããŒã¯ãäœæ¥èªäœã®åœ¢ã§ãããããªãã¡ãããå°ãªãããã倧ããªæžã蟌ã¿ã鿬¡å®è¡ããããããæåŠãããå Žåã«ã®ã¿è¡ã¬ãã«ã®ç²åºŠã«ãã©ãŒã«ããã¯ããä»çµã¿ã§ãã
ç§ãã¡ã®ãœãªã¥ãŒã·ã§ã³
ã«ãŒããå§ãŸãåã«Lambdaããã³ã¹ããæé€ããã«ãŒãå ã§MediaLiveã®æžã蟌ã¿ãçµåãããããã倱æããå Žåã«ã®ã¿ããã°ã©ã ããšã®éä¿¡ã«ãã©ãŒã«ããã¯ããŸãããã®3ã€ã®ã¢ã€ãã¢ããã®é åºã§å®è¡ããŸããããããŠãçŸåšå®éã«ãããã€ããŠããã«ã¿ãã°ãµã€ãºã§ããã°15åã®äžéã§åé¡ãªããšæå³çã«å€æããŸããããã¬ã€ãªã¹ãã1åã®åŒã³åºãã§åŠçããããªããªã£ãå Žåãçãã¯ããã倧ããªLambdaãã§ã¯ãªãããç°ãªãã©ã³ã¿ã€ã ãã§ãã

ã¢ãŒããã¯ãã£
- NestJSããã¯ãšã³ã (schedule.service.ts) â ãããã€ãäºåæºåããŸãããã¹ãŠã®ãŠããŒã¯ãªãããªã«å¯ŸããŠ1åã®Mongoã©ãŠã³ãããªããããã¹ãŠã®ã¢ãããŒã«ãŒã«å¯ŸããŠ1åã®ã©ãŠã³ãããªãããè¡ãããã®åŸããŠããŒã¯ãªãããªURLã«å¯ŸããŠffprobeã䞊è¡ããŠå®è¡ãããã®çµæããšã³ãªããã¡ã³ãã«ãŒãã®ããã«ãã£ãã·ã¥ããŸãã
- LambdaãªãŒã±ã¹ãã¬ãŒã¿ãŒ (fastChannel-lambda-fun/index.js) â ãããåŠçã«ãŒãããããããšã®ã¹ãããã«ãããã°ã©ã ããšã®ãã©ãŒã«ããã¯ãããã³å€ç«ããã¢ã¯ã·ã§ã³ã®ã¹ã€ãŒããæ åœããŸãã
- MediaLive BatchUpdateScheduleCommand â å¯äžã®æžã蟌ã¿ã€ã³ã¿ãŒãã§ãŒã¹ã§ããå ¥ååãæ¿ãããŠã©ãŒã¿ãŒããŒã¯ãSCTE-35ãCMæ¿å ¥ãªã©ããã¹ãŠã®ã¢ã¯ã·ã§ã³ããããéããŠæµããŸãã
- MongoDB â ããã°ã©ã ããããªãã¢ãããŒã«ãŒã®çã®ãœãŒã¹ã§ããã€ã³ããŒã«ãŒãå ã§ã¯æ±ºããŠã¯ãšãªãããŸããã
- scheduleResults ããã â ãªãã¬ãŒã¿ãŒãã¹ã¿ãã¯ãã¬ãŒã¹ã§ã¯ãªãå·®åãåãåããããã«ãããã¯ãšã³ãã«è¿ãããããã°ã©ã ããšã®scheduled / errorã¹ããŒã¿ã¹ã
äž»èŠãªãšã³ãžãã¢ãªã³ã°æ±ºå®äºé
1. ã«ãŒããå§ãŸãåã«é ãåŠçãäºåæºåãããå ã®ã³ãŒãã§ã¯ããšã³ãªããã¡ã³ãã«ãŒãå ã§ã¹ã±ãžã¥ãŒã«ããšã®Mongoã«ãã¯ã¢ãããšã¹ã±ãžã¥ãŒã«ããšã®ffprobeåŒã³åºããè¡ã£ãŠããŸãã â å žåçãªN+1åé¡ã2忝æã£ãŠããŸãããçŸåšã®ããã¯ãšã³ãã¯ããã¹ãŠã®ãŠããŒã¯ãªãããªãšã¢ãããŒã«ãŒããããã1åã®ã©ãŠã³ãããªããã§äžæ¬ååŸãããã®åŸããŠããŒã¯ãªURLã«å¯ŸããŠffprobeã䞊è¡ããŠå®è¡ãããã®çµæã解決æžã¿ãã£ãã·ã¥ã«æ ŒçŽããŸããã€ã³ããŒã«ãŒãã¯ãã£ãã·ã¥ãããã«ãªããŸããffprobeã®ã¬ã€ãã³ã·ã¯ãã«ãŒãå ã§é次ã§ã¯ãªãããŠããŒã¯ãªURLããšã«1åã ãæ¯æãããŸãã
2. MediaLiveã®æžã蟌ã¿ãçŽ25åã®ãããã«çµåããããªãŒã±ã¹ãã¬ãŒã¿ãŒå ã§ã¯ã200ã¢ã¯ã·ã§ã³ããã¥ãŒã«ç»é²ãããããæåŸã®ããã°ã©ã ã«éãããŸã§ãã¢ã¯ã·ã§ã³ãåäžã®BatchUpdateScheduleCommandã«èç©ãããŸããåããã°ã©ã ã¯çŽ7ïœ8åã®ã¢ã¯ã·ã§ã³ãçæããããããããã¯èªç¶ã«çŽ25ããã°ã©ã ããšã«åãŸããŸãã200ã¢ã¯ã·ã§ã³ã®äžéã¯ãMediaLiveã®ãªã¯ãšã¹ãããšã®ãã€ããŒãå¶éãååã«äžåãããµã€ãºã«ãããããæåŠã®å¯èœæ§ãæžããããã«æ éã«éžæãããŸãã â ãããã¯ãŒã¯ã³ã¹ããååŽããã®ã«ååãªå€§ããã§ãããããã°ã©ã ããšã®ãã©ãŒã«ããã¯ïŒæ¬¡ã®æ±ºå®äºé ïŒãå¿ èŠãªå Žåã«å®äŸ¡ã«ããã®ã«ååãªå°ããã§ãã1åã®ãããã¯ãŒã¯ã©ãŠã³ãããªããã25ååã眮ãæããŸãã以åã¯ãã¹ãŠã®ããã°ã©ã ã®éã«ãã£ã200msã®ã¹ãããã«ããä»ã§ã¯ãã¹ãŠã®ãããã®éã«ãããŸãã
3. é床ã®ããã®ãããåŠçãæ£ç¢ºæ§ã®ããã®ãã©ãŒã«ããã¯ããããåŠçã¯ã1ã€ã®äžè¯ããã°ã©ã ãåããããå ã®ä»ã®24åãæ±æããªãå Žåã«ã®ã¿å®å šã§ããsubmitProgramBatchãäŸå€ãã¹ããŒãããšãcatchãããã¯ã¯retryBatchAsIndividualsãåŒã³åºããŸããããã¯ã倱æãããããå ã®åããã°ã©ã ãç¬èªã®BatchUpdateScheduleCommandãšããŠåéä¿¡ããããã°ã©ã ããšã«status: 'scheduled'ãŸãã¯status: 'error'ãèšé²ãã詊è¡éã«200msã¹ãªãŒãããéšåçãªæåããšã«ã¢ã¯ã·ã§ã³ã¿ã€ã ã©ã€ã³ãååºå®ããŸããé«éãã¹ã¯ãããåŠçãããŸãããªã«ããªãã¹ã¯ç²åºŠã现ããããŸããã©ã¡ãã®æ¹æ³ã§ãããªãã¬ãŒã¿ãŒã¯ããã°ã©ã ããšã®å·®åãåãåããŸãã
4. å€ç«ããã¢ã¯ã·ã§ã³ã¯éäžã§é²æ¢ãããæåŸã«ãŸãšããŠåŠçãããsweepIncompleteProgramGroupsã¯ãããã€ã®æåŸã«äžåºŠå®è¡ãããã¯ãªãŒã³ãªçµç«¯ç¶æ ã«å°éããªãã£ããã¹ãŠã®ã¢ã¯ã·ã§ã³ã°ã«ãŒããåé€ããŸããã«ãŒãäžã«ãã£ã³ãã«ã®å éšæŽåæ§ãç¶æããããšã¯æå³çã«ããŸããã§ãã â ããã¯ã15åã®äºç®å ã«åãŸãããŒã«ããã¯ãã¹ãå¿ èŠã«ãªãããšãæå³ããããã§ããã¯ãªãŒã³ã¢ããã¯åäžã®ã¹ã€ãŒãã§ããããã©ã³ã¶ã¯ã·ã§ã³ã§ã¯ãããŸããã
5. Lambdaã倧ããããã®ã§ã¯ãªããã«ã¿ãã°ã倧ãããªã£ãã眮ãæããã仿¥ãããã€ããŠãããã¹ãŠã®ãã®ã«ã€ããŠãåäžã®åŒã³åºããã¹ã¯äºç®å ã«ååã«åãŸã£ãŠããŸããçã®ã¹ã±ãŒã«ã¢ãŠãã¯Step Functionsãã£ã³ãã³ã°ã§ã â ãã¬ã€ãªã¹ããåå²ãããã£ã³ã¯ã䞊åã¹ããŒããã·ã³ãšããŠå®è¡ããåçµåããŸããããã¯1ã¶æä»¥äžããã³6ã¶æã®ãã¬ã€ãªã¹ãã«å¯Ÿãããã¹ã§ããããã¯èšèšæžã¿ã§ããããããã€ãããŠããŸããããã§ã«çšŒåããŠãããšåœããããããããæ¬¡ã®ã¹ããããšåŒã¶æ¹ãæçšã§ãã
çµæ
- å éšãã¹ãã§ã¯ã195ããã°ã©ã ã®ãããã€ãçŽ44ç§ã§å®äºããŸãã â æ°åããã£ãŠãããããã°ã©ã ã1ã€ãã€åŠçããããŒã¹ã©ã€ã³ããççž®ãããŸããã
- 360ããã°ã©ã ïŒçŽ1ã¶æïŒã®ãã¬ã€ãªã¹ãã®ç®æšå€ã¯90ç§ä»¥äžã§ããã615ç§ã®ããã¯ãšã³ãã¿ã€ã ã¢ãŠããš15åã®Lambdaã®äžéå ã«äœè£ãæã£ãŠåãŸã£ãŠããŸãã
- ãããå ã®1ã€ã®äžè¯ããã°ã©ã ãä»ã®24åã®åŠçãäžæãããããšã¯ãªããªããŸããããªãã¬ãŒã¿ãŒã¯ããã¹ãŠã®ãããã€ããããã°ã©ã ããšã®ã¹ããŒã¿ã¹ããããåãåããŸãã
- ãªã¯ãšã¹ãã®é ãéšå â Mongoã«ãã¯ã¢ãããšffprobe â ã¯ãã¹ã±ãžã¥ãŒã«ãšã³ããªããšã«ã§ã¯ãªãããŠããŒã¯ãªãªãœãŒã¹ããšã«1åã ãæ¯æãããŸãã
- 15åã®äžéã¯ãå®éã«é ä¿¡ããŠããã«ã¿ãã°ãµã€ãºã«ãšã£ãŠå¶çŽèŠå ã§ã¯ãªããªããŸãããåã³å¶çŽèŠå ãšãªã£ãå Žåãçãã¯ãã倧ããªLambdaã§ã¯ãªããStep Functionsãã£ã³ãã³ã°ã§ãã
ãã¯ãããžãŒã¹ã¿ãã¯: AWS Lambda · AWS MediaLive · NestJS · MongoDB · Node 18 · ffprobe · TypeScript · AWS SDK v3

