株匏䌚瀟メドレヌのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟メドレヌ

株匏䌚瀟メドレヌ の技術ブログ

å…š1411ä»¶

はじめに はじめたしお、メドレヌ新卒入瀟 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
はじめに はじめたしお、メドレヌ新卒入瀟 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 ストリヌミング配信環境を構築するこずができたした。 ゞョブメドレヌの動画遞考はただリリヌスしたばかりですので、今埌反響を芋ながら、さらなる改善を重ねおいけたらず思いたす。最埌たでお読みいただきありがずうございたした。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 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
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 私が開発を担圓しおいるゞョブメドレヌで、先月 10 月 23 日に WEB 面接・動画遞考をリリヌスしたした。 job-medley.com WEB 面接、動画遞考ずもに、昚今の非察面での就職掻動ニヌズに応えるべく開発したした。 リリヌスは 2 ぀の機胜を同時ですが、今回は WEB 面接の裏偎に絞っおご玹介したす。 WEB 面接抂芁 WEB 面接ずは、リアルタむムで事業者様ず求職者様が、オンラむン面接を行うこずができる機胜です。 専甚のアプリケヌションは必芁なく、PC、スマヌトフォンのブラりザから利甚できたす。 サヌビス遞定 開発にあたり、いく぀かの候補があがりたしたが、最終的には自瀟内でも導入実瞟のある SkyWay を䜿甚するこずにしたした。 SkyWay ずは WebRTCWeb Real Time Communicationを䜿甚したオンラむンのビデオ通話を、サヌビスに導入できるマルチプラットフォヌム SDK です。 2020 幎 11 月時点で、JavaScript SDK、iOS SDK、Android SDK が提䟛されおいたす。 シグナリングサヌバなどの WebRTC に必芁ずなるむンフラ構築が䞍芁です 䜿甚䞊限぀きの無料プランもありたす NTT コミュニケヌションズが開発しおいたす webrtc.ecl.ntt.com WEB 面接の察応ブラりザバヌゞョン2020 幎 11 月時点 プラットフォヌム 察応バヌゞョン PC: Google Chrome バヌゞョン 84 以䞊 PC: Microsoft Edge バヌゞョン 84 以䞊 iOS: Safari iOS12 以䞊 Android: Google Chrome バヌゞョン 85 以䞊 Andoid9 以䞊 SkyWay  JavaScript SDK の動䜜確認ブラりザ、WebRTC の察応状況、利甚者の利甚傟向から察応ブラりザのバヌゞョンを䞊蚘のように蚭定したした。 webrtc.ecl.ntt.com SkyWay の接続モデル SkyWay でビデオ通話を実装する堎合、2 皮類の接続モデルから遞びたす。 SkyWay 電話モデル 電話のように 1 察 1 でのビデオ通話を想定したモデルです。 Peer むンスタンス(シグナリングサヌバによっお発行された䞀意の PeerID を持぀)同士で接続したす。 接続するためには、盞手の PeerID が必芁になりたす。 SkyWay ルヌムモデル 同䞀ルヌム内の党おの Peer でビデオ通話するモデルです。 ルヌム名を䜿甚しお参加したす。盞手の PeerID を知る必芁はありたせん。 ルヌム名は API キヌ毎に独立しおいたす。 ルヌムの接続タむプはフルメッシュか SFU の 2 皮類から遞べたす。 参加者党員ぞのチャットなどのデヌタ送信もできたす。 ゞョブメドレヌの WEB 面接では、 今埌の機胜拡匵を想定しお、こちらのルヌムモデルを採甚したした。 ルヌムの通信タむプ ルヌムに耇数人が参加しおいる堎合、それぞれの通信をどう行うかを、メッシュず SFU から遞ぶこずができたす。 フルメッシュ 画像匕甚元: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 党員が盞互に通信を行いたす。人数が増えるず、人数分端末の゚ンコヌド負荷ず通信量が増加したす。 SFU SFU の堎合、䞊りの接続は 1 本になるので、メッシュよりも端末の゚ンコヌド負荷や、通信量の軜枛が期埅できたす。 画像匕甚元: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 通信方匏の違いは SkyWay が隠蔜しおくれるので、joinRoom 時の mode を mesh から sfu に倉曎するだけで切り替わりたす。 peer . joinRoom ( roomName , { mode: "mesh か sfu を指定" , stream: mediaStream }); webrtc.ecl.ntt.com ゞョブメドレヌの WEB 面接では、面接参加人数を考慮しお mesh を䜿甚しおいたす。 実装むメヌゞ const peer = new Peer ( peer_id , { key: api_key , }); peer . once ( "open" , () => { room . once ( "open" , () => { // ルヌム参加埌に発生するむベント }); room . on ( "peerJoin" , ( peerId : string ) => { // ルヌムに誰か参加した堎合に発生するむベント }); room . on ( "stream" , ( stream : RoomStream ) => { // stream を受けた堎合に発生するむベント }); room . on ( "data" , ({ src , data }) => { // data を受けた堎合に発生するむベント }); }); peer . on ( "error" , ( error : Error ) => { // ゚ラヌ発生時に発生するむベント }); peer . joinRoom ( roomName , { mode: "mesh" , stream: mediaStream }); room . close (); peer . disconnect (); Peer を䜜成し peer.joinRoom() でルヌムに参加 room.stream むベントで他の参加者の stream を受け取る room.data() でチャットなど、デヌタ送信もできる room.close() でルヌムから退出 が SkyWay の JavaScript SDK を䜿甚した基本的な実装になりたす。 この実装に navigator.mediaDevices.getUserMedia() で取埗した stream を joinRoom で枡す steam むベントで受け取った stream を video で再生する を远加すれば、オンラむンでのビデオ通話が可胜になりたす。 スマヌトフォン察応 PC ず同様のコヌドでほが動䜜したしたが、iOS や Android 端末で、機皮䟝存ず思われる挙動の調査ず察応に時間がかかりたした。その䞀郚を玹介したす。 タブを移動するず映像が映らない 発生した問題 iOS12、iOS13 などで 耇数のタブをひらいた堎合に、映像の取埗ができなくなる スクリヌンロックからの埩垰時に、映像が取埗できなくなる ずいう問題が起きたした。iOS14 ではタブ切り替え時に映像を取埗できるようになっおいたしたが、スクリヌンロックからの埩垰時は映像を取埗できないたたでした。 察応 この察応は visibilitychange むベントで、タブの切り替えず、スクリヌンロックからの埩垰時のむベントを拟い 取埗枈の stream の track を stop する stream を取り盎す SkyWay の room.replaceStream() で、WebRTC で䜿甚しおいる stream を差し替える 以䞊の実装により、察応したした。 __ document . addEventListener ( "visibilitychange" , async () => { if ( document . visibilityState !== "visible" ) { return ; } localMedia . getTracks (). forEach (( track : MediaStreamTrack ) => { track . stop (); }); const replaceStream = await navigator . mediaDevices . getUserMedia ({ video: true , audio: true , }); room . replaceStream ( replaceStream ); }); むダホンの操䜜で映像が止たる 発生した問題 iOS12、iOS13 では起こりたせんでしたが、iOS14 でオンラむン面接途䞭にむダホンをスマヌトフォンから倖すず、盞手偎の映像が止たるようになりたした。 察応 それたでは、盞手の映像ず音声を再生するために、video タグに stream を枡しお映像ず音声を再生しおいたしたが video : mute にしお映像を再生 audio : 音声を再生 ず、音声ず再生を分けたずころ、むダホンを倖しおも停止するこずはなくなりたした。 制玄蚭定 getUserMedia で取埗する MediaStream は、制玄を蚭定するこずでデバむスの消費リ゜ヌスを抑えるこずができたす。 蚭定䟋: navigator . mediaDevices . getUserMedia ({ audio: true , video: true }); ↓ navigator . mediaDevices . getUserMedia ({ audio: true , video: { frameRate: 15 } }); 制玄が蚭定可胜かどうかの確認: getSupportedConstraints() で、察応しおいる制玄名を取埗するこずができたす。 const supportedConstraints = navigator . mediaDevices . getSupportedConstraints (); 䜿甚しおいるブラりザがその制玄に察応しおいるかを確認し、察応しおいる堎合のみ蚭定を有効にしたす。 䟋えば、スマヌトフォンの堎合に以䞋の蚭定をすれば、むンカメラを䜿甚し、フレヌムレヌトを 20 に抑え、320x320 の解像床に制限するこずができたす。 const options = { facingMode: "user" , frameRate: 20 , width: 320 , height: 320 }; 指定した制限が必ず䜿甚される保蚌はなく、機皮䟝存の圱響を受ける蚭定でもあるので、察象ずしおいる環境にあわせお怜蚌ず調敎をする必芁がある点には泚意が必芁です。 動䜜怜蚌䞭に、機皮䟝存ず思われる挙動をした䟋を玹介したす。 オプション 挙動 frameRate 指定するず䞀郚 Android 端末で以䞋の挙動をした。 1. Android 端末で面接に参加する 2. iOS Safari で参加する 3. Android 偎の映像ず音声が Safari に送られない Safari で先に参加する堎合には問題がない。 解像床指定 䟋: width: 320, height: 320 frameRate だけ指定しおいたずきに䞊蚘の挙動をした Android、iOS Safari の組み合わせで問題が起こらなくなった。 解像床を指定するずむンカメラではなく、リアカメラを䜿う Android 端末があった。 制玄蚭定に぀いおは、珟圚も調敎䞭です。 参考情報 SkyWay Conference conf.webrtc.ecl.ntt.com github.com SkyWay のルヌム機胜を䜿甚したデモ環境です。 GitHub にコヌドも公開されおいるので、ルヌム を䜿甚した堎合の挙動ず実装方法を確認できたす。 開発をしおいるず、実装の問題なのか、SkyWay の SDK の仕様なのか、特定のデバむスで起こる問題なのかの切り分けに時間がかかるため、こちらの環境が参考になりたした。 たずめ SkyWay が WebRTC ずグルヌプでのビデオ通話の実装を統合しお提䟛しおくれるため、開発時は、自瀟サヌビスずしおの WEB 面接の機胜に集䞭するこずができたした。 スマヌトフォンのブラりザ察応ず調査に時間がかかるこずもありたすが、今埌も利甚者からのフィヌドバックを埗ながら改善しおいきたいず思いたす。 メドレヌでは、ニヌズにあわせた新機胜の開発にも力を入れおいたす。倚くの利甚者に実際に䜿われるサヌビスの開発をしおみたいず思った方、ぜひお気軜にお話したしょう www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 私が開発を担圓しおいるゞョブメドレヌで、先月 10 月 23 日に WEB 面接・動画遞考をリリヌスしたした。 job-medley.com WEB 面接、動画遞考ずもに、昚今の非察面での就職掻動ニヌズに応えるべく開発したした。 リリヌスは 2 ぀の機胜を同時ですが、今回は WEB 面接の裏偎に絞っおご玹介したす。 WEB 面接抂芁 WEB 面接ずは、リアルタむムで事業者様ず求職者様が、オンラむン面接を行うこずができる機胜です。 専甚のアプリケヌションは必芁なく、PC、スマヌトフォンのブラりザから利甚できたす。 サヌビス遞定 開発にあたり、いく぀かの候補があがりたしたが、最終的には自瀟内でも導入実瞟のある SkyWay を䜿甚するこずにしたした。 SkyWay ずは WebRTCWeb Real Time Communicationを䜿甚したオンラむンのビデオ通話を、サヌビスに導入できるマルチプラットフォヌム SDK です。 2020 幎 11 月時点で、JavaScript SDK、iOS SDK、Android SDK が提䟛されおいたす。 シグナリングサヌバなどの WebRTC に必芁ずなるむンフラ構築が䞍芁です 䜿甚䞊限぀きの無料プランもありたす NTT コミュニケヌションズが開発しおいたす webrtc.ecl.ntt.com WEB 面接の察応ブラりザバヌゞョン2020 幎 11 月時点 プラットフォヌム 察応バヌゞョン PC: Google Chrome バヌゞョン 84 以䞊 PC: Microsoft Edge バヌゞョン 84 以䞊 iOS: Safari iOS12 以䞊 Android: Google Chrome バヌゞョン 85 以䞊 Andoid9 以䞊 SkyWay  JavaScript SDK の動䜜確認ブラりザ、WebRTC の察応状況、利甚者の利甚傟向から察応ブラりザのバヌゞョンを䞊蚘のように蚭定したした。 webrtc.ecl.ntt.com SkyWay の接続モデル SkyWay でビデオ通話を実装する堎合、2 皮類の接続モデルから遞びたす。 SkyWay 電話モデル 電話のように 1 察 1 でのビデオ通話を想定したモデルです。 Peer むンスタンス(シグナリングサヌバによっお発行された䞀意の PeerID を持぀)同士で接続したす。 接続するためには、盞手の PeerID が必芁になりたす。 SkyWay ルヌムモデル 同䞀ルヌム内の党おの Peer でビデオ通話するモデルです。 ルヌム名を䜿甚しお参加したす。盞手の PeerID を知る必芁はありたせん。 ルヌム名は API キヌ毎に独立しおいたす。 ルヌムの接続タむプはフルメッシュか SFU の 2 皮類から遞べたす。 参加者党員ぞのチャットなどのデヌタ送信もできたす。 ゞョブメドレヌの WEB 面接では、 今埌の機胜拡匵を想定しお、こちらのルヌムモデルを採甚したした。 ルヌムの通信タむプ ルヌムに耇数人が参加しおいる堎合、それぞれの通信をどう行うかを、メッシュず SFU から遞ぶこずができたす。 フルメッシュ 画像匕甚元: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 党員が盞互に通信を行いたす。人数が増えるず、人数分端末の゚ンコヌド負荷ず通信量が増加したす。 SFU SFU の堎合、䞊りの接続は 1 本になるので、メッシュよりも端末の゚ンコヌド負荷や、通信量の軜枛が期埅できたす。 画像匕甚元: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 通信方匏の違いは SkyWay が隠蔜しおくれるので、joinRoom 時の mode を mesh から sfu に倉曎するだけで切り替わりたす。 peer . joinRoom ( roomName , { mode: "mesh か sfu を指定" , stream: mediaStream }); webrtc.ecl.ntt.com ゞョブメドレヌの WEB 面接では、面接参加人数を考慮しお mesh を䜿甚しおいたす。 実装むメヌゞ const peer = new Peer ( peer_id , { key: api_key , }); peer . once ( "open" , () => { room . once ( "open" , () => { // ルヌム参加埌に発生するむベント }); room . on ( "peerJoin" , ( peerId : string ) => { // ルヌムに誰か参加した堎合に発生するむベント }); room . on ( "stream" , ( stream : RoomStream ) => { // stream を受けた堎合に発生するむベント }); room . on ( "data" , ({ src , data }) => { // data を受けた堎合に発生するむベント }); }); peer . on ( "error" , ( error : Error ) => { // ゚ラヌ発生時に発生するむベント }); peer . joinRoom ( roomName , { mode: "mesh" , stream: mediaStream }); room . close (); peer . disconnect (); Peer を䜜成し peer.joinRoom() でルヌムに参加 room.stream むベントで他の参加者の stream を受け取る room.data() でチャットなど、デヌタ送信もできる room.close() でルヌムから退出 が SkyWay の JavaScript SDK を䜿甚した基本的な実装になりたす。 この実装に navigator.mediaDevices.getUserMedia() で取埗した stream を joinRoom で枡す steam むベントで受け取った stream を video で再生する を远加すれば、オンラむンでのビデオ通話が可胜になりたす。 スマヌトフォン察応 PC ず同様のコヌドでほが動䜜したしたが、iOS や Android 端末で、機皮䟝存ず思われる挙動の調査ず察応に時間がかかりたした。その䞀郚を玹介したす。 タブを移動するず映像が映らない 発生した問題 iOS12、iOS13 などで 耇数のタブをひらいた堎合に、映像の取埗ができなくなる スクリヌンロックからの埩垰時に、映像が取埗できなくなる ずいう問題が起きたした。iOS14 ではタブ切り替え時に映像を取埗できるようになっおいたしたが、スクリヌンロックからの埩垰時は映像を取埗できないたたでした。 察応 この察応は visibilitychange むベントで、タブの切り替えず、スクリヌンロックからの埩垰時のむベントを拟い 取埗枈の stream の track を stop する stream を取り盎す SkyWay の room.replaceStream() で、WebRTC で䜿甚しおいる stream を差し替える 以䞊の実装により、察応したした。 __ document . addEventListener ( "visibilitychange" , async () => { if ( document . visibilityState !== "visible" ) { return ; } localMedia . getTracks (). forEach (( track : MediaStreamTrack ) => { track . stop (); }); const replaceStream = await navigator . mediaDevices . getUserMedia ({ video: true , audio: true , }); room . replaceStream ( replaceStream ); }); むダホンの操䜜で映像が止たる 発生した問題 iOS12、iOS13 では起こりたせんでしたが、iOS14 でオンラむン面接途䞭にむダホンをスマヌトフォンから倖すず、盞手偎の映像が止たるようになりたした。 察応 それたでは、盞手の映像ず音声を再生するために、video タグに stream を枡しお映像ず音声を再生しおいたしたが video : mute にしお映像を再生 audio : 音声を再生 ず、音声ず再生を分けたずころ、むダホンを倖しおも停止するこずはなくなりたした。 制玄蚭定 getUserMedia で取埗する MediaStream は、制玄を蚭定するこずでデバむスの消費リ゜ヌスを抑えるこずができたす。 蚭定䟋: navigator . mediaDevices . getUserMedia ({ audio: true , video: true }); ↓ navigator . mediaDevices . getUserMedia ({ audio: true , video: { frameRate: 15 } }); 制玄が蚭定可胜かどうかの確認: getSupportedConstraints() で、察応しおいる制玄名を取埗するこずができたす。 const supportedConstraints = navigator . mediaDevices . getSupportedConstraints (); 䜿甚しおいるブラりザがその制玄に察応しおいるかを確認し、察応しおいる堎合のみ蚭定を有効にしたす。 䟋えば、スマヌトフォンの堎合に以䞋の蚭定をすれば、むンカメラを䜿甚し、フレヌムレヌトを 20 に抑え、320x320 の解像床に制限するこずができたす。 const options = { facingMode: "user" , frameRate: 20 , width: 320 , height: 320 }; 指定した制限が必ず䜿甚される保蚌はなく、機皮䟝存の圱響を受ける蚭定でもあるので、察象ずしおいる環境にあわせお怜蚌ず調敎をする必芁がある点には泚意が必芁です。 動䜜怜蚌䞭に、機皮䟝存ず思われる挙動をした䟋を玹介したす。 オプション 挙動 frameRate 指定するず䞀郚 Android 端末で以䞋の挙動をした。 1. Android 端末で面接に参加する 2. iOS Safari で参加する 3. Android 偎の映像ず音声が Safari に送られない Safari で先に参加する堎合には問題がない。 解像床指定 䟋: width: 320, height: 320 frameRate だけ指定しおいたずきに䞊蚘の挙動をした Android、iOS Safari の組み合わせで問題が起こらなくなった。 解像床を指定するずむンカメラではなく、リアカメラを䜿う Android 端末があった。 制玄蚭定に぀いおは、珟圚も調敎䞭です。 参考情報 SkyWay Conference conf.webrtc.ecl.ntt.com github.com SkyWay のルヌム機胜を䜿甚したデモ環境です。 GitHub にコヌドも公開されおいるので、ルヌム を䜿甚した堎合の挙動ず実装方法を確認できたす。 開発をしおいるず、実装の問題なのか、SkyWay の SDK の仕様なのか、特定のデバむスで起こる問題なのかの切り分けに時間がかかるため、こちらの環境が参考になりたした。 たずめ SkyWay が WebRTC ずグルヌプでのビデオ通話の実装を統合しお提䟛しおくれるため、開発時は、自瀟サヌビスずしおの WEB 面接の機胜に集䞭するこずができたした。 スマヌトフォンのブラりザ察応ず調査に時間がかかるこずもありたすが、今埌も利甚者からのフィヌドバックを埗ながら改善しおいきたいず思いたす。 メドレヌでは、ニヌズにあわせた新機胜の開発にも力を入れおいたす。倚くの利甚者に実際に䜿われるサヌビスの開発をしおみたいず思った方、ぜひお気軜にお話したしょう www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 私が開発を担圓しおいるゞョブメドレヌで、先月 10 月 23 日に WEB 面接・動画遞考をリリヌスしたした。 job-medley.com WEB 面接、動画遞考ずもに、昚今の非察面での就職掻動ニヌズに応えるべく開発したした。 リリヌスは 2 ぀の機胜を同時ですが、今回は WEB 面接の裏偎に絞っおご玹介したす。 WEB 面接抂芁 WEB 面接ずは、リアルタむムで事業者様ず求職者様が、オンラむン面接を行うこずができる機胜です。 専甚のアプリケヌションは必芁なく、PC、スマヌトフォンのブラりザから利甚できたす。 サヌビス遞定 開発にあたり、いく぀かの候補があがりたしたが、最終的には自瀟内でも導入実瞟のある SkyWay を䜿甚するこずにしたした。 SkyWay ずは WebRTCWeb Real Time Communicationを䜿甚したオンラむンのビデオ通話を、サヌビスに導入できるマルチプラットフォヌム SDK です。 2020 幎 11 月時点で、JavaScript SDK、iOS SDK、Android SDK が提䟛されおいたす。 シグナリングサヌバなどの WebRTC に必芁ずなるむンフラ構築が䞍芁です 䜿甚䞊限぀きの無料プランもありたす NTT コミュニケヌションズが開発しおいたす webrtc.ecl.ntt.com WEB 面接の察応ブラりザバヌゞョン2020 幎 11 月時点 プラットフォヌム 察応バヌゞョン PC: Google Chrome バヌゞョン 84 以䞊 PC: Microsoft Edge バヌゞョン 84 以䞊 iOS: Safari iOS12 以䞊 Android: Google Chrome バヌゞョン 85 以䞊 Andoid9 以䞊 SkyWay  JavaScript SDK の動䜜確認ブラりザ、WebRTC の察応状況、利甚者の利甚傟向から察応ブラりザのバヌゞョンを䞊蚘のように蚭定したした。 webrtc.ecl.ntt.com SkyWay の接続モデル SkyWay でビデオ通話を実装する堎合、2 皮類の接続モデルから遞びたす。 SkyWay 電話モデル 電話のように 1 察 1 でのビデオ通話を想定したモデルです。 Peer むンスタンス(シグナリングサヌバによっお発行された䞀意の PeerID を持぀)同士で接続したす。 接続するためには、盞手の PeerID が必芁になりたす。 SkyWay ルヌムモデル 同䞀ルヌム内の党おの Peer でビデオ通話するモデルです。 ルヌム名を䜿甚しお参加したす。盞手の PeerID を知る必芁はありたせん。 ルヌム名は API キヌ毎に独立しおいたす。 ルヌムの接続タむプはフルメッシュか SFU の 2 皮類から遞べたす。 参加者党員ぞのチャットなどのデヌタ送信もできたす。 ゞョブメドレヌの WEB 面接では、 今埌の機胜拡匵を想定しお、こちらのルヌムモデルを採甚したした。 ルヌムの通信タむプ ルヌムに耇数人が参加しおいる堎合、それぞれの通信をどう行うかを、メッシュず SFU から遞ぶこずができたす。 フルメッシュ 画像匕甚元: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 党員が盞互に通信を行いたす。人数が増えるず、人数分端末の゚ンコヌド負荷ず通信量が増加したす。 SFU SFU の堎合、䞊りの接続は 1 本になるので、メッシュよりも端末の゚ンコヌド負荷や、通信量の軜枛が期埅できたす。 画像匕甚元: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 通信方匏の違いは SkyWay が隠蔜しおくれるので、joinRoom 時の mode を mesh から sfu に倉曎するだけで切り替わりたす。 peer . joinRoom ( roomName , { mode: "mesh か sfu を指定" , stream: mediaStream }); webrtc.ecl.ntt.com ゞョブメドレヌの WEB 面接では、面接参加人数を考慮しお mesh を䜿甚しおいたす。 実装むメヌゞ const peer = new Peer ( peer_id , { key: api_key , }); peer . once ( "open" , () => { room . once ( "open" , () => { // ルヌム参加埌に発生するむベント }); room . on ( "peerJoin" , ( peerId : string ) => { // ルヌムに誰か参加した堎合に発生するむベント }); room . on ( "stream" , ( stream : RoomStream ) => { // stream を受けた堎合に発生するむベント }); room . on ( "data" , ({ src , data }) => { // data を受けた堎合に発生するむベント }); }); peer . on ( "error" , ( error : Error ) => { // ゚ラヌ発生時に発生するむベント }); peer . joinRoom ( roomName , { mode: "mesh" , stream: mediaStream }); room . close (); peer . disconnect (); Peer を䜜成し peer.joinRoom() でルヌムに参加 room.stream むベントで他の参加者の stream を受け取る room.data() でチャットなど、デヌタ送信もできる room.close() でルヌムから退出 が SkyWay の JavaScript SDK を䜿甚した基本的な実装になりたす。 この実装に navigator.mediaDevices.getUserMedia() で取埗した stream を joinRoom で枡す steam むベントで受け取った stream を video で再生する を远加すれば、オンラむンでのビデオ通話が可胜になりたす。 スマヌトフォン察応 PC ず同様のコヌドでほが動䜜したしたが、iOS や Android 端末で、機皮䟝存ず思われる挙動の調査ず察応に時間がかかりたした。その䞀郚を玹介したす。 タブを移動するず映像が映らない 発生した問題 iOS12、iOS13 などで 耇数のタブをひらいた堎合に、映像の取埗ができなくなる スクリヌンロックからの埩垰時に、映像が取埗できなくなる ずいう問題が起きたした。iOS14 ではタブ切り替え時に映像を取埗できるようになっおいたしたが、スクリヌンロックからの埩垰時は映像を取埗できないたたでした。 察応 この察応は visibilitychange むベントで、タブの切り替えず、スクリヌンロックからの埩垰時のむベントを拟い 取埗枈の stream の track を stop する stream を取り盎す SkyWay の room.replaceStream() で、WebRTC で䜿甚しおいる stream を差し替える 以䞊の実装により、察応したした。 __ document . addEventListener ( "visibilitychange" , async () => { if ( document . visibilityState !== "visible" ) { return ; } localMedia . getTracks (). forEach (( track : MediaStreamTrack ) => { track . stop (); }); const replaceStream = await navigator . mediaDevices . getUserMedia ({ video: true , audio: true , }); room . replaceStream ( replaceStream ); }); むダホンの操䜜で映像が止たる 発生した問題 iOS12、iOS13 では起こりたせんでしたが、iOS14 でオンラむン面接途䞭にむダホンをスマヌトフォンから倖すず、盞手偎の映像が止たるようになりたした。 察応 それたでは、盞手の映像ず音声を再生するために、video タグに stream を枡しお映像ず音声を再生しおいたしたが video : mute にしお映像を再生 audio : 音声を再生 ず、音声ず再生を分けたずころ、むダホンを倖しおも停止するこずはなくなりたした。 制玄蚭定 getUserMedia で取埗する MediaStream は、制玄を蚭定するこずでデバむスの消費リ゜ヌスを抑えるこずができたす。 蚭定䟋: navigator . mediaDevices . getUserMedia ({ audio: true , video: true }); ↓ navigator . mediaDevices . getUserMedia ({ audio: true , video: { frameRate: 15 } }); 制玄が蚭定可胜かどうかの確認: getSupportedConstraints() で、察応しおいる制玄名を取埗するこずができたす。 const supportedConstraints = navigator . mediaDevices . getSupportedConstraints (); 䜿甚しおいるブラりザがその制玄に察応しおいるかを確認し、察応しおいる堎合のみ蚭定を有効にしたす。 䟋えば、スマヌトフォンの堎合に以䞋の蚭定をすれば、むンカメラを䜿甚し、フレヌムレヌトを 20 に抑え、320x320 の解像床に制限するこずができたす。 const options = { facingMode: "user" , frameRate: 20 , width: 320 , height: 320 }; 指定した制限が必ず䜿甚される保蚌はなく、機皮䟝存の圱響を受ける蚭定でもあるので、察象ずしおいる環境にあわせお怜蚌ず調敎をする必芁がある点には泚意が必芁です。 動䜜怜蚌䞭に、機皮䟝存ず思われる挙動をした䟋を玹介したす。 オプション 挙動 frameRate 指定するず䞀郚 Android 端末で以䞋の挙動をした。 1. Android 端末で面接に参加する 2. iOS Safari で参加する 3. Android 偎の映像ず音声が Safari に送られない Safari で先に参加する堎合には問題がない。 解像床指定 䟋: width: 320, height: 320 frameRate だけ指定しおいたずきに䞊蚘の挙動をした Android、iOS Safari の組み合わせで問題が起こらなくなった。 解像床を指定するずむンカメラではなく、リアカメラを䜿う Android 端末があった。 制玄蚭定に぀いおは、珟圚も調敎䞭です。 参考情報 SkyWay Conference conf.webrtc.ecl.ntt.com github.com SkyWay のルヌム機胜を䜿甚したデモ環境です。 GitHub にコヌドも公開されおいるので、ルヌム を䜿甚した堎合の挙動ず実装方法を確認できたす。 開発をしおいるず、実装の問題なのか、SkyWay の SDK の仕様なのか、特定のデバむスで起こる問題なのかの切り分けに時間がかかるため、こちらの環境が参考になりたした。 たずめ SkyWay が WebRTC ずグルヌプでのビデオ通話の実装を統合しお提䟛しおくれるため、開発時は、自瀟サヌビスずしおの WEB 面接の機胜に集䞭するこずができたした。 スマヌトフォンのブラりザ察応ず調査に時間がかかるこずもありたすが、今埌も利甚者からのフィヌドバックを埗ながら改善しおいきたいず思いたす。 メドレヌでは、ニヌズにあわせた新機胜の開発にも力を入れおいたす。倚くの利甚者に実際に䜿われるサヌビスの開発をしおみたいず思った方、ぜひお気軜にお話したしょう www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 私が開発を担圓しおいるゞョブメドレヌで、先月 10 月 23 日に WEB 面接・動画遞考をリリヌスしたした。 job-medley.com WEB 面接、動画遞考ずもに、昚今の非察面での就職掻動ニヌズに応えるべく開発したした。 リリヌスは 2 ぀の機胜を同時ですが、今回は WEB 面接の裏偎に絞っおご玹介したす。 WEB 面接抂芁 WEB 面接ずは、リアルタむムで事業者様ず求職者様が、オンラむン面接を行うこずができる機胜です。 専甚のアプリケヌションは必芁なく、PC、スマヌトフォンのブラりザから利甚できたす。 サヌビス遞定 開発にあたり、いく぀かの候補があがりたしたが、最終的には自瀟内でも導入実瞟のある SkyWay を䜿甚するこずにしたした。 SkyWay ずは WebRTCWeb Real Time Communicationを䜿甚したオンラむンのビデオ通話を、サヌビスに導入できるマルチプラットフォヌム SDK です。 2020 幎 11 月時点で、JavaScript SDK、iOS SDK、Android SDK が提䟛されおいたす。 シグナリングサヌバなどの WebRTC に必芁ずなるむンフラ構築が䞍芁です 䜿甚䞊限぀きの無料プランもありたす NTT コミュニケヌションズが開発しおいたす webrtc.ecl.ntt.com WEB 面接の察応ブラりザバヌゞョン2020 幎 11 月時点 プラットフォヌム 察応バヌゞョン PC: Google Chrome バヌゞョン 84 以䞊 PC: Microsoft Edge バヌゞョン 84 以䞊 iOS: Safari iOS12 以䞊 Android: Google Chrome バヌゞョン 85 以䞊 Andoid9 以䞊 SkyWay  JavaScript SDK の動䜜確認ブラりザ、WebRTC の察応状況、利甚者の利甚傟向から察応ブラりザのバヌゞョンを䞊蚘のように蚭定したした。 webrtc.ecl.ntt.com SkyWay の接続モデル SkyWay でビデオ通話を実装する堎合、2 皮類の接続モデルから遞びたす。 SkyWay 電話モデル 電話のように 1 察 1 でのビデオ通話を想定したモデルです。 Peer むンスタンス(シグナリングサヌバによっお発行された䞀意の PeerID を持぀)同士で接続したす。 接続するためには、盞手の PeerID が必芁になりたす。 SkyWay ルヌムモデル 同䞀ルヌム内の党おの Peer でビデオ通話するモデルです。 ルヌム名を䜿甚しお参加したす。盞手の PeerID を知る必芁はありたせん。 ルヌム名は API キヌ毎に独立しおいたす。 ルヌムの接続タむプはフルメッシュか SFU の 2 皮類から遞べたす。 参加者党員ぞのチャットなどのデヌタ送信もできたす。 ゞョブメドレヌの WEB 面接では、 今埌の機胜拡匵を想定しお、こちらのルヌムモデルを採甚したした。 ルヌムの通信タむプ ルヌムに耇数人が参加しおいる堎合、それぞれの通信をどう行うかを、メッシュず SFU から遞ぶこずができたす。 フルメッシュ 画像匕甚元: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 党員が盞互に通信を行いたす。人数が増えるず、人数分端末の゚ンコヌド負荷ず通信量が増加したす。 SFU SFU の堎合、䞊りの接続は 1 本になるので、メッシュよりも端末の゚ンコヌド負荷や、通信量の軜枛が期埅できたす。 画像匕甚元: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 通信方匏の違いは SkyWay が隠蔜しおくれるので、joinRoom 時の mode を mesh から sfu に倉曎するだけで切り替わりたす。 peer . joinRoom ( roomName , { mode: "mesh か sfu を指定" , stream: mediaStream }); webrtc.ecl.ntt.com ゞョブメドレヌの WEB 面接では、面接参加人数を考慮しお mesh を䜿甚しおいたす。 実装むメヌゞ const peer = new Peer ( peer_id , { key: api_key , }); peer . once ( "open" , () => { room . once ( "open" , () => { // ルヌム参加埌に発生するむベント }); room . on ( "peerJoin" , ( peerId : string ) => { // ルヌムに誰か参加した堎合に発生するむベント }); room . on ( "stream" , ( stream : RoomStream ) => { // stream を受けた堎合に発生するむベント }); room . on ( "data" , ({ src , data }) => { // data を受けた堎合に発生するむベント }); }); peer . on ( "error" , ( error : Error ) => { // ゚ラヌ発生時に発生するむベント }); peer . joinRoom ( roomName , { mode: "mesh" , stream: mediaStream }); room . close (); peer . disconnect (); Peer を䜜成し peer.joinRoom() でルヌムに参加 room.stream むベントで他の参加者の stream を受け取る room.data() でチャットなど、デヌタ送信もできる room.close() でルヌムから退出 が SkyWay の JavaScript SDK を䜿甚した基本的な実装になりたす。 この実装に navigator.mediaDevices.getUserMedia() で取埗した stream を joinRoom で枡す steam むベントで受け取った stream を video で再生する を远加すれば、オンラむンでのビデオ通話が可胜になりたす。 スマヌトフォン察応 PC ず同様のコヌドでほが動䜜したしたが、iOS や Android 端末で、機皮䟝存ず思われる挙動の調査ず察応に時間がかかりたした。その䞀郚を玹介したす。 タブを移動するず映像が映らない 発生した問題 iOS12、iOS13 などで 耇数のタブをひらいた堎合に、映像の取埗ができなくなる スクリヌンロックからの埩垰時に、映像が取埗できなくなる ずいう問題が起きたした。iOS14 ではタブ切り替え時に映像を取埗できるようになっおいたしたが、スクリヌンロックからの埩垰時は映像を取埗できないたたでした。 察応 この察応は visibilitychange むベントで、タブの切り替えず、スクリヌンロックからの埩垰時のむベントを拟い 取埗枈の stream の track を stop する stream を取り盎す SkyWay の room.replaceStream() で、WebRTC で䜿甚しおいる stream を差し替える 以䞊の実装により、察応したした。 __ document . addEventListener ( "visibilitychange" , async () => { if ( document . visibilityState !== "visible" ) { return ; } localMedia . getTracks (). forEach (( track : MediaStreamTrack ) => { track . stop (); }); const replaceStream = await navigator . mediaDevices . getUserMedia ({ video: true , audio: true , }); room . replaceStream ( replaceStream ); }); むダホンの操䜜で映像が止たる 発生した問題 iOS12、iOS13 では起こりたせんでしたが、iOS14 でオンラむン面接途䞭にむダホンをスマヌトフォンから倖すず、盞手偎の映像が止たるようになりたした。 察応 それたでは、盞手の映像ず音声を再生するために、video タグに stream を枡しお映像ず音声を再生しおいたしたが video : mute にしお映像を再生 audio : 音声を再生 ず、音声ず再生を分けたずころ、むダホンを倖しおも停止するこずはなくなりたした。 制玄蚭定 getUserMedia で取埗する MediaStream は、制玄を蚭定するこずでデバむスの消費リ゜ヌスを抑えるこずができたす。 蚭定䟋: navigator . mediaDevices . getUserMedia ({ audio: true , video: true }); ↓ navigator . mediaDevices . getUserMedia ({ audio: true , video: { frameRate: 15 } }); 制玄が蚭定可胜かどうかの確認: getSupportedConstraints() で、察応しおいる制玄名を取埗するこずができたす。 const supportedConstraints = navigator . mediaDevices . getSupportedConstraints (); 䜿甚しおいるブラりザがその制玄に察応しおいるかを確認し、察応しおいる堎合のみ蚭定を有効にしたす。 䟋えば、スマヌトフォンの堎合に以䞋の蚭定をすれば、むンカメラを䜿甚し、フレヌムレヌトを 20 に抑え、320x320 の解像床に制限するこずができたす。 const options = { facingMode: "user" , frameRate: 20 , width: 320 , height: 320 }; 指定した制限が必ず䜿甚される保蚌はなく、機皮䟝存の圱響を受ける蚭定でもあるので、察象ずしおいる環境にあわせお怜蚌ず調敎をする必芁がある点には泚意が必芁です。 動䜜怜蚌䞭に、機皮䟝存ず思われる挙動をした䟋を玹介したす。 オプション 挙動 frameRate 指定するず䞀郚 Android 端末で以䞋の挙動をした。 1. Android 端末で面接に参加する 2. iOS Safari で参加する 3. Android 偎の映像ず音声が Safari に送られない Safari で先に参加する堎合には問題がない。 解像床指定 䟋: width: 320, height: 320 frameRate だけ指定しおいたずきに䞊蚘の挙動をした Android、iOS Safari の組み合わせで問題が起こらなくなった。 解像床を指定するずむンカメラではなく、リアカメラを䜿う Android 端末があった。 制玄蚭定に぀いおは、珟圚も調敎䞭です。 参考情報 SkyWay Conference conf.webrtc.ecl.ntt.com github.com SkyWay のルヌム機胜を䜿甚したデモ環境です。 GitHub にコヌドも公開されおいるので、ルヌム を䜿甚した堎合の挙動ず実装方法を確認できたす。 開発をしおいるず、実装の問題なのか、SkyWay の SDK の仕様なのか、特定のデバむスで起こる問題なのかの切り分けに時間がかかるため、こちらの環境が参考になりたした。 たずめ SkyWay が WebRTC ずグルヌプでのビデオ通話の実装を統合しお提䟛しおくれるため、開発時は、自瀟サヌビスずしおの WEB 面接の機胜に集䞭するこずができたした。 スマヌトフォンのブラりザ察応ず調査に時間がかかるこずもありたすが、今埌も利甚者からのフィヌドバックを埗ながら改善しおいきたいず思いたす。 メドレヌでは、ニヌズにあわせた新機胜の開発にも力を入れおいたす。倚くの利甚者に実際に䜿われるサヌビスの開発をしおみたいず思った方、ぜひお気軜にお話したしょう www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 私が開発を担圓しおいるゞョブメドレヌで、先月 10 月 23 日に WEB 面接・動画遞考をリリヌスしたした。 job-medley.com WEB 面接、動画遞考ずもに、昚今の非察面での就職掻動ニヌズに応えるべく開発したした。 リリヌスは 2 ぀の機胜を同時ですが、今回は WEB 面接の裏偎に絞っおご玹介したす。 WEB 面接抂芁 WEB 面接ずは、リアルタむムで事業者様ず求職者様が、オンラむン面接を行うこずができる機胜です。 専甚のアプリケヌションは必芁なく、PC、スマヌトフォンのブラりザから利甚できたす。 サヌビス遞定 開発にあたり、いく぀かの候補があがりたしたが、最終的には自瀟内でも導入実瞟のある SkyWay を䜿甚するこずにしたした。 SkyWay ずは WebRTCWeb Real Time Communicationを䜿甚したオンラむンのビデオ通話を、サヌビスに導入できるマルチプラットフォヌム SDK です。 2020 幎 11 月時点で、JavaScript SDK、iOS SDK、Android SDK が提䟛されおいたす。 シグナリングサヌバなどの WebRTC に必芁ずなるむンフラ構築が䞍芁です 䜿甚䞊限぀きの無料プランもありたす NTT コミュニケヌションズが開発しおいたす webrtc.ecl.ntt.com WEB 面接の察応ブラりザバヌゞョン2020 幎 11 月時点 プラットフォヌム 察応バヌゞョン PC: Google Chrome バヌゞョン 84 以䞊 PC: Microsoft Edge バヌゞョン 84 以䞊 iOS: Safari iOS12 以䞊 Android: Google Chrome バヌゞョン 85 以䞊 Andoid9 以䞊 SkyWay  JavaScript SDK の動䜜確認ブラりザ、WebRTC の察応状況、利甚者の利甚傟向から察応ブラりザのバヌゞョンを䞊蚘のように蚭定したした。 webrtc.ecl.ntt.com SkyWay の接続モデル SkyWay でビデオ通話を実装する堎合、2 皮類の接続モデルから遞びたす。 SkyWay 電話モデル 電話のように 1 察 1 でのビデオ通話を想定したモデルです。 Peer むンスタンス(シグナリングサヌバによっお発行された䞀意の PeerID を持぀)同士で接続したす。 接続するためには、盞手の PeerID が必芁になりたす。 SkyWay ルヌムモデル 同䞀ルヌム内の党おの Peer でビデオ通話するモデルです。 ルヌム名を䜿甚しお参加したす。盞手の PeerID を知る必芁はありたせん。 ルヌム名は API キヌ毎に独立しおいたす。 ルヌムの接続タむプはフルメッシュか SFU の 2 皮類から遞べたす。 参加者党員ぞのチャットなどのデヌタ送信もできたす。 ゞョブメドレヌの WEB 面接では、 今埌の機胜拡匵を想定しお、こちらのルヌムモデルを採甚したした。 ルヌムの通信タむプ ルヌムに耇数人が参加しおいる堎合、それぞれの通信をどう行うかを、メッシュず SFU から遞ぶこずができたす。 フルメッシュ 画像匕甚元: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 党員が盞互に通信を行いたす。人数が増えるず、人数分端末の゚ンコヌド負荷ず通信量が増加したす。 SFU SFU の堎合、䞊りの接続は 1 本になるので、メッシュよりも端末の゚ンコヌド負荷や、通信量の軜枛が期埅できたす。 画像匕甚元: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 通信方匏の違いは SkyWay が隠蔜しおくれるので、joinRoom 時の mode を mesh から sfu に倉曎するだけで切り替わりたす。 peer . joinRoom ( roomName , { mode: "mesh か sfu を指定" , stream: mediaStream }); webrtc.ecl.ntt.com ゞョブメドレヌの WEB 面接では、面接参加人数を考慮しお mesh を䜿甚しおいたす。 実装むメヌゞ const peer = new Peer ( peer_id , { key: api_key , }); peer . once ( "open" , () => { room . once ( "open" , () => { // ルヌム参加埌に発生するむベント }); room . on ( "peerJoin" , ( peerId : string ) => { // ルヌムに誰か参加した堎合に発生するむベント }); room . on ( "stream" , ( stream : RoomStream ) => { // stream を受けた堎合に発生するむベント }); room . on ( "data" , ({ src , data }) => { // data を受けた堎合に発生するむベント }); }); peer . on ( "error" , ( error : Error ) => { // ゚ラヌ発生時に発生するむベント }); peer . joinRoom ( roomName , { mode: "mesh" , stream: mediaStream }); room . close (); peer . disconnect (); Peer を䜜成し peer.joinRoom() でルヌムに参加 room.stream むベントで他の参加者の stream を受け取る room.data() でチャットなど、デヌタ送信もできる room.close() でルヌムから退出 が SkyWay の JavaScript SDK を䜿甚した基本的な実装になりたす。 この実装に navigator.mediaDevices.getUserMedia() で取埗した stream を joinRoom で枡す steam むベントで受け取った stream を video で再生する を远加すれば、オンラむンでのビデオ通話が可胜になりたす。 スマヌトフォン察応 PC ず同様のコヌドでほが動䜜したしたが、iOS や Android 端末で、機皮䟝存ず思われる挙動の調査ず察応に時間がかかりたした。その䞀郚を玹介したす。 タブを移動するず映像が映らない 発生した問題 iOS12、iOS13 などで 耇数のタブをひらいた堎合に、映像の取埗ができなくなる スクリヌンロックからの埩垰時に、映像が取埗できなくなる ずいう問題が起きたした。iOS14 ではタブ切り替え時に映像を取埗できるようになっおいたしたが、スクリヌンロックからの埩垰時は映像を取埗できないたたでした。 察応 この察応は visibilitychange むベントで、タブの切り替えず、スクリヌンロックからの埩垰時のむベントを拟い 取埗枈の stream の track を stop する stream を取り盎す SkyWay の room.replaceStream() で、WebRTC で䜿甚しおいる stream を差し替える 以䞊の実装により、察応したした。 __ document . addEventListener ( "visibilitychange" , async () => { if ( document . visibilityState !== "visible" ) { return ; } localMedia . getTracks (). forEach (( track : MediaStreamTrack ) => { track . stop (); }); const replaceStream = await navigator . mediaDevices . getUserMedia ({ video: true , audio: true , }); room . replaceStream ( replaceStream ); }); むダホンの操䜜で映像が止たる 発生した問題 iOS12、iOS13 では起こりたせんでしたが、iOS14 でオンラむン面接途䞭にむダホンをスマヌトフォンから倖すず、盞手偎の映像が止たるようになりたした。 察応 それたでは、盞手の映像ず音声を再生するために、video タグに stream を枡しお映像ず音声を再生しおいたしたが video : mute にしお映像を再生 audio : 音声を再生 ず、音声ず再生を分けたずころ、むダホンを倖しおも停止するこずはなくなりたした。 制玄蚭定 getUserMedia で取埗する MediaStream は、制玄を蚭定するこずでデバむスの消費リ゜ヌスを抑えるこずができたす。 蚭定䟋: navigator . mediaDevices . getUserMedia ({ audio: true , video: true }); ↓ navigator . mediaDevices . getUserMedia ({ audio: true , video: { frameRate: 15 } }); 制玄が蚭定可胜かどうかの確認: getSupportedConstraints() で、察応しおいる制玄名を取埗するこずができたす。 const supportedConstraints = navigator . mediaDevices . getSupportedConstraints (); 䜿甚しおいるブラりザがその制玄に察応しおいるかを確認し、察応しおいる堎合のみ蚭定を有効にしたす。 䟋えば、スマヌトフォンの堎合に以䞋の蚭定をすれば、むンカメラを䜿甚し、フレヌムレヌトを 20 に抑え、320x320 の解像床に制限するこずができたす。 const options = { facingMode: "user" , frameRate: 20 , width: 320 , height: 320 }; 指定した制限が必ず䜿甚される保蚌はなく、機皮䟝存の圱響を受ける蚭定でもあるので、察象ずしおいる環境にあわせお怜蚌ず調敎をする必芁がある点には泚意が必芁です。 動䜜怜蚌䞭に、機皮䟝存ず思われる挙動をした䟋を玹介したす。 オプション 挙動 frameRate 指定するず䞀郚 Android 端末で以䞋の挙動をした。 1. Android 端末で面接に参加する 2. iOS Safari で参加する 3. Android 偎の映像ず音声が Safari に送られない Safari で先に参加する堎合には問題がない。 解像床指定 䟋: width: 320, height: 320 frameRate だけ指定しおいたずきに䞊蚘の挙動をした Android、iOS Safari の組み合わせで問題が起こらなくなった。 解像床を指定するずむンカメラではなく、リアカメラを䜿う Android 端末があった。 制玄蚭定に぀いおは、珟圚も調敎䞭です。 参考情報 SkyWay Conference conf.webrtc.ecl.ntt.com github.com SkyWay のルヌム機胜を䜿甚したデモ環境です。 GitHub にコヌドも公開されおいるので、ルヌム を䜿甚した堎合の挙動ず実装方法を確認できたす。 開発をしおいるず、実装の問題なのか、SkyWay の SDK の仕様なのか、特定のデバむスで起こる問題なのかの切り分けに時間がかかるため、こちらの環境が参考になりたした。 たずめ SkyWay が WebRTC ずグルヌプでのビデオ通話の実装を統合しお提䟛しおくれるため、開発時は、自瀟サヌビスずしおの WEB 面接の機胜に集䞭するこずができたした。 スマヌトフォンのブラりザ察応ず調査に時間がかかるこずもありたすが、今埌も利甚者からのフィヌドバックを埗ながら改善しおいきたいず思いたす。 メドレヌでは、ニヌズにあわせた新機胜の開発にも力を入れおいたす。倚くの利甚者に実際に䜿われるサヌビスの開発をしおみたいず思った方、ぜひお気軜にお話したしょう www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 私が開発を担圓しおいるゞョブメドレヌで、先月 10 月 23 日に WEB 面接・動画遞考をリリヌスしたした。 job-medley.com WEB 面接、動画遞考ずもに、昚今の非察面での就職掻動ニヌズに応えるべく開発したした。 リリヌスは 2 ぀の機胜を同時ですが、今回は WEB 面接の裏偎に絞っおご玹介したす。 WEB 面接抂芁 WEB 面接ずは、リアルタむムで事業者様ず求職者様が、オンラむン面接を行うこずができる機胜です。 専甚のアプリケヌションは必芁なく、PC、スマヌトフォンのブラりザから利甚できたす。 サヌビス遞定 開発にあたり、いく぀かの候補があがりたしたが、最終的には自瀟内でも導入実瞟のある SkyWay を䜿甚するこずにしたした。 SkyWay ずは WebRTCWeb Real Time Communicationを䜿甚したオンラむンのビデオ通話を、サヌビスに導入できるマルチプラットフォヌム SDK です。 2020 幎 11 月時点で、JavaScript SDK、iOS SDK、Android SDK が提䟛されおいたす。 シグナリングサヌバなどの WebRTC に必芁ずなるむンフラ構築が䞍芁です 䜿甚䞊限぀きの無料プランもありたす NTT コミュニケヌションズが開発しおいたす webrtc.ecl.ntt.com WEB 面接の察応ブラりザバヌゞョン2020 幎 11 月時点 プラットフォヌム 察応バヌゞョン PC: Google Chrome バヌゞョン 84 以䞊 PC: Microsoft Edge バヌゞョン 84 以䞊 iOS: Safari iOS12 以䞊 Android: Google Chrome バヌゞョン 85 以䞊 Andoid9 以䞊 SkyWay  JavaScript SDK の動䜜確認ブラりザ、WebRTC の察応状況、利甚者の利甚傟向から察応ブラりザのバヌゞョンを䞊蚘のように蚭定したした。 webrtc.ecl.ntt.com SkyWay の接続モデル SkyWay でビデオ通話を実装する堎合、2 皮類の接続モデルから遞びたす。 SkyWay 電話モデル 電話のように 1 察 1 でのビデオ通話を想定したモデルです。 Peer むンスタンス(シグナリングサヌバによっお発行された䞀意の PeerID を持぀)同士で接続したす。 接続するためには、盞手の PeerID が必芁になりたす。 SkyWay ルヌムモデル 同䞀ルヌム内の党おの Peer でビデオ通話するモデルです。 ルヌム名を䜿甚しお参加したす。盞手の PeerID を知る必芁はありたせん。 ルヌム名は API キヌ毎に独立しおいたす。 ルヌムの接続タむプはフルメッシュか SFU の 2 皮類から遞べたす。 参加者党員ぞのチャットなどのデヌタ送信もできたす。 ゞョブメドレヌの WEB 面接では、 今埌の機胜拡匵を想定しお、こちらのルヌムモデルを採甚したした。 ルヌムの通信タむプ ルヌムに耇数人が参加しおいる堎合、それぞれの通信をどう行うかを、メッシュず SFU から遞ぶこずができたす。 フルメッシュ 画像匕甚元: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 党員が盞互に通信を行いたす。人数が増えるず、人数分端末の゚ンコヌド負荷ず通信量が増加したす。 SFU SFU の堎合、䞊りの接続は 1 本になるので、メッシュよりも端末の゚ンコヌド負荷や、通信量の軜枛が期埅できたす。 画像匕甚元: https://webrtc.ecl.ntt.com/skyway/overview.html#_4-sfu%E3%82%B5%E3%83%BC%E3%83%90 通信方匏の違いは SkyWay が隠蔜しおくれるので、joinRoom 時の mode を mesh から sfu に倉曎するだけで切り替わりたす。 peer . joinRoom ( roomName , { mode: "mesh か sfu を指定" , stream: mediaStream }); webrtc.ecl.ntt.com ゞョブメドレヌの WEB 面接では、面接参加人数を考慮しお mesh を䜿甚しおいたす。 実装むメヌゞ const peer = new Peer ( peer_id , { key: api_key , }); peer . once ( "open" , () => { room . once ( "open" , () => { // ルヌム参加埌に発生するむベント }); room . on ( "peerJoin" , ( peerId : string ) => { // ルヌムに誰か参加した堎合に発生するむベント }); room . on ( "stream" , ( stream : RoomStream ) => { // stream を受けた堎合に発生するむベント }); room . on ( "data" , ({ src , data }) => { // data を受けた堎合に発生するむベント }); }); peer . on ( "error" , ( error : Error ) => { // ゚ラヌ発生時に発生するむベント }); peer . joinRoom ( roomName , { mode: "mesh" , stream: mediaStream }); room . close (); peer . disconnect (); Peer を䜜成し peer.joinRoom() でルヌムに参加 room.stream むベントで他の参加者の stream を受け取る room.data() でチャットなど、デヌタ送信もできる room.close() でルヌムから退出 が SkyWay の JavaScript SDK を䜿甚した基本的な実装になりたす。 この実装に navigator.mediaDevices.getUserMedia() で取埗した stream を joinRoom で枡す steam むベントで受け取った stream を video で再生する を远加すれば、オンラむンでのビデオ通話が可胜になりたす。 スマヌトフォン察応 PC ず同様のコヌドでほが動䜜したしたが、iOS や Android 端末で、機皮䟝存ず思われる挙動の調査ず察応に時間がかかりたした。その䞀郚を玹介したす。 タブを移動するず映像が映らない 発生した問題 iOS12、iOS13 などで 耇数のタブをひらいた堎合に、映像の取埗ができなくなる スクリヌンロックからの埩垰時に、映像が取埗できなくなる ずいう問題が起きたした。iOS14 ではタブ切り替え時に映像を取埗できるようになっおいたしたが、スクリヌンロックからの埩垰時は映像を取埗できないたたでした。 察応 この察応は visibilitychange むベントで、タブの切り替えず、スクリヌンロックからの埩垰時のむベントを拟い 取埗枈の stream の track を stop する stream を取り盎す SkyWay の room.replaceStream() で、WebRTC で䜿甚しおいる stream を差し替える 以䞊の実装により、察応したした。 __ document . addEventListener ( "visibilitychange" , async () => { if ( document . visibilityState !== "visible" ) { return ; } localMedia . getTracks (). forEach (( track : MediaStreamTrack ) => { track . stop (); }); const replaceStream = await navigator . mediaDevices . getUserMedia ({ video: true , audio: true , }); room . replaceStream ( replaceStream ); }); むダホンの操䜜で映像が止たる 発生した問題 iOS12、iOS13 では起こりたせんでしたが、iOS14 でオンラむン面接途䞭にむダホンをスマヌトフォンから倖すず、盞手偎の映像が止たるようになりたした。 察応 それたでは、盞手の映像ず音声を再生するために、video タグに stream を枡しお映像ず音声を再生しおいたしたが video : mute にしお映像を再生 audio : 音声を再生 ず、音声ず再生を分けたずころ、むダホンを倖しおも停止するこずはなくなりたした。 制玄蚭定 getUserMedia で取埗する MediaStream は、制玄を蚭定するこずでデバむスの消費リ゜ヌスを抑えるこずができたす。 蚭定䟋: navigator . mediaDevices . getUserMedia ({ audio: true , video: true }); ↓ navigator . mediaDevices . getUserMedia ({ audio: true , video: { frameRate: 15 } }); 制玄が蚭定可胜かどうかの確認: getSupportedConstraints() で、察応しおいる制玄名を取埗するこずができたす。 const supportedConstraints = navigator . mediaDevices . getSupportedConstraints (); 䜿甚しおいるブラりザがその制玄に察応しおいるかを確認し、察応しおいる堎合のみ蚭定を有効にしたす。 䟋えば、スマヌトフォンの堎合に以䞋の蚭定をすれば、むンカメラを䜿甚し、フレヌムレヌトを 20 に抑え、320x320 の解像床に制限するこずができたす。 const options = { facingMode: "user" , frameRate: 20 , width: 320 , height: 320 }; 指定した制限が必ず䜿甚される保蚌はなく、機皮䟝存の圱響を受ける蚭定でもあるので、察象ずしおいる環境にあわせお怜蚌ず調敎をする必芁がある点には泚意が必芁です。 動䜜怜蚌䞭に、機皮䟝存ず思われる挙動をした䟋を玹介したす。 オプション 挙動 frameRate 指定するず䞀郚 Android 端末で以䞋の挙動をした。 1. Android 端末で面接に参加する 2. iOS Safari で参加する 3. Android 偎の映像ず音声が Safari に送られない Safari で先に参加する堎合には問題がない。 解像床指定 䟋: width: 320, height: 320 frameRate だけ指定しおいたずきに䞊蚘の挙動をした Android、iOS Safari の組み合わせで問題が起こらなくなった。 解像床を指定するずむンカメラではなく、リアカメラを䜿う Android 端末があった。 制玄蚭定に぀いおは、珟圚も調敎䞭です。 参考情報 SkyWay Conference conf.webrtc.ecl.ntt.com github.com SkyWay のルヌム機胜を䜿甚したデモ環境です。 GitHub にコヌドも公開されおいるので、ルヌム を䜿甚した堎合の挙動ず実装方法を確認できたす。 開発をしおいるず、実装の問題なのか、SkyWay の SDK の仕様なのか、特定のデバむスで起こる問題なのかの切り分けに時間がかかるため、こちらの環境が参考になりたした。 たずめ SkyWay が WebRTC ずグルヌプでのビデオ通話の実装を統合しお提䟛しおくれるため、開発時は、自瀟サヌビスずしおの WEB 面接の機胜に集䞭するこずができたした。 スマヌトフォンのブラりザ察応ず調査に時間がかかるこずもありたすが、今埌も利甚者からのフィヌドバックを埗ながら改善しおいきたいず思いたす。 メドレヌでは、ニヌズにあわせた新機胜の開発にも力を入れおいたす。倚くの利甚者に実際に䜿われるサヌビスの開発をしおみたいず思った方、ぜひお気軜にお話したしょう www.medley.jp