AWS IoT ルールを使用したクロスアカウントリソースへのアクセス - AWS IoT Core

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS IoT ルールを使用したクロスアカウントリソースへのアクセス

クロスアカウントアクセスの AWS IoT ルールを設定して、あるアカウントの MQTT トピックに取り込まれたデータを別のアカウントの Amazon SQS や Lambda などの AWS サービスにルーティングできます。次に、あるアカウントの MQTT トピックから別のアカウントの宛先へのクロスアカウントデータインジェストの AWS IoT ルールを設定する方法について説明します。

クロスアカウントルールは、宛先リソースのリソースベースのアクセス許可を使用して設定できます。したがって、リソースベースのアクセス許可をサポートする送信先のみが、 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 のタスクを実行する
注記

次のコマンドを実行するには、リソースがルールの Amazon リソースネーム (ARN) である iot:CreateTopicRule へのアクセス許可と、リソースがロールの ARN である iam:PassRole アクションへのアクセス許可が IAM ユーザーに必要です。

  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 によって 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 } } ] }

    AWS IoT ルールで Amazon SQSを定義する方法の詳細については、AWS IoT 「ルールアクション - Amazon SQS」を参照してください。

アカウント B のタスクを実行する
  1. アカウント B の IAM ユーザーを使用して、AWS CLIを設定します。

  2. Amazon SQS キューリソースへのアクセス許可をアカウント A に付与するために、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 のタスクを実行する
メモ

次のコマンドを実行するには、リソースがルールの ARN である iot:CreateTopicRule へのアクセス許可と、リソースがロールの ARN である iam:PassRole アクションへのアクセス許可が IAM ユーザーに必要です。

  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 は 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" } } ] }

    AWS IoT ルールで Amazon SNS アクションを定義する方法の詳細については、AWS IoT 「 ルールアクション - Amazon SNS 」を参照してください。

アカウント B のタスクを実行する
  1. アカウント B の IAM ユーザーを使用して、AWS CLIを設定します。

  2. Amazon SNS トピックリソースに対するアクセス許可をアカウント A に付与するために、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:::ExampleBucket
アカウント A のタスクを実行する
注記

次のコマンドを実行するには、リソースがルールのARN である iot:CreateTopicRule に対するアクセス許可と、リソースがロールの ARN である iam:PassRole アクションに対するアクセス許可が IAM ユーザーに必要です。

  1. アカウント A の IAM ユーザーを使用して、AWS CLIを設定します。

  2. AWS IoT ルールエンジンを信頼し、アカウント B の Amazon S3 バケットへのアクセスを許可するポリシーをアタッチする IAM ロールを作成します。コマンドとポリシードキュメントの例については、「必要なアクセス 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 によって Amazon S3 バケットにメッセージを追加するアクセス許可が AWS IoT に付与されます。

    { "sql": "SELECT * FROM 'iot/test'", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "s3": { "bucketName": "ExampleBucket", "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 のプリンシパルを信頼するバケットポリシーを作成します。

    次のペイロードファイル例では、別のアカウントのプリンシパルを信頼するバケットポリシーを定義します。

    { "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:::ExampleBucket/*" } ] }

    詳しくは、バケットポリシーの例を参照してください。

  3. 指定されたバケットにバケットポリシーをアタッチするには、 put-bucket-policy コマンドを実行します

    aws s3api put-bucket-policy --bucket ExampleBucket --policy file://./my-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 のタスクを実行する
メモ

次のコマンドを実行するには、リソースがルールのARN である iot:CreateTopicRule に対するアクセス許可と、リソースがロールの ARN である iam:PassRole アクションに対するアクセス許可が IAM ユーザーに必要です。

  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 は 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 IoT ルールで AWS Lambda アクションを定義する方法の詳細については、ルールAWS IoT アクション - Lambda を参照してください。

アカウント B のタスクを実行する
  1. アカウント B の IAM ユーザーを使用して、AWS CLIを設定します。

  2. Lambda の add-permission コマンドを実行して、Lambda 関数をアクティブ化するアクセス許可を AWS IoT ルールに付与します。次のコマンドを実行するには、lambda:AddPermission アクションに対するアクセス許可が IAM ユーザーに必要です。

    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"

    オプション:

    --プリンシパル

    このフィールドは、 AWS IoT Lambda 関数を呼び出すアクセス許可を ( で表されるiot.amazonaws.com) に付与します。

    --source-arn

    このフィールドは、 AWS IoT の arn:aws:iot:region:1111-1111-1111:rule/example-rule のみがこのLambda 関数をトリガーし、同じアカウントまたは異なるアカウント内の他のルールはこの Lambda 関数をアクティブ化できないことを確認します。

    --source-account

    このフィールドは、 が1111-1111-1111アカウントに代わってのみこの Lambda 関数を AWS IoT アクティブ化することを確認します。

    メモ

    AWS Lambda 関数のコンソールの [Configuration] (設定) の下に「ルールが見つかりませんでした」というエラーメッセージが表示される場合は、エラーメッセージを無視して、接続のテストに進みます。