Slide 1

Slide 1 text

© 2021 CoDMON Inc. 株式会社コドモン AWS Startup Tech Meetup Online #4 AWSソリューションを活用して 1ヶ月で動画配信機能をリリースした話

Slide 2

Slide 2 text

© 2021 CoDMON Inc. 田中 知英  @dehio3 株式会社コドモン SREチーム ● 職歴 ○ PA(音響屋)からITに転職 ○ SIer、ASP (アフィリエイト)でインフラ ○ 2020年10月にコドモンにJoin ● 好きなAWSサービス ○ Route53,S3,Lambda 自己紹介 2

Slide 3

Slide 3 text

© 2021 CoDMON Inc. agenda ● コドモンの紹介 ● コドモンのシステム構成 ● AWSソリューションについて ● AWSソリューション利用時の課題と対策 ● まとめ 3

Slide 4

Slide 4 text

コドモンの紹介

Slide 5

Slide 5 text

Mission

Slide 6

Slide 6 text

多様な機能で、こども施設で働く先生の働き方改革や 
 
 パパママの子育て支援を行う クラウド型ICTシステム。
 ・保育料支払い支援 ・こどもの成長管理 ・写真アルバム (※新サービス展開予定) など… ・成長記録 ・指導案の記録 ・保護者との コミュニケーション など…  利用者数 0144,620 名 利用者数 698,790 名 Product 先生向けの機能 保護者向けの機能

Slide 7

Slide 7 text

Account 8,000 施設以上 で導入開始へ。 . 4 . 4 . 4 . 4 . 4 . 4 . 4 8000 目標達成!

Slide 8

Slide 8 text

8 3月に動画配信機能をリリース 日頃の子供の様子を写真だ けでなく、動画でも保護者 へ伝えたい 緊急事態宣言でイベントへ の参加できない保護者へ動 画を見せたい

Slide 9

Slide 9 text

コドモンのシステム構成

Slide 10

Slide 10 text

© 2021 CoDMON Inc. AWS Cloud 10 施設 保護者 システム構成概要 施設向け管理サイト 保護者向けアプリ

Slide 11

Slide 11 text

© 2021 CoDMON Inc. 導入した動画配信機能の要件 ● 施設から保護者への連絡を行う「お知らせ配信機能」に動画ファイルを添付し 保護者へ配信したい ● 卒園、入園シーズンに施設が活用できるように3月までにリリースする!! 11 施設 保護者

Slide 12

Slide 12 text

© 2021 CoDMON Inc. 動画配信機能の要件 ● 「お知らせ一斉配信」という施設から保護者へのお知らせ機能へ添付対象に、 動画ファイルを追加する ● 卒園、入園シーズンで施設が活用できるように3月までにリリースする!! 12 施設 保護者 しかし機能導入に際し課題が・・ ● コドモンでの動画機能の提供は初めてで、社 内でのノウハウがない! ● スピード重視だが、IaCを推進しているため、 AWSコンソールから手動作成だけは避けた い!

Slide 13

Slide 13 text

AWSソリューション

Slide 14

Slide 14 text

© 2021 CoDMON Inc. 14 AWSソリューション https://aws.amazon.com/jp/solutions

Slide 15

Slide 15 text

© 2021 CoDMON Inc. AWSソリューション 15 構成概要の説明 CFnテンプレートと ソースコードが提供

Slide 16

Slide 16 text

© 2021 CoDMON Inc. 16 AWSソリューション/ビデオオンデマンド ビデオオンデマンドソリューションの実装

Slide 17

Slide 17 text

© 2021 CoDMON Inc. 17 AWSソリューション/ビデオオンデマンド ビデオオンデマンドソリューションの実装 「Video on Demand on AWS」を利用

Slide 18

Slide 18 text

© 2021 CoDMON Inc. 18 AWSソリューション/Video on Demand on AWS 選定理由① AWS Step Functionsにて処理を制御し ている為、処理のカスタマイズが可能

Slide 19

Slide 19 text

© 2021 CoDMON Inc. 19 AWSソリューション/Video on Demand on AWS 選定理由② DynamoDBに情報を保存する構成の為、アプ リケーションから動画の情報を参照可能

Slide 20

Slide 20 text

© 2021 CoDMON Inc. ビデオオンデマンドCFnテンプレートで作成 AWS Cloud 20 施設 保護者 動画配信構成イメージ

Slide 21

Slide 21 text

© 2021 CoDMON Inc. ビデオオンデマンドCFnテンプレートで作成 AWS Cloud 21 施設 保護者 動画配信構成予想図 しかし、 プロダクトで利用するにはいくつかの課題が・・

Slide 22

Slide 22 text

AWSソリューション利用時の課題と対策

Slide 23

Slide 23 text

© 2021 CoDMON Inc. AWS Cloud 23 施設 保護者 動画配信構成予想図 課題① 無音動画が配信できない

Slide 24

Slide 24 text

