[アップデート] Amazon Interactive Video Service で再生時の認証が行えるようになりました!

Amazon Interactive Video Serviceで認証が行えるようになったよ!
2020.08.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、大前です。

 

本日は以下のアップデートについてお知らせします。

Amazon Interactive Video Service adds support for playback authorization

Setting Up Private Channels

 

Amazon Interactive Video Service(以下 IVS)で再生時の認証が行えるようになりました!

どんなアップデートか

IVS によるストリーミング配信を再生する際に、JWT を使用した認証を行えるようになりました。

これにより、アプリケーションと組み合わせたプライベートな動画配信が行えるようになります。

 

やってみた

早速触っていきましょう。大まかな流れは以下になります。

  1. 再生キーの作成
  2. 認証機能を有効にした IVS チャネルの作成
  3. 認証トークンの生成 ※今回は Lambda(Node.js) を使用します
  4. トークンを使用して再生

 

1. 再生キーの作成

まずは認証に利用するキーを生成します。キーのインポートも可能ですが、今回は IVS 上でキーを生成します。

Create or Import a Playback Key

 

IVS のコンソール画面に追加されている「再生キー」メニューを開き、「再生キーを作成」をクリックします。※今回はバージニア北部リージョンで作業しています

 

キー名の入力画面が表示されるので、適当な名前を入力して「作成」をクリックします。

 

キーが作成され、秘密鍵(private-key.pem)が自動的にダウンロードされます。このキーはちゃんと保管しておきましょう。

 

2. IVS チャネルで認証を有効にする

続いて、IVS チャネルで認証機能を有効にします。認証機能は既に作成済みのチャネルに対しても有効にする事が可能です。

Enable Playback Authorization on Channels

 

今回は認証機能を有効にしながらチャネルを新規作成してみます。

IVS のコンソール画面より「チャネル」→「チャネルの作成」をクリックします。

 

「セットアップ」の "カスタム設定" に「再生承認」という項目が追加されているので、これを有効にします。

後は、チャネル名を入力して「チャネルの作成」をクリックすると認証機能が有効になったチャネルが作成されます。

 

ちなみに、認証機能を有効にしているとコンソール上でのプレビューが使用できなくなる様です。

 

3. 再生トークンの生成

続いて、再生に必要なトークンを生成します。トークンは JWT 形式になります。

Generate and Sign Playback Tokens

 

AWS 公式で IVS の認証機能を使用するブログが上がっていましたので、こちらを参考に進めていきたいと思います。

Introducing Private Channels for Amazon Interactive Video Service

 

秘密鍵を Secrets Manager にアップロード

ダウンロードした秘密鍵(private-key.pem)を Secrets Manager にアップロードします。

AWS CLI の以下コマンドを実行し、Secrets Manager に秘密鍵をアップロードします。

「--name」には任意の名前を指定してください。

aws secretsmanager create-secret --name ivsprivate --secret-binary file://PATH/private-key.pem

 

コマンド実行後にコンソール画面から Secrets Manager を確認すると、指定した名前でシークレットが作成されている事が確認出来ます。

シークレットの ARN は後ほど使用するのでメモしておきましょう。

 

トークンを返却するソースコードを準備

続いて、再生に必要なトークンを返却する Lambda 関数を作成します。ローカル PC でパッケージ等をインストールした上で、zip でアップロードを行います。

任意の作業ディレクトリを作成し、以下を実行します。

$ cd ~/PATH/work
$ npm init
# 設定項目を聞かれますが、全てデフォルトのまま進めてOKです
$ npm install jsonwebtoken

 

続いて、index.js を作成します。ソースは上記ブログ の中身をそのまま流用しているので、説明は割愛します。

8行目の SECRET_ARN には先ほど作成したシークレットの ARN を、

11行目の CHANNEL_ARN には作成した IVS チャネルの ARN を記載します。

$ vi index.js
// Need to install this using npm install jsonwebtoken
var jwt = require('jsonwebtoken');
const aws = require('aws-sdk');
var globalPem;

