使用 AWS IoT 規則存取跨帳戶資源 - AWS IoT Core

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

使用 AWS IoT 規則存取跨帳戶資源

您可以設定跨帳戶存取的 AWS IoT 規則,以便將擷取到一個帳戶MQTT主題的資料路由到另一個帳戶的 AWS 服務,例如 Amazon SQS和 Lambda。以下說明如何設定跨帳戶資料擷取的 AWS IoT 規則,從一個帳戶中MQTT的主題到另一個帳戶中的目的地。

跨帳戶規則可使用資源型許可,在目的地資源上進行配至。因此,只有支援資源型許可的目的地才能為具有 AWS IoT 規則的跨帳戶存取啟用。支援的目的地包括 Amazon SQS、Amazon SNS、Amazon S3 和 AWS Lambda。

注意

對於支援的目的地,除了 Amazon SQS之外,您必須在與其他服務資源 AWS 區域 相同的 中定義規則,以便規則動作可以與該資源互動。如需 AWS IoT 規則動作的詳細資訊,請參閱AWS IoT 規則動作 。如需規則SQS動作的詳細資訊,請參閱 SQS

必要條件

Amazon 的跨帳戶設定 SQS

案例:帳戶 A 從MQTT訊息傳送資料到帳戶 B 的 Amazon SQS佇列。

AWS 帳戶 帳戶稱為 描述
1111-1111-1111 帳戶 A 規則動作:sqs:SendMessage
2222-2222-2222 帳戶 B Amazon SQS佇列
  • ARN: arn:aws:sqs:region:2222-2222-2222:ExampleQueue

  • URL: https://sqs.region.amazonaws.com/2222-2222-2222/ExampleQueue

注意

您的目的地 Amazon SQS佇列不必 AWS 區域 與AWS IoT 規則 位於相同位置。如需規則SQS動作的詳細資訊,請參閱 SQS

執行帳戶 A 任務
注意

若要執行下列命令,您的IAM使用者應該具有 的許可,iot:CreateTopicRule以規則的 Amazon Resource Name (ARN) 作為資源,以及以 資源作為角色 iam:PassRole的動作許可ARN。

  1. 使用帳戶 A IAM的使用者進行設定 AWS CLI

  2. 建立信任 AWS IoT 規則引擎IAM的角色,並連接允許存取帳戶 B Amazon SQS佇列的政策。請參閱授予 AWS IoT 必要存取權 中的命令和政策文件範例。

  3. 若要建立連接至主題的規則,請執行create-topic-rule 命令

    aws iot create-topic-rule --rule-name myRule --topic-rule-payload file://./my-rule.json

    以下是承載檔案範例,其中包含規則,可將傳送至iot/test主題的所有訊息插入指定的 Amazon SQS佇列。SQL 陳述式會篩選訊息,而角色ARN會授予 AWS IoT 將訊息新增至 Amazon SQS佇列的許可。

    { "sql": "SELECT * FROM 'iot/test'", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "sqs": { "queueUrl": "https://sqs.region.amazonaws.com/2222-2222-2222/ExampleQueue", "roleArn": "arn:aws:iam::1111-1111-1111:role/my-iot-role", "useBase64": false } } ] }

    如需如何在 AWS IoT 規則中定義 Amazon SQS動作的詳細資訊,請參閱AWS IoT 規則動作 - Amazon SQS

執行帳戶 B 任務
  1. 使用帳戶 B IAM的使用者進行設定 AWS CLI

  2. 若要將 Amazon SQS佇列資源的許可授予帳戶 A,請執行 add-permission 命令

    aws sqs add-permission --queue-url https://sqs.region.amazonaws.com/2222-2222-2222/ExampleQueue --label SendMessagesToMyQueue --aws-account-ids 1111-1111-1111 --actions SendMessage

Amazon 的跨帳戶設定 SNS

案例:帳戶 A 將資料從MQTT訊息傳送至帳戶 B 的 Amazon SNS主題。

AWS 帳戶 帳戶稱為 描述
1111-1111-1111 帳戶 A 規則動作:sns:Publish
2222-2222-2222 帳戶 B Amazon SNS主題ARN: arn:aws:sns:region:2222-2222-2222:ExampleTopic
執行帳戶 A 任務
備註

若要執行下列命令,您的IAM使用者應具有 的許可iot:CreateTopicRule,以 規則ARN做為資源,以及以 資源做為角色 iam:PassRole 的動作許可ARN。

  1. 使用帳戶 A IAM的使用者進行設定 AWS CLI

  2. 建立信任 AWS IoT 規則引擎IAM的角色,並連接允許存取帳戶 B Amazon SNS主題的政策。如需命令和政策文件的範例,請參閱授予 AWS IoT 必要的存取

  3. 若要建立連接至主題的規則,請執行create-topic-rule 命令

    aws iot create-topic-rule --rule-name myRule --topic-rule-payload file://./my-rule.json

    以下是承載檔案範例,其中包含規則,可將傳送至iot/test主題的所有訊息插入指定的 Amazon SNS主題。SQL 陳述式會篩選訊息,而 角色會ARN授予 AWS IoT 許可,以將訊息傳送至 Amazon SNS主題。

    { "sql": "SELECT * FROM 'iot/test'", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "sns": { "targetArn": "arn:aws:sns:region:2222-2222-2222:ExampleTopic", "roleArn": "arn:aws:iam::1111-1111-1111:role/my-iot-role" } } ] }

    如需如何在 AWS IoT 規則中定義 Amazon SNS動作的詳細資訊,請參閱AWS IoT 規則動作 - Amazon SNS

