使用 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

注意

您的目标 Amazon SQS 队列不必与您的 Amazon IoT 规则位于相同的 Amazon Web Services 区域。有关规则的 SQS 操作的更多信息,请参阅 SQS

执行账户 A 任务
注意

要运行以下命令,您的 IAM 用户应具有 iot:CreateTopicRule 使用规则的 Amazon 资源名称(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 IoT 规则中定义 Amazon SQS 操作的更多信息,请参阅 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 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" } } ] }

    有关如何在 Amazon IoT 规则中定义 Amazon SNS 操作的更多信息,请参阅 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:::amzn-s3-demo-bucket
执行账户 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": "amzn-s3-demo-bucket", "key": "${topic()}/${timestamp()}", "roleArn": "arn:aws:iam::1111-1111-1111:role/my-iot-role" } } ] }

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

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

  2. 创建信任账户 A 的主体的存储桶策略。

    下面的示例有效载荷文件定义信任另一账户主体的存储桶策略。

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Sid": "AddCannedAcl", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333: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 安全性最佳实践

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 授予 Amazon 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" } } ] }

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

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

  2. 运行 Lambda 的 add-permission 命令,以向 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 仅代表 1111-1111-1111 账户激活此 Lambda 函数。

    备注

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