© 2021 CoDMON Inc. 課題①無音動画が配信できない ● 課題 ○ 無音動画アップロードすると処理がエラーになり配信できない 24 mediaconvert.createJob ● AWSソリューションの実装 ○ MediaConvertのJobTemplateはLambdaで生成 ○ Inputsに「AudioSelectors」で固定で記述 ○ 音声データ存在する前提になっている 入力元,出力先のS3バケットや動画の出力形式などをJSONで指定 https://github.com/awslabs/video-on-demand-on-aws/blob/master/source/encode/index.js

Slide 25

Slide 25 text

© 2021 CoDMON Inc. 課題①無音動画が配信できない ● 解決策を探るために前段の取り込み処理を調査 1. S3のイベントからオブジェクトのパス情報などを取得 2. mediainfoにてアップロードされた動画ファイルを解析 3. 解析データをDynamoDBへ保存 25 https://github.com/awslabs/video-on-demand-on-aws/blob/master/source/mediainfo/lambda_function.py ① ② ③

Slide 26

Slide 26 text

© 2021 CoDMON Inc. 課題①無音動画が配信できない ● 対策 ○ encode処理のLambda(nodejs)を修正 ■ DynamoDBのmediainfo解析情報から音声データの情報を取得 ■ 音声データ有無でJobTemplateから「AudioSelectors」を削除 26

Slide 27

Slide 27 text

© 2021 CoDMON Inc. AWSソリューションでは、テストコードも提供されている為、 修正とテストのハードルが低いのが利点!! source/encode ├── index.js ←コードを修正 ├── lib │ ├── error.js │ └── index.spec.js ←テストコード └── package.json 課題①無音動画が配信できない ● 対策 ○ encode処理のLambda(nodejs)を修正 ■ DynamoDBのmediainfo解析情報から音声データの情報を取得 ■ 音声データ有無でJobTemplateから「AudioSelectors」を削除 27

Slide 28

Slide 28 text

© 2021 CoDMON Inc. AWS Cloud 28 施設 保護者 動画配信構成予想図 課題② 動画コンテンツへのアクセス制限がない

Slide 29

Slide 29 text

© 2021 CoDMON Inc. 課題②動画コンテンツへのアクセス制限がない ● 課題 ○ 動画はプライベートコンテンツの為アクセスを制限したいが、URLを知っ ていれば誰でも動画を視聴することができてしまう ● AWSソリューションの実装 ○ CloudFront経由でS3のファイルを配信しているが、CloudFrontでのアク セス制限機能は設定されていない 29

Slide 30

Slide 30 text

© 2021 CoDMON Inc. 課題②動画コンテンツへのアクセス制限がない ● 対策 ○ CloudFrontの署名付きアクセス機能を利用 ○ HLS形式は動画ファイルが複数に分割されるので、「署名付きURL」では なく「署名付き Cookie」によるアクセス制限を実装 30 署名付き URL と署名付き Cookie の選択

Slide 31

Slide 31 text

© 2021 CoDMON Inc. 課題②動画コンテンツへのアクセス制限がない ● 対策 ○ CloudFrontの署名付きアクセス機能を利用 ○ HLS形式は動画ファイルが複数に分割されるので、「署名付きURL」では なく「署名付き Cookie」によるアクセス制限を実装 31 署名付き URL と署名付き Cookie の選択  アプリケーションの実装上の問題で、Cookieを保持できない事が発覚!!

Slide 32

Slide 32 text

© 2021 CoDMON Inc. 課題②動画コンテンツへのアクセス制限がない ● 対策2 ○ Lambda@Edgeで署名付きURLのレスポンスを動的に返す ○ プレイリスト(.m3u8)への署名付きURLリクエストをLambda@Edgeで受 け、動画ファイル(.ts)情報に署名情報を追加したレスポンスを返す 32 lambda@Edge 署名付きURL *.m3u8?Policy=***** .m3u8 .ts #EXTINF:40, 6049e3a17174c_720p_30Hz_2.0Mbps_00001.ts? #EXTINF:30, 6049e3a17174c_720p_30Hz_2.0Mbps_00002.ts? プレイリスト取得 動画ファイル取得 #EXTINF:40, 6049e3a17174c_720p_30Hz_2.0Mbps_00001.ts?Policy=***** #EXTINF:30, 6049e3a17174c_720p_30Hz_2.0Mbps_00002.ts?Policy=***** *.ts?Policy=*****

Slide 33

Slide 33 text

© 2021 CoDMON Inc. AWS Cloud 33 施設 保護者 動画配信構成予想図 課題③ イベントの通知

Slide 34

Slide 34 text

© 2021 CoDMON Inc. 課題③イベントの通知 ● 課題 ○ イベントとエラーの通知先がメールなので可読性が悪い ● AWSソリューションの実装 ○ SNSのサブスクリプションとしてEメールが使用 ○ CFnテンプレート実行時に指定したアドレスが登録 34

Slide 35

Slide 35 text