執行帳戶 B 任務
  1. 使用帳戶 B IAM的使用者進行設定 AWS CLI

  2. 若要將 Amazon SNS主題資源的許可授予帳戶 A,請執行 add-permission 命令

    aws sns add-permission --topic-arn arn:aws:sns:region:2222-2222-2222:ExampleTopic --label Publish-Permission --aws-account-id 1111-1111-1111 --action-name Publish

Amazon S3 的跨帳戶設定

案例:帳戶 A 會將資料從MQTT訊息傳送至帳戶 B 的 Amazon S3 儲存貯體。

AWS 帳戶 帳戶稱為 描述
1111-1111-1111 帳戶 A 規則動作:s3:PutObject
2222-2222-2222 帳戶 B Amazon S3 儲存貯體ARN: arn:aws:s3:::amzn-s3-demo-bucket
執行帳戶 A 任務
注意

若要執行下列命令,您的IAM使用者應具有 的許可,iot:CreateTopicRule以 規則ARN做為資源,並具有以 資源做為角色 iam:PassRole的動作許可ARN。

  1. 使用帳戶 A IAM的使用者進行設定 AWS CLI

  2. 建立信任 AWS IoT 規則引擎並連接允許存取帳戶 B Amazon S3 儲存貯體的政策IAM的角色。如需命令和政策文件的範例,請參閱授予 AWS IoT 必要的存取

  3. 若要建立連接至目標 S3 儲存貯體的規則,請執行create-topic-rule 命令

    aws iot create-topic-rule --rule-name my-rule --topic-rule-payload file://./my-rule.json

    下列為範例承載檔案,具有一個會將傳送至 iot/test 主題之所有訊息插入指定 Amazon S3 儲存貯體的規則。SQL 陳述式會篩選訊息,而 角色會ARN授予 AWS IoT 許可,以將訊息新增至 Amazon S3 儲存貯體。

    { "sql": "SELECT * FROM 'iot/test'", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "s3": { "bucketName": "amzn-s3-demo-bucket", "key": "${topic()}/${timestamp()}", "roleArn": "arn:aws:iam::1111-1111-1111:role/my-iot-role" } } ] }

    如需如何在 AWS IoT 規則中定義 Amazon S3 動作的詳細資訊,請參閱AWS IoT 規則動作 - Amazon S3

執行帳戶 B 任務
  1. 使用帳戶 B IAM的使用者進行設定 AWS CLI

  2. 建立一個信任帳戶 A 之委託人的儲存貯體政策。

    下列為範例承載檔案,其會定義信任另一個帳戶之委託人的儲存貯體政策。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AddCannedAcl", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::1111-1111-1111:root" ] }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }

    如需詳細資訊,請參閱儲存貯體政策範例

  3. 若要將儲存貯體政策連接至指定的儲存貯體,請執行put-bucket-policy 命令

    aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://./amzn-s3-demo-bucket-policy.json
  4. 如要讓跨帳戶存取運作,請確定您具有正確的封鎖所有公有存取設定。如需詳細資訊,請參閱 Amazon S3 安全最佳實務

的跨帳戶設定 AWS Lambda

案例:帳戶 A 叫用帳戶 B 的 AWS Lambda 函數,傳遞MQTT訊息。

AWS 帳戶 帳戶稱為 描述
1111-1111-1111 帳戶 A 規則動作:lambda:InvokeFunction
2222-2222-2222 帳戶 B Lambda 函數ARN: arn:aws:lambda:region:2222-2222-2222:function:example-function
執行帳戶 A 任務
備註

若要執行下列命令,您的IAM使用者應具有 的許可iot:CreateTopicRule,以規則ARN作為資源,以及以資源作為角色 iam:PassRole 的動作許可ARN。

  1. 使用帳戶 A IAM的使用者進行設定 AWS CLI

  2. 執行 create-topic-rule 命令以建立規則,定義帳戶 B 的 Lambda 函數的跨帳戶存取。

    aws iot create-topic-rule --rule-name my-rule --topic-rule-payload file://./my-rule.json

    下列為範例承載檔案,具有一個會將傳送至 iot/test 主題之所有訊息插入指定 Lambda 函數的規則。SQL 陳述式會篩選訊息,而角色ARN會授予 AWS IoT 許可,以將資料傳遞至 Lambda 函數。

    { "sql": "SELECT * FROM 'iot/test'", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "lambda": { "functionArn": "arn:aws:lambda:region:2222-2222-2222:function:example-function" } } ] }

    如需有關如何在 AWS IoT 規則中定義 AWS Lambda 動作的詳細資訊,請參閱AWS IoT 規則動作 - Lambda

執行帳戶 B 任務
  1. 使用帳戶 B IAM的使用者進行設定 AWS CLI

  2. 執行 Lambda 的 add-permission 命令,以授予啟用 Lambda 函數的 AWS IoT 規則許可。若要執行下列命令,您的IAM使用者應具有 lambda:AddPermission 動作的許可。

    aws lambda add-permission --function-name example-function --region us-east-1 --principal iot.amazonaws.com --source-arn arn:aws:iot:region:1111-1111-1111:rule/example-rule --source-account 1111-1111-1111 --statement-id "unique_id" --action "lambda:InvokeFunction"

    選項:

    --principal

    此欄位授予 AWS IoT (由 代表iot.amazonaws.com) 呼叫 Lambda 函數的許可。

    --source-arn

    此欄位確認僅 AWS IoT 中的 arn:aws:iot:region:1111-1111-1111:rule/example-rule 會觸發此 Lambda 函數,且相同或不同帳戶中的任何其他規則皆無法啟動此 Lambda 函數。

    --source-account

    此欄位會確認 僅代表 1111-1111-1111帳戶 AWS IoT 啟用此 Lambda 函數。

    備註

    若您看到來自 AWS Lambda 函數主控台 Configuration (組態) 之下的錯誤訊息「找不到規則」,請略過錯誤訊息並繼續測試連線。