本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用规则访问跨账户资源 AWS IoT
您可以配置跨账户访问 AWS IoT 规则,以便在一个账户的MQTT主题上提取的数据可以路由到另一个账户的 AWS 服务,例如 Amazon 和 SQS Lambda。以下内容说明了如何设置跨账户数据提取 AWS IoT 规则,即从一个账户中的MQTT主题到另一个账户中的目的地。
跨账户规则可以在目标资源上使用基于资源的权限。因此,只有支持基于资源的权限的目标才能启用带 AWS IoT 规则的跨账户访问权限。支持的目的地包括亚马逊SQS、亚马逊SNS、亚马逊 S3 和 AWS Lambda。
注意
对于支持的目的地(Amazon 除外)SQS,您必须将规则定义 AWS 区域 为与其他服务的资源相同,这样规则操作才能与该资源进行交互。有关 AWS IoT 规则操作的更多信息,请参阅AWS IoT 规则操作。有关规则SQS操作的更多信息,请参阅SQS。
先决条件
-
熟悉 AWS IoT 规则
-
安装 AWS CLI
Amazon 的跨账户设置 SQS
场景:账户 A 将MQTT消息中的数据发送到账户 B 的 Amazon SQS 队列。
AWS 账户 | 账户名称 | 描述 |
---|---|---|
|
账户 A | 规则操作:sqs:SendMessage |
|
账户 B | 亚马逊SQS队列
|
注意
您的目标 Amazon SQS 队列不必与您的AWS IoT 规则 AWS 区域相同。有关规则SQS操作的更多信息,请参阅SQS。
执行账户 A 任务
备注
要运行以下命令,您的IAM用户应具有使用规则的 Amazon 资源名称 (ARN) 作为资源的权限,以及使用资源作为角色的iam:PassRole
操作权限ARN。iot:CreateTopicRule
-
AWS CLI使用账户 A 的IAM用户进行@@ 配置。
-
创建一个信任 AWS IoT 规则引擎的IAM角色,并附加允许访问账户 B 的 Amazon SQS 队列的策略。请参阅授予 AWS IoT 所需访问权限中的示例命令和策略文档。
-
要创建附加到主题的规则,请运行该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 SQS 队列的 AWS IoT 权限。{ "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 } } ] }
有关如何在规则中定义亚马逊SQS操作的更多信息,请参阅 AWS IoT AWS IoT 规则操作-Amazon SQS。
执行账户 B 任务
-
AWS CLI使用账户 B 的IAM用户进行@@ 配置。
-
要向账户 A 授予亚马逊SQS队列资源的权限,请运行 add-permission 命令。
aws sqs add-permission --queue-url
https://sqs.region.amazonaws.com/2222-2222-2222/ExampleQueue
--labelSendMessagesToMyQueue
--aws-account-ids1111-1111-1111
--actions SendMessage
Amazon 的跨账户设置 SNS
场景:账户 A 将MQTT消息中的数据发送到账户 B 的 Amazon SNS 主题。
AWS 账户 | 账户名称 | 描述 |
---|---|---|
|
账户 A | 规则操作:sns:Publish |
|
账户 B | 亚马逊SNS主题ARN:
|
执行账户 A 任务
注意
要运行以下命令,您的IAM用户应具有使用规则ARN作为资源的权限,以及以资源为角色iam:PassRole
执行操作的权限ARN。iot:CreateTopicRule
-
AWS CLI使用账户 A 的IAM用户进行@@ 配置。
-
创建一个信任 AWS IoT 规则引擎的IAM角色,并附加允许访问账户 B 的 Amazon SNS 主题的策略。有关命令和策略文档的示例,请参阅授 AWS IoT 予所需访问权限。
-
要创建附加到主题的规则,请运行该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 主题的 AWS 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" } } ] }
有关如何在规则中定义亚马逊SNS操作的更多信息,请参阅 AWS IoT AWS IoT 规则操作-Amazon SNS。
执行账户 B 任务
-
AWS CLI使用账户 B 的IAM用户进行@@ 配置。
-
要向账户 A 授予亚马逊SNS主题资源的权限,请运行 add-permission 命令。
aws sns add-permission --topic-arn
arn:aws:sns:region:2222-2222-2222:ExampleTopic
--labelPublish-Permission
--aws-account-id1111-1111-1111
--action-name Publish
Amazon S3 的跨账户设置
场景:账户 A 将MQTT消息中的数据发送到账户 B 的 Amazon S3 存储桶。
AWS 账户 | 账户名称 | 描述 |
---|---|---|
|
账户 A | 规则操作:s3:PutObject |
|
账户 B | 亚马逊 S3 存储桶ARN:
|
执行账户 A 任务
备注
要运行以下命令,您的IAM用户应具有使用该规则ARN作为资源的权限,以及以资源为角色iam:PassRole
执行操作的权限ARN。iot:CreateTopicRule
-
AWS CLI使用账户 A 的IAM用户进行@@ 配置。
-
创建一个信任 AWS IoT 规则引擎的IAM角色并附加允许访问账户 B 的 Amazon S3 存储桶的策略。有关命令和策略文档的示例,请参阅授 AWS IoT 予所需访问权限。
-
要创建附加到目标 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 S3 存储桶的 AWS IoT 权限。{ "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 操作的更多信息,请参阅 AWS IoT AWS IoT 规则操作-Amazon S3。
执行账户 B 任务
-
AWS CLI使用账户 B 的IAM用户进行@@ 配置。
-
创建信任账户 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:::amzn-s3-demo-bucket/*" } ] }
有关更多信息,请参阅存储桶策略示例。
-
要将存储桶策略附加到指定的存储桶,请运行put-bucket-policy 命令。
aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://./
amzn-s3-demo-bucket-policy.json
-
要跨账户访问工作,请确保您的阻止所有公有访问设置正确。有关更多信息,请参阅 Amazon S3 安全性最佳实践。
的跨账户设置 AWS Lambda
场景:账户 A 调用账户 B 的 AWS Lambda 函数,传入一条MQTT消息。
AWS 账户 | 账户名称 | 描述 |
---|---|---|
|
账户 A | 规则操作:lambda:InvokeFunction |
|
账户 B | Lambda 函数:ARN
|
执行账户 A 任务
注意
要运行以下命令,您的IAM用户应具有使用规则ARN作为资源的权限,以及以资源为角色iam:PassRole
执行操作的权限ARN。iot:CreateTopicRule
-
AWS CLI使用账户 A 的IAM用户进行@@ 配置。
-
运行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 函数的 AWS 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" } } ] }
有关如何在规则中定义 AWS Lambda 操作的更多信息,请阅读 AWS IoT AWS IoT 规则操作-Lambda。
执行账户 B 任务
-
AWS CLI使用账户 B 的IAM用户进行@@ 配置。
-
运行 Lambda 的添加权限命令以授予 AWS IoT 规则激活 Lambda 函数的权限。要运行以下命令,您的IAM用户应具有
lambda:AddPermission
操作权限。aws lambda add-permission --function-name
example-function
--regionus-east-1
--principal iot.amazonaws.com --source-arnarn:aws:iot:region:1111-1111-1111:rule/example-rule
--source-account1111-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 账户激活此 Lambda 函数。
1111-1111-1111
注意
如果您看到一条错误消息在您的 AWS Lambda 函数的控制台中 Configuration(配置)下显示:“The rule could not be found”(找不到规则),请忽略错误消息并继续测试连接。