© 2021 CoDMON Inc. 課題③イベントの通知 ● 対応① ○ slack通知用のLambdaを作成し、サブスクリプション先に追加 ○ 必要な情報のみを整形して通知 ○ Slackで他部署もサービス利用状況を把握 35 https://aws.amazon.com/jp/about-aws/whats-new/2021/04/aws-chatbot-now-expa nds-coverage-of-aws-services-monitored-through-amazon-eventbridge/

Slide 36

Slide 36 text

© 2021 CoDMON Inc. 課題③イベントの通知 ● 対応② ○ サブスクリプション先にDatadogイベントストリームを追加 ○ イベントの文言からエラーイベントを監視通知 36 Datadogにも同じイベント飛ばす理由 - サービス監視はDatadogに集約 - サービス全体のリソースとの相関把握

Slide 37

Slide 37 text

© 2021 CoDMON Inc. AWS Cloud 37 施設 保護者 動画配信構成予想図 課題④ インフラのコード管理

Slide 38

Slide 38 text

© 2021 CoDMON Inc. 課題④インフラのコード管理 ● 課題 ○ コドモンは本番、ステージ、開発の3環境で運用している ○ 既存インフラは「Terraform」+「GitHub Actions」でデプロイを自動化 しており、CFnでも同様にデプロイまで自動化したい ● AWSソリューションの実装 ○ ビルドシェル(build-s3-dist.sh)が提供 ○ S3へアップロードするCFnテンプレートの生成と、Lambdaコードのアー カイブファイル群を生成 38

Slide 39

Slide 39 text

© 2021 CoDMON Inc. build-s3-dist.sh 課題④インフラのコード管理 ● ビルドシェル(build-s3-dist.sh)を利用したデプロイの流れ ○ CFnテンプレート内のバケット名やリソースのプレフィックなどを、ユー ザーの指定した値に置換したCFnテンプレートを作成 39 video-on-demand-on-aws .template video-on-demand-on-aws. yaml copy & sed create package S3 upload create stack 以下は手動 ・S3アップロード ・スタックの作成 https://github.com/awslabs/video-on-demand-on-aws/blob/master/deployment/build-s3-dist.sh

Slide 40

Slide 40 text

© 2021 CoDMON Inc. 課題④インフラのコード管理 ● 対応①環境固有の値をパラメータ化し複数環境対応 ○ CloudFrontの「PublicKeyId」や「Aliases」などいくつか固有値が発生 ○ パラメータとして定義することで、スタック作成時に動的に値を渡せるよ うに修正 40 create stack dev_parameter.json dev create stack dev_parameter.json stg create stack prd_parameter.json prd $ aws cloudformation deploy --parameter-overrides file://_paramter.json video-on-demand-on-aws .template

Slide 41

Slide 41 text

© 2021 CoDMON Inc. deploy.sh ①build-s3-dist.sh 課題④インフラのコード管理 ● 対応②deploy.shの作成 ○ 一連の処理を実行するシェルを作成 ○ 引数に環境名を与えることで、呼び出すパラメータを変更 41 video-on-demand-on-aws .template video-on-demand-on-aws. yaml copy & sed create package ②aws s3 cp ③aws cloudformation deploy _parameter.json

Slide 42

Slide 42 text

© 2021 CoDMON Inc. 課題④インフラのコード管理 ● 対応③CI/CD対応 ○ CircleCIにてdeploy.shを実行するワークフローを定義 ○ ブランチ毎に環境変数を定義し環境毎に自動デプロイ 42 deploy.sh develop staging production dev stg prd $dev $stg $prd workflows: version: 2 build-flow: jobs: - deploy: filters: branches: only: develop context: - aws-dev-circleci - slack-notice - deploy: filters: branches: only: staging context: - aws-stg-circleci - slack-notice - deploy: filters: branches: only: main context: - aws-prd-circleci - slack-notice

Slide 43

Slide 43 text

© 2021 CoDMON Inc. 43 最終的な構成

Slide 44

Slide 44 text

© 2021 CoDMON Inc. AWS Cloud 44 lambda@Edge 施設 保護者 動画配信リリース時構成図

Slide 45

Slide 45 text

© 2021 CoDMON Inc. AWS Cloud 45 施設 保護者 動画配信構成イメージ

Slide 46

Slide 46 text

© 2021 CoDMON Inc. AWS Cloud 46 lambda@Edge 施設 保護者 動画配信リリース時構成図

Slide 47

Slide 47 text

まとめ

Slide 48

Slide 48 text

© 2021 CoDMON Inc. 48 まとめ AWSソリューションは開発速度を早めるのに最適なツール ● テストコードも用意されてるので、テスト実装が容易できる ● CFnテンプレートで提供されているのIaC、CI/CDも実装しやすい ● 初学者向けの学習用途としても活用できる  今後のAWSソリューションの拡大に期待!ぜひ活用していきましょう!

Slide 49

Slide 49 text

ご清聴、ありがとうございました。 あらたな仲間も絶賛募集中です。