【小ネタ】AWS CDKでKinesis Video Streamsを利用できなかった話

2021.06.03

カフェチームの山本です。

現在、カフェのシステムでは、機械学習を用いて、カメラを用いて動画を撮影し、商品の前にいる人物の骨格や手を検出することで、どのユーザがどの商品を取り出したかを判定しています。

そのために、エッジデバイスからクラウドに動画を送信し、クラウド側で様々な処理を実行する、という構成を検討しており、最近の記事で、Kinesis Video Streamsを使った、エッジデバイスでの動画処理と、クラウド側の処理について記載しました。

撮影した動画をリアルタイムにエンコードする方法【GStreamer】

【Kinesis Video Streams】Pythonで動画ファイルを送信する

Lambda関数でKinesis Video Streamsから動画を取得する

今回は、クラウド(AWS)側のリソースを管理するためにCDKを使おうとした際に、Kinesis Video Streams(以下、KVS)を利用できなかった(2021/06/03現在)ようだったので、その内容と自分が行った対処に関して記載します。

CDKにはKVSがない

AWS CDKのAPI Referenceのページを見てみると、kinesisと名前がつくものは以下の4つがありました。

  • @aws-cdk/aws-kinesis
  • @aws-cdk/aws-kinesisanalytics¹
  • @aws-cdk/aws-kinesisanalytics-flink
  • @aws-cdk/aws-kinesisfirehose¹

@aws-cdk/aws-kinesisは、Kinesis Data Streamsであり、ほかのものも名前の通りKVSではありません。

対処

ストリームの作成・削除

CDKから作成することはできないため、他の手段を使う必要があります。簡単に作成するなら、AWS CLIが良いと思われます。以下のコマンドで、動画データを24時間保持する設定のストリームの作成と、作成したストリームの削除ができます。、

aws kinesisvideo create-stream --stream-name test_stream --data-retention-in-hours 24
aws kinesisvideo create-stream --stream-arn (作成したストリームのARN)

アクセス権限の付与

前回の記事で書いたようにLambda関数からKVSにアクセスする際には、Lambda関数のIAMロールに権限を付与する必要があります。

Lambda関数でKinesis Video Streamsから動画を取得する

CDKでLambda関数を管理し、KVSへのアクセス権限を与えるには、例えば、以下のようにすることができます。KVS_STREAM_ARNには予め作成したKVSストリームのARNを、LAMBDA_ASSET_PATHには実行したいLambda関数のコードへのパスを、それぞれ指定してください(アクセスするKVSストリームを制限しない場合は、「"*"」を指定してください)。

import * as cdk from '@aws-cdk/core';
import * as lambda from "@aws-cdk/aws-lambda";
import * as iam from "@aws-cdk/aws-iam";

const KVS_STREAM_ARN = "(KVSストリームのARN)"
const LAMBDA_ASSET_PATH = "(Lambda関数のコードへのパス)"

export class KvsAccessStack extends cdk.Stack {
  private function_kvs_access: lambda.Function;

  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    this.function_kvs_access = new lambda.Function(this, "function_kvs_access", {
      code: new lambda.AssetCode(LAMBDA_ASSET_PATH),
      handler: "lambda_function.lambda_handler",
      runtime: lambda.Runtime.PYTHON_3_6,
      memorySize: 2048,
      timeout: cdk.Duration.seconds(30),
    });
    this.function_kvs_access.addToRolePolicy(new iam.PolicyStatement({
      effect: iam.Effect.ALLOW,
      resources: [KVS_STREAM_ARN],
      actions: ['kinesisvideo:*'],
    }))
  }
}

まとめ

CDKからKVSを利用できないようでした。また、簡単ですが、対処法について記載しました。