使用 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 IoT 规则位于相同的 AWS 区域。有关规则的 SQS 操作的更多信息,请参阅 SQS

执行账户 A 任务
注意

要运行以下命令,您的 IAM 用户应具有 iot:CreateTopicRule 使用规则的 Amazon 资源名称(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. 要向账户 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 主题。

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. 要向账户 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 存储桶。

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 规则引擎的 IAM 角色,然后附加允许访问账户 B 的 Amazon S3 存储桶的策略。有关命令和策略文档的示例,请参阅授予 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 的主体的存储桶策略。

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

    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 安全性最佳实践

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 命令,以向 AWS 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

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

    --source-arn

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

    --source-account

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

    备注

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