使用规则访问跨账户资源 Amazon IoT - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用规则访问跨账户资源 Amazon IoT

您可以配置跨账户访问 Amazon IoT 规则,以便在一个账户的 MQTT 主题上提取的数据可以路由到另一个账户的 Amazon 服务,例如 Amazon SQS 和 Lambda。以下内容说明如何设置跨账户数据提取 Amazon IoT 规则,从一个账户中的 MQTT 主题到另一个账户中的目的地。

跨账户规则可以在目标资源上使用基于资源的权限。因此,只有支持基于资源的权限的目标才能启用带 Amazon IoT 规则的跨账户访问权限。支持的目的地包括 Amazon SQS、Amazon SNS、Amazon S3 和 Amazon Lambda。

注意

对于支持的目标(Amazon SQS 除外),您必须将规则定义 Amazon Web Services 区域 为与其他服务的资源相同,这样规则操作才能与该资源交互。有关 Amazon IoT 规则操作的更多信息,请参阅Amazon IoT 规则操作。有关规则的 SQS 操作的更多信息,请参阅SQS

先决条件

Amazon SQS 的跨账户设置

场景:账户 A 将 MQTT 消息中的数据发送到账户 B 的 Amazon SQS 队列。

Amazon Web Services 账户 账户名称 描述
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

执行账户 A 任务
备注

要运行以下命令,您的 IAM 用户应具有 iot:CreateTopicRule 使用规则的 Amazon Resource Name (ARN) 作为资源的权限,并且具有 iam:PassRole 操作使用资源作为角色的 ARN 的权限。

  1. 使用账户 A 的 IAM 用户配置 Amazon CLI

  2. 创建信任 Amazon IoT 规则引擎的 IAM 角色,并附加允许访问账户 B 的 Amazon SQS 队列的策略。请参阅授予 Amazon 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 授予 Amazon 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 } } ] }

    有关如何在规则中定义 Amazon SQS 操作的更多信息,请参阅 Amazon IoT Amazon IoT 规则操作-Amazon SQS。

执行账户 B 任务
  1. 使用账户 B 的 IAM 用户配置 Amazon CLI

  2. 要向账户 A 授予 Amazon SQS 队列资源的权限,请运行 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 主题。

Amazon Web Services 账户 账户名称 描述
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 用户配置 Amazon CLI

  2. 创建信任 Amazon IoT 规则引擎的 IAM 角色,并附加允许访问账户 B 的 Amazon SNS 主题的策略。有关命令和策略文档的示例,请参阅授 Amazon 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 则授予向 Amazon SNS 主题发送消息的 Amazon IoT 权限。

    { "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" } } ] }

    有关如何在规则中定义 Amazon SNS 操作的更多信息,请参阅 Amazon IoT Amazon IoT 规则操作-Amazon SNS

执行账户 B 任务
  1. 使用账户 B 的 IAM 用户配置 Amazon CLI

  2. 要向账户 A 授予 Amazon SNS 主题资源的权限,请运行 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 存储桶。

Amazon Web Services 账户 账户名称 描述
1111-1111-1111 账户 A 规则操作:s3:PutObject
2222-2222-2222 账户 B Amazon S3 存储桶 ARN:arn:aws:s3:::ExampleBucket
执行账户 A 任务
备注

要运行以下命令,您的 IAM 用户应具有 iot:CreateTopicRule 的权限,能够将规则 ARN 作为资源,并具有 iam:PassRole 操作的权限,将资源作为角色 ARN。

  1. 使用账户 A 的 IAM 用户配置 Amazon CLI

  2. 创建信任 Amazon IoT 规则引擎的 IAM 角色并附加允许访问账户 B 的 Amazon S3 存储桶的策略。有关命令和策略文档的示例,请参阅授 Amazon 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 授予 Amazon IoT 将消息写入 Amazon S3 存储桶的权限。

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

    有关如何在规则中定义 Amazon S3 操作的更多信息,请参阅 Amazon IoT Amazon IoT 规则操作-Amazon S3

执行账户 B 任务
  1. 使用账户 B 的 IAM 用户配置 Amazon 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:::ExampleBucket/*" } ] }

    有关更多信息,请参阅存储桶策略示例

  3. 要将存储桶策略附加到指定的存储桶,请运行put-bucket-policy 命令

    aws s3api put-bucket-policy --bucket ExampleBucket --policy file://./my-bucket-policy.json
  4. 要跨账户访问工作,请确保您的阻止所有公有访问设置正确。有关更多信息,请参阅 Amazon S3 安全性最佳实践

的跨账户设置 Amazon Lambda

场景:账户 A 调用账户 B 的 Amazon Lambda 函数,传入 MQTT 消息。

Amazon Web Services 账户 账户名称 描述
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 用户配置 Amazon 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 角色授予将数据传递给 Lambda 函数的 Amazon IoT 权限。

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

    有关如何在规则中定义 Amazon Lambda 操作的更多信息,请阅读 Amazon IoT Amazon IoT 规则操作-Lambda

执行账户 B 任务
  1. 使用账户 B 的 IAM 用户配置 Amazon CLI

  2. 运行 Lambda 的添加权限命令以授予 Amazon IoT 规则激活 Lambda 函数的权限。要运行以下命令,您的 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

    此字段授予 Amazon IoT (由iot.amazonaws.com)调用 Lambda 函数的权限。

    --source-arn

    此字段确认仅 Amazon IoT 中的 arn:aws:iot:region:1111-1111-1111:rule/example-rule 触发此 Lambda 函数,并且相同或不同账户中的任何其它规则都不能激活此 Lambda 函数。

    --source-account

    此字段确认仅代表 Amazon IoT 账户激活此 Lambda 函数。1111-1111-1111

    注意事项

    如果您看到一条错误消息在您的 Amazon Lambda 函数的控制台中 Configuration(配置)下显示:“The rule could not be found”(找不到规则),请忽略错误消息并继续测试连接。