

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

# 使用 AWS IoT 規則存取跨帳戶資源
<a name="accessing-cross-account-resources-using-rules"></a>

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

跨帳戶規則可使用[資源型許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_controlling.html#TypesPermissions)，在目的地資源上進行配至。因此，只有支援資源型許可的目的地才能使用 AWS IoT 規則啟用跨帳戶存取。支援的目的地包括 Amazon SQS、Amazon SNS、Amazon S3 和 AWS Lambda。

**注意**  
對於支援的目的地，除了 Amazon SQS 之外，您必須在與其他服務資源 AWS 區域 相同的 中定義規則，以便規則動作可以與該資源互動。如需 AWS IoT 規則動作的詳細資訊，請參閱[AWS IoT 規則動作](iot-rule-actions.md)。如需規則 SQS 動作的詳細資訊，請參閱 [SQS](sqs-rule-action.md)。

## 先決條件
<a name="cross-account-prerequisites"></a>
+ 熟悉 [AWS IoT 規則](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules.html)
+ 了解 IAM [使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_identity-management.html)、[角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) 和[資源型許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_permissions.html#TypesPermissions)
+ 安裝了 [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)

## Amazon SQS 的跨帳戶設定
<a name="cross-account-sqs"></a>

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


| AWS 帳戶 | 帳戶稱為  | Description | 
| --- | --- | --- | 
| {{1111-1111-1111}} | 帳戶 A | 規則動作：sqs:SendMessage | 
| {{2222-2222-2222}} | 帳戶 B | Amazon SQS 佇列 [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/accessing-cross-account-resources-using-rules.html)  | 

**注意**  
您的目的地 Amazon SQS 佇列不必 AWS 區域 與您的[AWS IoT 規則](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules.html)位於相同的 中。如需規則 SQS 動作的詳細資訊，請參閱 [SQS](sqs-rule-action.md)。

**執行帳戶 A 任務**
**注意**  
如要執行下列命令，您的 IAM 使用者應具有以規則的 Amazon 資源名稱 (ARN) 作為資源的 `iot:CreateTopicRule` 許可，及以資源作為角色之 ARN 的 `iam:PassRole` 動作許可。

1. 使用帳戶 A 的 IAM 使用者[配置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)。

1. 建立信任 AWS IoT 規則引擎的 IAM 角色，並連接允許存取帳戶 B Amazon SQS 佇列的政策。請參閱[授予 AWS IoT 必要存取權](https://docs.aws.amazon.com/iot/latest/developerguide/iot-create-role.html)中的命令和政策文件範例。

1. 如要建立連接至主題的規則，請執行 [create-topic-rule 命令](https://docs.aws.amazon.com/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 授予 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](https://docs.aws.amazon.com/iot/latest/developerguide/sqs-rule-action.html)。

**執行帳戶 B 任務**

1. 使用帳戶 B 的 IAM 使用者[配置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)。

1. 如要將 Amazon SQS 佇列資源的許可授予帳戶 A，請執行 [add-permission 命令](https://docs.aws.amazon.com/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 name="cross-account-sns"></a>

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


| AWS 帳戶 | 帳戶稱為  | Description | 
| --- | --- | --- | 
| {{1111-1111-1111}} | 帳戶 A | 規則動作：sns:Publish | 
| {{2222-2222-2222}} | 帳戶 B | Amazon SNS 主題 ARN：{{arn:aws:sns:region:2222-2222-2222:ExampleTopic}} | 

**執行帳戶 A 任務**
**備註**  
 如要執行下列命令，您的 IAM 使用者應具有以規則 ARN 作為資源的 `iot:CreateTopicRule` 許可，以及資源作為角色 ARN 的 `iam:PassRole` 動作許可。

1. 使用帳戶 A 的 IAM 使用者[配置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)。

1. 建立信任 AWS IoT 規則引擎的 IAM 角色，並連接允許存取帳戶 B 的 Amazon SNS 主題的政策。如需命令和政策文件的範例，請參閱[授予 AWS IoT 必要的存取權](https://docs.aws.amazon.com/iot/latest/developerguide/iot-create-role.html)。

1. 如要建立連接至主題的規則，請執行 [create-topic-rule 命令](https://docs.aws.amazon.com/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 授予 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](https://docs.aws.amazon.com/iot/latest/developerguide/sns-rule-action.html)。

**執行帳戶 B 任務**

1. 使用帳戶 B 的 IAM 使用者[配置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)。

1. 如要將 Amazon SNS 主題資源的許可授予帳戶 A，請執行 [add-permission 命令](https://docs.aws.amazon.com/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 name="cross-account-s3"></a>

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


| AWS 帳戶 | 帳戶稱為  | Description | 
| --- | --- | --- | 
| {{1111-1111-1111}} | 帳戶 A | 規則動作：s3:PutObject | 
| {{2222-2222-2222}} | 帳戶 B | Amazon S3 儲存貯體 ARN：{{arn:aws:s3:::amzn-s3-demo-bucket}} | 

**執行帳戶 A 任務**
**注意**  
如要執行下列命令，您的 IAM 使用者應具有以規則 ARN 作為資源的 `iot:CreateTopicRule` 許可，以及資源作為角色 ARN 的 `iam:PassRole` 動作許可。

1. 使用帳戶 A 的 IAM 使用者[配置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)。

1. 建立信任 AWS IoT 規則引擎並連接允許存取帳戶 B Amazon S3 儲存貯體的政策的 IAM 角色。如需命令和政策文件的範例，請參閱[授予 AWS IoT 必要的存取權](https://docs.aws.amazon.com/iot/latest/developerguide/iot-create-role.html)。

1. 如要建立連接至您目標 S3 儲存貯體的規則，請執行 [create-topic-rule 命令](https://docs.aws.amazon.com/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 授予 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](https://docs.aws.amazon.com/iot/latest/developerguide/s3-rule-action.html)。

**執行帳戶 B 任務**

1. 使用帳戶 B 的 IAM 使用者[配置 AWS CLI](https://docs.aws.amazon.com/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.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-use-case-1)。

1. 如要將儲存貯體政策連接至指定的儲存貯體，請執行 [put-bucket-policy 命令](https://docs.aws.amazon.com/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.aws.amazon.com/AmazonS3/latest/userguide/security-best-practices.html)。

## 的跨帳戶設定 AWS Lambda
<a name="cross-account-lambda"></a>

案例：帳戶 A 叫用帳戶 B 的 AWS Lambda 函數，傳入 MQTT 訊息。


| AWS 帳戶 | 帳戶稱為  | Description | 
| --- | --- | --- | 
| {{1111-1111-1111}} | 帳戶 A | 規則動作：lambda:InvokeFunction | 
| {{2222-2222-2222}} | 帳戶 B | Lambda 函數 ARN：{{ arn:aws:lambda:region:2222-2222-2222:function:example-function}} | 

**執行帳戶 A 任務**
**備註**  
 如要執行下列命令，您的 IAM 使用者應具有以規則 ARN 作為資源的 `iot:CreateTopicRule` 許可，以及資源作為角色 ARN 的 `iam:PassRole` 動作許可。

1. 使用帳戶 A 的 IAM 使用者[配置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)。

1. 執行 [create-topic-rule 命令](https://docs.aws.amazon.com/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 授予 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](https://docs.aws.amazon.com/iot/latest/developerguide/lambda-rule-action.html)。

**執行帳戶 B 任務**

1. 使用帳戶 B 的 IAM 使用者[配置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)。

1. 執行 [Lambda 的 add-permission 命令](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html)，給予 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**

   此欄位會確認 僅代表`1111-1111-1111`帳戶 AWS IoT 啟用此 Lambda 函數。
**備註**  
若您看到來自 AWS Lambda 函數主控台 **Configuration** (組態) 之下的錯誤訊息「找不到規則」，請略過錯誤訊息並繼續測試連線。