を使用した Kinesis Video Streams リソースへのアクセスの制御 AWS IoT - Amazon Kinesis Video Streams

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

を使用した Kinesis Video Streams リソースへのアクセスの制御 AWS IoT

このセクションでは、デバイス (カメラなど) が 1 つの特定の Kinesis ビデオストリームにのみオーディオおよびビデオデータを送信できるようにする方法について説明します。これを行うには、 AWS IoT 認証情報プロバイダーと AWS Identity and Access Management (IAM) ロールを使用します。

デバイスは X.509 証明書を使用して、TLS 相互認証プロトコル AWS IoT を使用して に接続できます。他の AWS のサービス (Kinesis Video Streams など) は証明書ベースの認証をサポートしていませんが、 AWS 署名バージョン 4 形式の認証情報を使用して AWS 呼び出すことができます。署名バージョン 4 アルゴリズムでは、通常、呼び出し元にアクセスキー ID とシークレットアクセスキーが必要です。 AWS IoT には認証情報プロバイダーがあり、組み込みの X.509 証明書を一意のデバイス ID として使用して AWS リクエスト (Kinesis Video Streams へのリクエストなど) を認証できます。これにより、アクセスキー ID とシークレットアクセスキーをデバイスに保存する必要がなくなります。

認証情報プロバイダーは、X.509 証明書を使用してクライアント (この場合は、ビデオストリームにデータを送信するカメラで実行されている Kinesis Video Streams SDK) を認証し、権限が制限された一時的なセキュリティトークンを発行します。トークンを使用して、任意の AWS リクエスト (この場合は Kinesis Video Streams への呼び出し) に署名して認証できます。詳細については、「 AWS サービスへの直接呼び出しの承認」を参照してください。

Kinesis Video Streams へのカメラのリクエストを認証するには、IAM ロールを作成して設定し、適切な IAM ポリシーをロールにアタッチして、 AWS IoT 認証情報プロバイダーがユーザーに代わってロールを引き受けられるようにする必要があります。

詳細については AWS IoT、AWS IoT Core 「 ドキュメント」を参照してください。IAM の詳細については、AWS Identity and Access Management (IAM) を参照してください。

ストリーム名としてのAWS IoT ThingName

ステップ 1: AWS IoT モノのタイプと AWS IoT モノを作成する

では AWS IoT、モノは特定のデバイスまたは論理エンティティを表します。この場合、 AWS IoT モノは、リソースレベルのアクセスコントロールを設定する Kinesis ビデオストリームを表します。モノを作成するには、まず AWS IoT モノのタイプを作成する必要があります。 AWS IoT モノのタイプを使用して、同じモノのタイプに関連付けられているすべてのモノに共通する説明と設定情報を保存できます。

  1. 次のコマンド例では、モノのタイプ kvs_example_camera が作成されます。

    aws --profile default iot create-thing-type --thing-type-name kvs_example_camera > iot-thing-type.json
  2. このコマンド例では、 kvs_example_camera_stream モノタイプのkvs_example_cameraモノを作成します。

    aws --profile default iot create-thing --thing-name kvs_example_camera_stream --thing-type-name kvs_example_camera > iot-thing.json

ステップ 2: が引き受ける IAM ロールを作成する AWS IoT

IAM ロールはユーザーと似ています。ロールは、 AWS アイデンティティが実行できることとできないことを決定するアクセス許可ポリシーを持つアイデンティティであるという点です AWS。ロールは、そのロールを必要とするどのユーザーでも引き受けることができます。ロールを引き受けると、ロールセッション用の一時的なセキュリティ認証情報が提供されます。

このステップで作成するロールは、クライアントから認証情報認可リクエストを実行するときに、セキュリティトークンサービス (STS) から一時的な認証情報を取得 AWS IoT するために が引き受けることができます。この場合、クライアントはカメラで実行されている Kinesis Video Streams SDK です。

