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

## 概要

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

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

参考) [GStreamer Element Parameter Reference](https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/examples-gstreamer-plugin-parameters.html)

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

## 例

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

```shell
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 を指定する

```shell
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 ロールを作成しておきます。

```shell
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 を作成します。更新するときも同じです。

```shell
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 に指定するテキストファイルの形式は公式ドキュメントに見当たらなかったのですが、[ソース](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c/blob/6a7aab4fcde0791b5b092a15e61a5cacfc57c259/src/source/Common/FileCredentialProvider.c#L153)を見ると以下のとおりで、書いてあるテキストの個数によって区別しているようです。一時的な認証情報を渡す場合は前者の形式で生成します。

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

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

```shell
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"
```