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

AWSソリューションを活用して 1ヶ月で動画配信機能をリリースした話 / The story ...

Avatar for dehio3 dehio3
April 27, 2021

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

Avatar for dehio3

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ソリューションの拡大に期待!ぜひ活用していきましょう!