

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

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

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

跨账户规则可以在目标资源上使用[基于资源的权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_controlling.html#TypesPermissions)。因此，只有支持基于资源的权限的目标才能启用带 Amazon IoT 规则的跨账户访问权限。支持的目的地包括 Amazon SQS、Amazon SNS、Amazon S3 和 Amazon Lambda。

**注意**  
对于支持的目标（Amazon SQS 除外），您必须将规则定义 Amazon Web Services 区域 为与其他服务的资源相同，这样规则操作才能与该资源交互。有关 Amazon IoT 规则操作的更多信息，请参阅[Amazon IoT 规则操作](iot-rule-actions.md)。有关规则的 SQS 操作的更多信息，请参阅[SQS](sqs-rule-action.md)。

## 先决条件

+ 熟悉 [Amazon IoT 规则](https://docs.amazonaws.cn/iot/latest/developerguide/iot-rules.html)
+ 了解 IAM [用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction_identity-management.html)、[角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)和[基于资源的权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_permissions.html#TypesPermissions)
+ 安装 [Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/cli-chap-install.html)

## Amazon SQS 的跨账户设置


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


| Amazon Web Services 账户 | 账户名称  | 说明 | 
| --- | --- | --- | 
| 1111-1111-1111 | 账户 A | 规则操作：sqs:SendMessage | 
| 2222-2222-2222 | 账户 B | Amazon SQS 队列 [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/iot/latest/developerguide/accessing-cross-account-resources-using-rules.html)  | 

**注意**  
[您的目标 Amazon SQS 队列不必与您的Amazon IoT 规则 Amazon Web Services 区域 相同。](https://docs.amazonaws.cn/iot/latest/developerguide/iot-rules.html)有关规则的 SQS 操作的更多信息，请参阅[SQS](sqs-rule-action.md)。

**执行账户 A 任务**
**备注**  
要运行以下命令，您的 IAM 用户应具有 `iot:CreateTopicRule` 使用规则的 Amazon 资源名称（ARN）作为资源的权限，并且具有 `iam:PassRole` 操作使用资源作为角色的 ARN 的权限。

1. 使用账户 A 的 IAM 用户[配置 Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-quickstart.html)。

1. 创建信任 Amazon IoT 规则引擎的 IAM 角色，并附加允许访问账户 B 的 Amazon SQS 队列的策略。请参阅[授予 Amazon IoT 所需访问权限](https://docs.amazonaws.cn/iot/latest/developerguide/iot-create-role.html)中的示例命令和策略文档。

1. 要创建附加到主题的规则，请运行该[create-topic-rule 命令](https://docs.amazonaws.cn/cli/latest/reference/iot/create-topic-rule.html)。

   ```
   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。](https://docs.amazonaws.cn/iot/latest/developerguide/sqs-rule-action.html)

**执行账户 B 任务**

1. 使用账户 B 的 IAM 用户[配置 Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-quickstart.html)。

1. 要向账户 A 授予 Amazon SQS 队列资源的权限，请运行 [add-permission 命令](https://docs.amazonaws.cn/cli/latest/reference/sqs/add-permission.html)。

   ```
   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](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-quickstart.html)。

1. 创建信任 Amazon IoT 规则引擎的 IAM 角色，并附加允许访问账户 B 的 Amazon SNS 主题的策略。有关命令和策略文档的示例，请参阅[授 Amazon IoT 予所需访问权限](https://docs.amazonaws.cn/iot/latest/developerguide/iot-create-role.html)。

1. 要创建附加到主题的规则，请运行该[create-topic-rule 命令](https://docs.amazonaws.cn/cli/latest/reference/iot/create-topic-rule.html)。

   ```
   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 SNS 操作的更多信息，请参阅 Amazon IoT [Amazon IoT 规则操作-Amazon SNS](https://docs.amazonaws.cn/iot/latest/developerguide/sns-rule-action.html)。

**执行账户 B 任务**

1. 使用账户 B 的 IAM 用户[配置 Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-quickstart.html)。

1. 要向账户 A 授予 Amazon SNS 主题资源的权限，请运行 [add-permission 命令](https://docs.amazonaws.cn/cli/latest/reference/sns/add-permission.html)。

   ```
   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](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-quickstart.html)。

1. 创建信任 Amazon IoT 规则引擎的 IAM 角色并附加允许访问账户 B 的 Amazon S3 存储桶的策略。有关命令和策略文档的示例，请参阅[授 Amazon IoT 予所需访问权限](https://docs.amazonaws.cn/iot/latest/developerguide/iot-create-role.html)。

1. 要创建附加到目标 S3 存储桶的规则，请运行[create-topic-rule 命令](https://docs.amazonaws.cn/cli/latest/reference/iot/create-topic-rule.html)。

   ```
   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 S3 操作的更多信息，请参阅 Amazon IoT [Amazon IoT 规则操作-Amazon S3](https://docs.amazonaws.cn/iot/latest/developerguide/s3-rule-action.html)。

**执行账户 B 任务**

1. 使用账户 B 的 IAM 用户[配置 Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-quickstart.html)。

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

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

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

   有关更多信息，请参阅[存储桶策略示例](https://docs.amazonaws.cn/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-use-case-1)。

1. 要将存储桶策略附加到指定的存储桶，请运行[put-bucket-policy 命令](https://docs.amazonaws.cn/cli/latest/reference/s3api/put-bucket-policy.html)。

   ```
   aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://./amzn-s3-demo-bucket-policy.json
   ```

1. 要跨账户访问工作，请确保您的**阻止所有公有访问**设置正确。有关更多信息，请参阅 [Amazon S3 安全性最佳实践](https://docs.amazonaws.cn/AmazonS3/latest/userguide/security-best-practices.html)。

## 的跨账户设置 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](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-quickstart.html)。

1. 运行[create-topic-rule 命令](https://docs.amazonaws.cn/cli/latest/reference/iot/create-topic-rule.html)创建规则，定义对账户 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 Lambda 操作的更多信息，请阅读 Amazon IoT [Amazon IoT 规则操作-Lambda](https://docs.amazonaws.cn/iot/latest/developerguide/lambda-rule-action.html)。

**执行账户 B 任务**

1. 使用账户 B 的 IAM 用户[配置 Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/cli-configure-quickstart.html)。

1. 运行 [Lambda 的添加权限命令](https://docs.amazonaws.cn/cli/latest/reference/lambda/add-permission.html)以授予 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”（找不到规则），请忽略错误消息并继续测试连接。