この IAM ロールを作成して設定するには、以下のステップを実行します。

  1. IAM ロールを作成します。

    次のコマンド例では、 KVSCameraCertificateBasedIAMRoleという IAM ロールが作成されます。

    aws --profile default iam create-role --role-name KVSCameraCertificateBasedIAMRole --assume-role-policy-document 'file://iam-policy-document.json' > iam-role.json

    iam-policy-document.json には、次の信頼ポリシー JSON を使用できます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "credentials.iot.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. 次に、以前に作成した IAM ロールにアクセス許可ポリシーをアタッチします。このアクセス許可ポリシーは、 AWS リソースに対する選択的なアクセスコントロール (サポートされているオペレーションのサブセット) を許可します。この場合、 AWS リソースはカメラでデータを送信するビデオストリームです。つまり、すべての設定ステップが完了すると、このカメラはこのビデオストリームにのみデータを送信できるようになります。

    aws --profile default iam put-role-policy --role-name KVSCameraCertificateBasedIAMRole --policy-name KVSCameraIAMPolicy --policy-document 'file://iam-permission-document.json'

    には、次の IAM ポリシー JSON を使用できますiam-permission-document.json

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kinesisvideo:DescribeStream", "kinesisvideo:PutMedia", "kinesisvideo:TagStream", "kinesisvideo:GetDataEndpoint" ], "Resource": "arn:aws:kinesisvideo:*:*:stream/${credentials-iot:ThingName}/*" } ] }

    このポリシーは、プレースホルダー で指定されたビデオストリーム (AWS リソース) でのみ、指定されたアクションを許可することに注意してください(${credentials-iot:ThingName})。このプレースホルダーは、認証情報プロバイダーがリクエストでビデオストリーム名を送信するThingNameときに AWS IoT 、 AWS IoT モノの属性の値を受け取ります。

  3. 次に、IAM ロールのロールエイリアスを作成します。ロールエイリアスは、IAM ロールをポイントする代替データモデルです。 AWS IoT 認証情報プロバイダーリクエストには、STS から一時的な認証情報を取得するために引き受ける IAM ロールを示すロールエイリアスを含める必要があります。

    次のサンプルコマンドでは、KvsCameraIoTRoleAlias というロールエイリアスが作成されます。

    aws --profile default iot create-role-alias --role-alias KvsCameraIoTRoleAlias --role-arn $(jq --raw-output '.Role.Arn' iam-role.json) --credential-duration-seconds 3600 > iot-role-alias.json
  4. これで、ロールエイリアスを使用して AWS IoT 、 が (アタッチされた後に) 証明書を使用してロールを引き受けることができるポリシーを作成できます。

    次のサンプルコマンドは、 AWS IoT という のポリシーを作成しますKvsCameraIoTPolicy

    aws --profile default iot create-policy --policy-name KvsCameraIoTPolicy --policy-document 'file://iot-policy-document.json'

    次のコマンドを使用して、iot-policy-document.jsonドキュメント JSON を作成できます。

    cat > iot-policy-document.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:AssumeRoleWithCertificate" ], "Resource": "$(jq --raw-output '.roleAliasArn' iot-role-alias.json)" } ] } EOF

ステップ 3: X.509 証明書を作成して設定する

デバイス (ビデオストリーム) と 間の通信 AWS IoT は、X.509 証明書を使用して保護されます。

  1. AWS IoT 以前に作成した のポリシーをアタッチする必要がある証明書を作成します。

    aws --profile default iot create-keys-and-certificate --set-as-active --certificate-pem-outfile certificate.pem --public-key-outfile public.pem.key --private-key-outfile private.pem.key > certificate
  2. この証明書に AWS IoT (KvsCameraIoTPolicy以前に作成した) のポリシーをアタッチします。

    aws --profile default iot attach-policy --policy-name KvsCameraIoTPolicy --target $(jq --raw-output '.certificateArn' certificate)
  3. 作成した証明書に AWS IoT モノ (kvs_example_camera_stream) をアタッチします。

    aws --profile default iot attach-thing-principal --thing-name kvs_example_camera_stream --principal $(jq --raw-output '.certificateArn' certificate)
  4. AWS IoT 認証情報プロバイダーを介してリクエストを承認するには、 AWS アカウント ID に固有の AWS IoT 認証情報エンドポイントが必要です。次のコマンドを使用して、 AWS IoT 認証情報エンドポイントを取得できます。

    aws --profile default iot describe-endpoint --endpoint-type iot:CredentialProvider --output text > iot-credential-provider.txt
  5. 以前に作成した X.509 証明書に加えて、TLS を介してバックエンドサービスとの信頼を確立するための CA 証明書も必要です。CA 証明書は、次のコマンドを使用して取得できます。

    curl --silent 'https://www.amazontrust.com/repository/SFSRootCAG2.pem' --output cacert.pem

ステップ 4: Kinesis ビデオストリームで AWS IoT 認証情報をテストする

これで、これまでに設定した AWS IoT 認証情報をテストできます。

  1. まず、この設定のテストに使用する Kinesis ビデオストリームを作成します。

    重要

    前のステップ () で作成した AWS IoT モノの名前と同じ名前でビデオストリームを作成しますkvs_example_camera_stream

    aws kinesisvideo create-stream --data-retention-in-hours 24 --stream-name kvs_example_camera_stream
  2. 次に、 AWS IoT 認証情報プロバイダーを呼び出して一時的な認証情報を取得します。

    curl --silent -H "x-amzn-iot-thingname:kvs_example_camera_stream" --cert certificate.pem --key private.pem.key https://IOT_GET_CREDENTIAL_ENDPOINT/role-aliases/KvsCameraIoTRoleAlias/credentials --cacert ./cacert.pem > token.json
    注記

    次のコマンドを使用して を取得できますIOT_GET_CREDENTIAL_ENDPOINT

    IOT_GET_CREDENTIAL_ENDPOINT=`cat iot-credential-provider.txt`

    出力 JSON には、accessKeysecretKey、および が含まれておりsessionToken、Kinesis Video Streams へのアクセスに使用できます。

  3. テストでは、これらの認証情報を使用して、サンプルkvs_example_camera_streamビデオストリームの Kinesis Video Streams DescribeStream API を呼び出すことができます。

    AWS_ACCESS_KEY_ID=$(jq --raw-output '.credentials.accessKeyId' token.json) AWS_SECRET_ACCESS_KEY=$(jq --raw-output '.credentials.secretAccessKey' token.json) AWS_SESSION_TOKEN=$(jq --raw-output '.credentials.sessionToken' token.json) aws kinesisvideo describe-stream --stream-name kvs_example_camera_stream

ステップ 5: カメラのファイルシステムに AWS IoT 証明書と認証情報をデプロイし、データをビデオストリームにストリーミングする

注記

このセクションのステップでは、 を使用しているカメラから Kinesis ビデオストリームにメディアを送信する方法について説明しますC++ プロデューサーライブラリを使用する

  1. X.509 証明書、プライベートキー、および前のステップで生成された CA 証明書をカメラのファイルシステムにコピーします。これらのファイルが保存される場所のパス、ロールエイリアス名、およびgst-launch-1.0コマンドまたはサンプルアプリケーションを実行するための AWS IoT 認証情報エンドポイントを指定します。

  2. 次のサンプルコマンドは、 AWS IoT 証明書認可を使用して Kinesis Video Streams に動画を送信します。

    gst-launch-1.0 rtspsrc location=rtsp://YourCameraRtspUrl short-header=TRUE ! rtph264depay ! video/x-h264,format=avc,alignment=au ! h264parse ! kvssink stream-name="kvs_example_camera_stream" aws-region="YourAWSRegion" iot-certificate="iot-certificate,endpoint=credential-account-specific-prefix.credentials.iot.aws-region.amazonaws.com,cert-path=/path/to/certificate.pem,key-path=/path/to/private.pem.key,ca-path=/path/to/cacert.pem,role-aliases=KvsCameraIoTRoleAlias"

ストリーム名としてのAWS IoT CertificateId

AWS IoT モノを介してデバイス (カメラなど) を表すが、別のストリーム名を許可するには、 属性を AWS IoT certificateIdストリーム名として使用し、 を使用してストリームに対する Kinesis Video Streams アクセス許可を付与できます AWS IoT。これを実現する手順は、前述の手順と似ていますが、いくつかの変更があります。

  • アクセス許可ポリシーを IAM ロール (iam-permission-document.json) に次のように変更します。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kinesisvideo:DescribeStream", "kinesisvideo:PutMedia", "kinesisvideo:TagStream", "kinesisvideo:GetDataEndpoint" ], "Resource": "arn:aws:kinesisvideo:*:*:stream/${credentials-iot:AwsCertificateId}/*" } ] }
    注記

    リソース ARN では、ストリーム ID のプレースホルダーとして証明書 ID を使用します。IAM アクセス許可は、証明書 ID をストリーム名として使用すると機能します。証明書から証明書 ID を取得して、次の describe stream API コールでストリーム名として使用できます。

    export CERTIFICATE_ID=`cat certificate | jq --raw-output '.certificateId'`
  • Kinesis Video Streams の describe-stream CLI コマンドを使用して、この変更を確認します。

    AWS_ACCESS_KEY_ID=$(jq --raw-output '.credentials.accessKeyId' token.json) AWS_SECRET_ACCESS_KEY=$(jq --raw-output '.credentials.secretAccessKey' token.json) AWS_SESSION_TOKEN=$(jq --raw-output '.credentials.sessionToken' token.json) aws kinesisvideo describe-stream --stream-name ${CERTIFICATE_ID}
  • certificateId を Kinesis Video Streams C++ SDK のサンプルアプリケーションの AWS IoT 認証情報プロバイダーに渡します。

    credential_provider = make_unique<IotCertCredentialProvider>(iot_get_credential_endpoint, cert_path, private_key_path, role_alias, ca_cert_path, certificateId);
    注記

    を認証情報プロバイダーthingnameに AWS IoT 渡すことに注意してください。を使用するとgetenv、他の AWS IoT 属性を渡すのと同様に、モノの名前をデモアプリケーションに渡すことができます。サンプルアプリケーションを実行するときに、コマンドラインパラメータでストリーム名として証明書 ID を使用します。

AWS IoT 認証情報を使用してハードコードされたストリーム名にストリーミングする

AWS IoT モノを介してデバイス (カメラなど) を表すが、特定の Amazon Kinesis ビデオストリームへのストリーミングを許可するには、 を使用してストリームに対する Amazon Kinesis Video Streams アクセス許可を付与します AWS IoT。このプロセスは前のセクションと似ていますが、いくつかの変更があります。

アクセス許可ポリシーを IAM ロール (iam-permission-document.json) に次のように変更します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kinesisvideo:DescribeStream", "kinesisvideo:PutMedia", "kinesisvideo:TagStream", "kinesisvideo:GetDataEndpoint" ], "Resource": "arn:aws:kinesisvideo:*:*:stream/YourStreamName/*" } ] }

前のステップで生成された X.509 証明書、プライベートキー、および CA 証明書をカメラのファイルシステムにコピーします。

これらのファイルが保存される場所のパス、ロールエイリアス名、 AWS IoT モノの名前、および gst-launch-1.0 コマンドまたはサンプルアプリケーションを実行するための AWS IoT 認証情報エンドポイントを指定します。

次のサンプルコマンドは、 AWS IoT 証明書認可を使用して Amazon Kinesis Video Streams に動画を送信します。

gst-launch-1.0 rtspsrc location=rtsp://YourCameraRtspUrl short-header=TRUE ! rtph264depay ! video/x-h264,format=avc,alignment=au ! h264parse ! kvssink stream-name="YourStreamName" aws-region="YourAWSRegion" iot-certificate="iot-certificate,endpoint=credential-account-specific-prefix.credentials.iot.aws-region.amazonaws.com,cert-path=/path/to/certificate.pem,key-path=/path/to/private.pem.key,ca-path=/path/to/cacert.pem,role-aliases=KvsCameraIoTRoleAlias,iot-thing-name=YourThingName"