Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWSソリューションを活用して 1ヶ月で動画配信機能をリリースした話 / The story of releasing the Video distribution service in one month using AWS solutions

dehio3
April 27, 2021

AWSソリューションを活用して 1ヶ月で動画配信機能をリリースした話 / The story of releasing the Video distribution service in one month using AWS solutions

dehio3

April 27, 2021
Tweet

More Decks by dehio3

Other Decks in Technology

Transcript

  1. © 2021 CoDMON Inc. 株式会社コドモン AWS Startup Tech Meetup Online

    #4 AWSソリューションを活用して 1ヶ月で動画配信機能をリリースした話
  2. © 2021 CoDMON Inc. 田中 知英  @dehio3 株式会社コドモン SREチーム •

    職歴 ◦ PA(音響屋)からITに転職 ◦ SIer、ASP (アフィリエイト)でインフラ ◦ 2020年10月にコドモンにJoin • 好きなAWSサービス ◦ Route53,S3,Lambda 自己紹介 2
  3. © 2021 CoDMON Inc. agenda • コドモンの紹介 • コドモンのシステム構成 •

    AWSソリューションについて • AWSソリューション利用時の課題と対策 • まとめ 3
  4. 多様な機能で、こども施設で働く先生の働き方改革や 
 
 パパママの子育て支援を行う クラウド型ICTシステム。
 ・保育料支払い支援 ・こどもの成長管理 ・写真アルバム (※新サービス展開予定) など…

    ・成長記録 ・指導案の記録 ・保護者との コミュニケーション など…  利用者数 0144,620 名 利用者数 698,790 名 Product 先生向けの機能 保護者向けの機能
  5. © 2021 CoDMON Inc. AWS Cloud 10 施設 保護者 システム構成概要

    施設向け管理サイト 保護者向けアプリ
  6. © 2021 CoDMON Inc. 動画配信機能の要件 • 「お知らせ一斉配信」という施設から保護者へのお知らせ機能へ添付対象に、 動画ファイルを追加する • 卒園、入園シーズンで施設が活用できるように3月までにリリースする!!

    12 施設 保護者 しかし機能導入に際し課題が・・ • コドモンでの動画機能の提供は初めてで、社 内でのノウハウがない! • スピード重視だが、IaCを推進しているため、 AWSコンソールから手動作成だけは避けた い!
  7. © 2021 CoDMON Inc. 18 AWSソリューション/Video on Demand on AWS

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

    選定理由② DynamoDBに情報を保存する構成の為、アプ リケーションから動画の情報を参照可能
  9. © 2021 CoDMON Inc. ビデオオンデマンドCFnテンプレートで作成 AWS Cloud 21 施設 保護者

    動画配信構成予想図 しかし、 プロダクトで利用するにはいくつかの課題が・・
  10. © 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
  11. © 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 ① ② ③
  12. © 2021 CoDMON Inc. 課題①無音動画が配信できない • 対策 ◦ encode処理のLambda(nodejs)を修正 ▪

    DynamoDBのmediainfo解析情報から音声データの情報を取得 ▪ 音声データ有無でJobTemplateから「AudioSelectors」を削除 26
  13. © 2021 CoDMON Inc. AWSソリューションでは、テストコードも提供されている為、 修正とテストのハードルが低いのが利点!! source/encode ├── index.js ←コードを修正

    ├── lib │ ├── error.js │ └── index.spec.js ←テストコード └── package.json 課題①無音動画が配信できない • 対策 ◦ encode処理のLambda(nodejs)を修正 ▪ DynamoDBのmediainfo解析情報から音声データの情報を取得 ▪ 音声データ有無でJobTemplateから「AudioSelectors」を削除 27
  14. © 2021 CoDMON Inc. AWS Cloud 28 施設 保護者 動画配信構成予想図

    課題② 動画コンテンツへのアクセス制限がない
  15. © 2021 CoDMON Inc. 課題②動画コンテンツへのアクセス制限がない • 課題 ◦ 動画はプライベートコンテンツの為アクセスを制限したいが、URLを知っ ていれば誰でも動画を視聴することができてしまう

    • AWSソリューションの実装 ◦ CloudFront経由でS3のファイルを配信しているが、CloudFrontでのアク セス制限機能は設定されていない 29
  16. © 2021 CoDMON Inc. 課題②動画コンテンツへのアクセス制限がない • 対策 ◦ CloudFrontの署名付きアクセス機能を利用 ◦

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

    HLS形式は動画ファイルが複数に分割されるので、「署名付きURL」では なく「署名付き Cookie」によるアクセス制限を実装 31 署名付き URL と署名付き Cookie の選択  アプリケーションの実装上の問題で、Cookieを保持できない事が発覚!!
  18. © 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=*****
  19. © 2021 CoDMON Inc. 課題③イベントの通知 • 課題 ◦ イベントとエラーの通知先がメールなので可読性が悪い •

    AWSソリューションの実装 ◦ SNSのサブスクリプションとしてEメールが使用 ◦ CFnテンプレート実行時に指定したアドレスが登録 34
  20. © 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/
  21. © 2021 CoDMON Inc. 課題③イベントの通知 • 対応② ◦ サブスクリプション先にDatadogイベントストリームを追加 ◦

    イベントの文言からエラーイベントを監視通知 36 Datadogにも同じイベント飛ばす理由 - サービス監視はDatadogに集約 - サービス全体のリソースとの相関把握
  22. © 2021 CoDMON Inc. 課題④インフラのコード管理 • 課題 ◦ コドモンは本番、ステージ、開発の3環境で運用している ◦

    既存インフラは「Terraform」+「GitHub Actions」でデプロイを自動化 しており、CFnでも同様にデプロイまで自動化したい • AWSソリューションの実装 ◦ ビルドシェル(build-s3-dist.sh)が提供 ◦ S3へアップロードするCFnテンプレートの生成と、Lambdaコードのアー カイブファイル群を生成 38
  23. © 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
  24. © 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://<env>_paramter.json video-on-demand-on-aws .template
  25. © 2021 CoDMON Inc. deploy.sh <env> ①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 <env>_parameter.json
  26. © 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
  27. © 2021 CoDMON Inc. 48 まとめ AWSソリューションは開発速度を早めるのに最適なツール • テストコードも用意されてるので、テスト実装が容易できる •

    CFnテンプレートで提供されているのIaC、CI/CDも実装しやすい • 初学者向けの学習用途としても活用できる  今後のAWSソリューションの拡大に期待!ぜひ活用していきましょう!