Amazon Kinesis Video Streams: GStreamer plugin の認証情報(Credentials)

概要

GStreamer プラグインを使って Kinesis Video Streams に送信 (Produce) する際、認証情報を指定する方法は複数あります。

  1. 環境変数 (AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY) で指定する
  2. kvssink にパラメーター access-key/secret-key を指定する
  3. 認証情報をテキストファイルに記述し、kvssink にパラメーター credential-path を指定する

参考) GStreamer Element Parameter Reference

最初の 2 つは実行時に指定された認証情報を使い続けます。長時間送信を続けるために、更新が必要になる一時的な認証情報は使えません。

1. 環境変数 (AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY) で指定する

export AWS_ACCESS_KEY_ID=(AccessKeyId)
export AWS_SECRET_ACCESS_KEY=(SecretAccessKey)

RTSP_URL=rstp://...
STREAM_NAME=stream-test
gst-launch-1.0 \
    rtspsrc location="${RTSP_URL}" protocols=tcp \
    ! rtph264depay \
    ! queue \
    ! h264parse \
    ! video/x-h264,stream-format=avc,alignment=au \
    ! kvssink stream-name="${STREAM_NAME}" storage-size=512

2. kvssink にパラメーター access-key/secret-key を指定する

RTSP_URL=rstp://...
STREAM_NAME=stream-test
gst-launch-1.0 \
    rtspsrc location="${RTSP_URL}" protocols=tcp \
    ! rtph264depay \
    ! queue \
    ! h264parse \
    ! video/x-h264,stream-format=avc,alignment=au \
    ! kvssink stream-name="${STREAM_NAME}" storage-size=512 \
        access-key="(AccessKeyId)" \
        secret-key="(SecretAccessKey)"

3. 認証情報をテキストファイルに記述し、kvssink にパラメーター credential-path を指定する

送信 (Produce) 用の IAM ロールを作成しておきます。

ACCOUNT_ID=$(aws sts get-caller-identity --output text --query "Account")
aws iam create-role \
    --role-name kinesis-video-producer-test \
    --assume-role-policy-document "{
        \"Version\": \"2012-10-17\",
        \"Statement\": [{
            \"Effect\": \"Allow\",
            \"Principal\": {\"AWS\": \"arn:aws:iam::${ACCOUNT_ID}:root\"},
            \"Action\": \"sts:AssumeRole\"
        }]
    }" \
    --max-session-duration 3600
aws iam attach-role-policy --role-name kinesis-video-producer-test \
    --policy-arn arn:aws:iam::aws:policy/AmazonKinesisVideoStreamsFullAccess

この IAM ロールから credential.txt を作成します。更新するときも同じです。

ROLE_ARN=$(aws iam get-role --role-name kinesis-video-producer-test --output text --query "Role.Arn")
aws sts assume-role --role-arn "${ROLE_ARN}" --role-session-name streaming | jq -r "
    \"CREDENTIALS \" + .Credentials.AccessKeyId + \" \" + .Credentials.Expiration
    + \" \" +.Credentials.SecretAccessKey + \" \" + .Credentials.SessionToken
" | tee credential.txt

credential-path に指定するテキストファイルの形式は公式ドキュメントに見当たらなかったのですが、ソースを見ると以下のとおりで、書いてあるテキストの個数によって区別しているようです。一時的な認証情報を渡す場合は前者の形式で生成します。

  1. CREDENTIALS (AccessKeyId) (Expiration) (SecretAccessKey) (SessionToken)
  2. CREDENTIALS (AccessKeyId) (SecretAccessKey)

この credential.txt を指定して送信 (Produce) します。認証情報を更新した場合は credential-path に指定したテキストファイルを上書すれば、自動的に新しいものが使用されて配信が継続されます。

RTSP_URL=rstp://...
STREAM_NAME=stream-test
gst-launch-1.0 \
    rtspsrc location="${RTSP_URL}" protocols=tcp \
    ! rtph264depay \
    ! queue \
    ! h264parse \
    ! video/x-h264,stream-format=avc,alignment=au \
    ! kvssink stream-name="${STREAM_NAME}" storage-size=512 \
        credential-path="$(pwd)/credential.txt"