exports.handler = async (event) => {
  if (globalPem === undefined) { 
      await getPemKey('<SECRET_ARN>');
  }
  var payload = {
    "aws:channel-arn": "<CHANNEL_ARN>",
    "aws:access-control-allow-origin": "*"
  };
  
  var token = jwt.sign(payload, globalPem, { algorithm: 'ES384', expiresIn: '2 days' });
  var tokenObj = {
    token
  };
  const response = {
    statusCode: 200,
    body: JSON.stringify(tokenObj),
    headers: {
      'Access-Control-Allow-Origin':'*',
    },
  };
  return response;
};

async function getPemKey(pemId) {
  const secretsManager = new aws.SecretsManager({ apiVersion: '2017-10-17' });
  const secret = await secretsManager.getSecretValue({ SecretId: pemId }).promise();
  globalPem = secret.SecretBinary;
}

 

index.js の作成まで完了したら、zip に固めます。

$ cd ~/PATH/work
$ zip -r ~/ivs.zip .

 

Lambda 関数の作成

ソースの準備が出来たので、コンソールから Lambda 関数を作成していきます。

 

任意の関数名を入力し、ランタイムは Node.js 12.x を選択し「関数の作成」をクリックします。ロールについては一旦デフォルトで OK です。

 

関数が作成されたら、Lambda 関数から Secrets Manager のシークレットを取得出来る様に権限を付与してあげます。

「アクセス権限」タブを開き、ロール名をクリックします。

 

IAM の画面に遷移するので、今回は「インラインポリシーの追加」から権限を追加します。

 

JSON タブを開き、以下のポリシーを入力します。

ARN_SECRET にはシークレットの ARN を指定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": [
                "&amp;lt;ARN_SECRET&amp;gt;"
            ],
            "Effect": "Allow"
        }
    ]
}

 

ポリシー名を入力して、「ポリシーの作成」をクリックしたら IAM ロールの設定は完了です。

 

Lambda の画面に戻って関数コードのアクションより ".zip ファイルをアップロード" を選択し、上記で生成した zip ファイルをアップロードします。

 

問題なくアップロードが完了すると、IVS の認証トークンを返却する Lambda 関数の完成です。

今回はとりあえずトークンが取得できれば良いので、この Lambda 関数をテストで実行します。

 

イベント名のみ適当に入力して、「作成」をクリックします。

 

再度「テスト」をクリックすると Lambda 関数が実行され、特に問題なければ成功となり、トークンが出力されているはずです。

このトークンを使用して再生を実行するので、メモしておきましょう。

 

4. トークンを使用して再生を行う

トークンが取得できたので、再生確認を行なっていきます。

 

配信については、今回は OBS を使用して IVS の RTMP エンドポイントに対して配信を行いました。

 

OBS の設定手順については下記ブログなどを参考にしてください。

[新サービス] 数クリックでライブストリーミング配信環境が作成されるサービス「Amazon Interactive Video Service」が登場しました!

 

リクエスト方法について

IVS のコンソールで確認できる再生 URL の末尾に、クエリパラメータとして token を追加指定する事でリクエストを行います。

リクエスト例は以下です。

https://xxxxxx.us-east-1.playback.live-video.net/api/video/v1/us-east-1.0123456789.channel.IyPur8WLqdIJ.m3u8?token=eyJhbGciOiJFUzM4NCXXXXXXXXXXX

 

再生してみる

再生確認には、VideoJS HLS を利用します。

token を付与した URL を使用したところ再生が出来ました!

 

試しに token 部分を削除してみると、エラーが発生し再生が出来なくなりました。

 

おわりに

IVS に追加された認証機能を紹介し、実際に触ってみました。

手軽にライブ配信環境を用意出来る IVS ですが、認証機能も使用出来る様になった事で、より一層利用されるケースが増えてくるのではと期待できそうです。

 

以上、AWS 事業本部の大前でした。

参考