使用 控制對 Kinesis Video Streams 資源的存取 AWS IoT - Amazon Kinesis Video Streams

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 控制對 Kinesis Video Streams 資源的存取 AWS IoT

本節說明如何啟用裝置 (例如攝影機),以僅將音訊和影片資料傳送至特定 Kinesis 影片串流。您可以使用 AWS IoT 憑證提供者和 AWS Identity and Access Management (IAM) 角色來執行此操作。

裝置可以使用 X.509 憑證, AWS IoT 使用TLS相互身分驗證通訊協定連線至 。其他 AWS 服務 (例如 Kinesis Video Streams) 不支援以憑證為基礎的身分驗證,但可以使用 AWS Signature 第 4 版格式的憑證呼叫 AWS 。Signature 第 4 版演算法通常要求呼叫者擁有存取金鑰 ID 和秘密存取金鑰。 AWS IoT 具有憑證提供者,可讓您使用內建 X.509 憑證作為唯一裝置身分來驗證 AWS 請求 (例如,請求 Kinesis Video Streams)。這樣就不需要在您的裝置上存放存取金鑰 ID 和秘密存取金鑰。

憑證提供者會使用 X.509 憑證來驗證用戶端 (在此情況下,SDK是在您要將資料傳送至影片串流的攝影機上執行的 Kinesis Video Streams),並發出暫時、有限權限的安全權杖。您可以使用權杖簽署和驗證任何 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物件類型的kvs_example_camera_stream物件:

    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。需要角色的任何人都可以擔任該角色。當您擔任角色時,其會為您的角色工作階段提供臨時安全性登入資料。

您在此步驟中建立的角色可由 擔任 AWS IoT ,以便在從用戶端執行憑證授權請求時,從安全字符服務 (STS) 取得臨時憑證。在這種情況下,用戶端是在您的攝影機上執行SDK的 Kinesis Video Streams。

執行下列步驟來建立和設定此IAM角色:

  1. 建立 IAM 角色。

    下列範例命令會建立名為 IAM的角色KVSCameraCertificateBasedIAMRole

    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

    { "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'

    您可以JSON針對 使用下列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:ThingName}/*" } ] }

    請注意,此政策僅在預留位置 指定的影片串流 (AWS 資源) 上授權指定的動作(${credentials-iot:ThingName})。當憑證提供者在請求中傳送影片串流名稱ThingName時,此 AWS IoT 預留位置會接受 AWS IoT 物件屬性的值。

  3. 接下來,為您的角色建立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
  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 憑證

裝置 (您的影片串流) 與 之間的通訊會透過使用 X.509 憑證 AWS IoT 受到保護。

  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 IoT 憑證端點,這是您 AWS 帳戶 ID 獨有的。您可以使用下列命令來取得 AWS IoT 憑證端點。

    aws --profile default iot describe-endpoint --endpoint-type iot:CredentialProvider --output text > iot-credential-provider.txt
  5. 除了先前建立的 X.509 憑證之外,您還必須擁有 CA 憑證,才能透過 建立對後端服務的信任TLS。您可以使用下列命令來取得 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包含 accessKeysecretKeysessionToken,您可以使用它來存取 Kinesis Video Streams。

  3. 在測試中,您可以使用這些憑證來叫用範例影片串流DescribeStreamAPI的 Kinesis kvs_example_camera_stream Video Streams。

    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,以便您可以在以下描述串流API呼叫中將該憑證 ID 用作串流名稱。

    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++ 中,將 傳遞 certificateId 給範例應用程式中的 AWS IoT 憑證提供者SDK:

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

    請注意,您要將 AWS IoT 傳遞thingname給憑證提供者。您可以使用 將物件名稱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"