

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用控制对 Kinesis Video Streams 资源的访问权限 AWS IoT
<a name="how-iot"></a>

本节介绍如何允许设备（例如摄像机）仅向一个特定的 Kinesis 视频流发送音频和视频数据。您可以使用 AWS IoT 证书提供商和 AWS Identity and Access Management (IAM) 角色来执行此操作。

设备可以使用 X.509 证书通过 TLS 双向 AWS IoT 身份验证协议进行连接。其他 AWS 服务 （例如 Kinesis Video Streams Video Streams）不支持基于证书的身份验证，但可以使用签名版本 4 格式的凭据 AWS AWS 进行调用。签名版本 4 算法通常要求呼叫者拥有访问密钥 ID 和私有访问密钥。 AWS IoT 有一个凭据提供程序，允许您使用内置 X.509 证书作为唯一的设备身份来验证 AWS 请求（例如，对 Kinesis Video Streams 的请求）。这样就无需在设备上存储访问密钥 ID 和私有访问密钥。

凭证提供者使用证书对客户端（在本例中为要向视频流发送数据的摄像机上运行的 Kinesis Video Streams SDK）进行 X.509 身份验证，并颁发临时的有限权限安全令牌。您可以使用该令牌对任何 AWS 请求（在本例中为对 Kinesis Video Streams 的调用）进行签名和身份验证。有关更多信息，请参阅[授权直接呼叫 AWS 服务。](https://docs.aws.amazon.com//iot/latest/developerguide/authorizing-direct-aws.html)

这种验证摄像机向 Kinesis Video Streams 发出的请求的方法要求您创建和配置 IAM 角色并为该角色附加相应的 IAM 策略， AWS IoT 以便证书提供者可以代表您担任该角色。

有关的更多信息 AWS IoT，请参阅[AWS IoT Core 文档](https://docs.aws.amazon.com/iot/?id=docs_gateway)。有关 IAM 的更多信息，请参阅 [AWS Identity and Access Management (IAM)](https://aws.amazon.com/iam/)。

**Topics**
+ [AWS IoT ThingName 作为直播名称](#how-iot-thingnamestreamname)
+ [AWS IoT CertificateId 作为直播名称](#how-iot-iotcertstreamname)
+ [使用 AWS IoT 用于流式传输到硬编码流名称的凭据](#how-iot-hard-coded-stream)

## AWS IoT ThingName 作为直播名称
<a name="how-iot-thingnamestreamname"></a>

**Topics**
+ [步骤 1：创建一个 AWS IoT 事物类型和 AWS IoT thing](#how-iot-create-thing-type)
+ [步骤 2：创建由代入的 IAM 角色 AWS IoT](#how-iot-add-iot-policy)
+ [步骤 3：创建和配置 X.509 证书](#how-iot-create-cert-keys)
+ [第 4 步：测试 AWS IoT 带有 Kinesis 视频流的凭证](#how-iot-test-it)
+ [步骤 5：部署 AWS IoT 摄像机文件系统上的证书和凭证，并将数据流式传输到视频流](#how-iot-deploy)

### 步骤 1：创建一个 AWS IoT 事物类型和 AWS IoT thing
<a name="how-iot-create-thing-type"></a>

在中 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
   ```

1. 以下示例命令创建`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
<a name="how-iot-add-iot-policy"></a>

IAM 角色与用户类似，因为角色是一种 AWS 身份，其权限策略决定了该身份可以做什么和不能做什么 AWS。任何需要角色的人都可以代入该角色。当您代入角色时，它会为您提供角色会话的临时安全凭证。

在执行来自客户端的凭证授权请求时，可以代入您在此步骤中创建的角色 AWS IoT 来从安全令牌服务 (STS) 获取临时证书。在本例中，客户端是在你的相机上运行的 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
   ```

   您可以将以下信任策略 JSON 用于 `iam-policy-document.json`：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "credentials.iot.amazonaws.com"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

1. 接下来，将权限策略附加到您之前创建的 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`：

------
#### [ 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}/*"
           }
       ]
   }
   ```

------

   请注意，此政策仅授权对占位符`(${credentials-iot:ThingName})`指定的视频流（AWS 资源）执行指定操作。当 AWS IoT 凭证提供者在请求中发送视频流名称`ThingName`时，此占位符会取用 thin AWS IoT g 属性的值。

1. 接下来，为您的 IAM 角色创建角色别名。角色别名是一个指向 IAM 角色的备用数据模型。 AWS IoT 证书提供商请求必须包含角色别名，以指明要代入哪个 IAM 角色才能从 STS 获取临时证书。

   以下示例命令可以创建一个称作 `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
   ```

1. 现在，您可以使用角色别名创建 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 证书
<a name="how-iot-create-cert-keys"></a>

设备（您的视频流）和 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
   ```

1. 将 AWS IoT （之前`KvsCameraIoTPolicy`创建的）的策略附加到此证书。

   ```
   aws --profile default iot attach-policy --policy-name KvsCameraIoTPolicy --target $(jq --raw-output '.certificateArn' certificate)
   ```

1. 将你的 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)
   ```

1. 要通过 AWS IoT 凭证提供商授权请求，您需要凭 AWS IoT 证端点，该端点是您的 AWS 账户 ID 所独有的。您可以使用以下命令来获取 AWS IoT 凭据端点。

   ```
   aws --profile default iot describe-endpoint --endpoint-type iot:CredentialProvider --output text > iot-credential-provider.txt
   ```

1. 除了之前创建的 X.509 证书外，您还必须拥有 CA 证书，才能通过 TLS 与后端服务建立信任。您可以使用以下命令获取 CA 证书：

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

### 第 4 步：测试 AWS IoT 带有 Kinesis 视频流的凭证
<a name="how-iot-test-it"></a>

现在，您可以测试到目前为止已设置的 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
   ```

1. 接下来，致电 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 包含`accessKey``secretKey`、和，你可以用它们来访问 Kinesis Video Streams。`sessionToken`

1. 在测试中，您可以使用这些凭据为`kvs_example_camera_stream`示例视频`DescribeStream`流调用 Kinesis Video Streams 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 摄像机文件系统上的证书和凭证，并将数据流式传输到视频流
<a name="how-iot-deploy"></a>

**注意**  
本节中的步骤描述了从正在使用 Kinesis 的摄像机向 Kinesis 视频流发送媒体。[使用 C\+\+ 制作人库](producer-sdk-cpp.md)

1. 将 X.509 之前步骤中生成的证书、私钥和 CA 证书复制到摄像机的文件系统。指定这些文件的存储路径、角色别名以及用于运行`gst-launch-1.0`命令或示例应用程序的 AWS IoT 凭据端点。

1. 以下示例命令使用 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 作为直播名称
<a name="how-iot-iotcertstreamname"></a>

要通过某 AWS IoT 物来表示您的设备（例如您的摄像头），但授权不同的直播名称，则可以使用该 AWS IoT `certificateId`属性作为直播名称，并使用为直播提供 Kinesis Video Stream AWS IoT s 权限。完成此操作的步骤与前面概述的步骤类似，但有一些改动。
+ 按如下方式修改您的 IAM 角色 (`iam-permission-document.json`) 的权限策略：

------
#### [ 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，这样您就可以在以下描述流 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}
  ```
+ 在 Kinesis Video Streams C AWS IoT \+\+ SDK [的示例应用程序中将](https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp/blob/master/samples/kvs_gstreamer_sample.cpp)证书 ID 传递给证书提供者：

  ```
  credential_provider = make_unique<IotCertCredentialProvider>(iot_get_credential_endpoint,
          cert_path,
          private_key_path,
          role_alias,
          ca_cert_path,
          certificateId);
  ```
**注意**  
请注意，您要将传递`thingname`给 AWS IoT 凭证提供商。您可以使用`getenv`将 thingname 传递给演示应用程序，就像传递其他 AWS IoT 属性一样。运行示例应用程序时，将证书 ID 用作命令行参数中的流名称。

## 使用 AWS IoT 用于流式传输到硬编码流名称的凭据
<a name="how-iot-hard-coded-stream"></a>

要通过某 AWS IoT 件事物展示你的设备（例如你的摄像头），但授权直播到特定的亚马逊 Kinesis 视频流，请使用向直播提供 Amazon Kinesis Video Streams 权限。 AWS IoT该过程与前面的章节类似，但有一些改动。

按如下方式修改您的 IAM 角色 (`iam-permission-document.json`) 的权限策略：

------
#### [ 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}}"
```