LoginSignup
0
0

【AWS】Iot Coreで吸い上げたデータを別アカウントのSQSにルーティングする

Posted at

はじめに

Iot Coreで吸い上げたデータをルールエンジンを使用して別アカウントのSQSにルーティングする方法を説明します。

アーキテクチャ

  1. AWS IoT Core: デバイスからのメッセージを受信し、ルールエンジンで処理。送信元アカウントになる
  2. Amazon SQS: メッセージをキューイングし、異なるアカウントに配信。送信先アカウントになる

実装手順

前提条件

  • AWS アカウントがある (送信元と送信先)
  • AWS CLI の設定が済んでる
  • AWS Iot Coreに対応したIoT デバイスがある

SQS キューの作成

送信先アカウントに Amazon SQS キューを作成します。

aws sqs create-queue --queue-name MyQueue

※SQSのURLを後ほど使うので記録します。

送信元アカウントで Amazon SQS キューリソースにアクセスできるようにする

aws sqs add-permission \
     --queue-url https://sqs.<送信先アカウントのリージョン>.amazonaws.com/<送信先アカウントID>/MyQueue \
     --label IoTSendMessage \
     --aws-account-ids <送信元アカウントID> \
     --actions SendMessage

クロスアカウント用の IAMロールとIAMポリシーを作成する

  1. iot_policy.jsonという以下のファイルを作成する。
{
    "Version": "2012-10-17",
    "Statement": [
        {
			"Effect": "Allow",
			"Principal": {
				"Service": "iot.amazonaws.com"
			},
			"Action": "sts:AssumeRole"
		}
	]
}
  1. 送信元アカウントで以下のコマンドを実行してiot-cross-sqs-allowというIAMロールを作る
aws iam create-role \
     --role-name iot-cross-sqs-allow \
     --assume-role-policy-document file://iot_policy.json
  1. 以下の様なログが出力されればOK
{
    "Role": {
        "Path": "/",
        "RoleName": "iot-cross-sqs-allow",
        "RoleId": "XXXXXXXXXXXXXXXXXXXXX",
        "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/iot-cross-sqs-allow",
        "CreateDate": "2022-09-07T05:05:58+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
				{
					"Effect": "Allow",
					"Principal": {
						"Service": "iot.amazonaws.com"
					},
					"Action": "sts:AssumeRole"
				}
			]
		}
    }
}
  1. allow_send_cross_sqs.json という名前のファイルを作成
{
    "Version": "2012-10-17",
    "Statement": [
		{
			"Effect": "Allow",
			"Action": "sqs:SendMessage",
			"Resource": "arn:aws:sqs:<送信先アカウントのリージョン>:<送信先アカウントID>:iot-data"
		}
	]
}
  1. 2で作ったロールにポリシーをアタッチする
aws iam put-role-policy \
     --role-name iot-cross-sqs-allow \
     --policy-name new-iot-cross-sqs-policy \
     --policy-document file://allow_send_cross_sqs.json

エラーの再送信を許可する AWS IAM ロールとポリシーを作成

  1. 送信元にiot-republish という新しいロールを作成
    ※iot_policy.jsonを再利用します。
aws iam create-role \
     --role-name iot-republish \
     --assume-role-policy-document file://iot_policy.json
  1. 以下の様なログが出力されればOK
{
    "Role": {
        "Path": "/",
        "RoleName": "iot-cross-sqs-allow",
        "RoleId": "XXXXXXXXXXXXXXXXXXXXX",
        "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/iot-cross-sqs-allow",
        "CreateDate": "2022-09-07T05:05:58+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
				{
					"Effect": "Allow",
					"Principal": {
						"Service": "iot.amazonaws.com"
					},
					"Action": "sts:AssumeRole"
				}
			]
		}
    }
}
  1. allow_republish.json という名前のファイルを作成
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "iot:Publish",
        "Resource": "arn:aws:iot:<取り込み用アカウントのリージョン>:<取り込み用アカウントID>:errors/*"
    }
}
  1. ポリシーを iot-republish ロールに追加
aws iam put-role-policy \
     --role-name iot-republish \
     --policy-name iot-republish \
     --policy-document file://allow_republish.json

送信元アカウントでメッセージを評価し、エラーを再送信するIoT ルールを作成

  1. ingestion_rule.jsonを作成
{
"sql": "SELECT * FROM 'data/private'" ,
"description": "Cross-account publishing of messages to SQS.",
"ruleDisabled": false,
"awsIotSqlVersion": "2016-03-23",
"actions": [{
	"sqs": {
		"roleArn": "<iot-cross-sqs-allow ロールのARN>",
		"queueUrl": "https://sqs.<データ用アカウントのリージョン>.amazonaws.com/<データ用アカウントID>/iot-data",
		"useBase64": true
	}
}],
"errorAction": {
    "republish": {
      "roleArn": "<iot-republish ロールのARN>",
      "topic": "error/rules",
      "qos": 0
    }
  }
}
  1. 送信元アカウントに送信先アカウントの SQS にメッセージを送信するための IoT ルールを作成
aws iot create-topic-rule \
     --rule-name "cross_account_sqs_publish" \
     --topic-rule-payload file://ingestion_rule.json

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0