パブリッシュ/サブスクライブポリシーの例 - AWS IoT

パブリッシュ/サブスクライブポリシーの例

使用するポリシーは、AWS IoT Core に接続する方法によって決まります。MQTT クライアント、HTTP、または WebSocket を使用して、AWS IoT Core に接続できます。MQTT クライアントを使用して接続すると、X.509 証明書で認証されます。HTTP または WebSocket プロトコルを使用して接続すると、署名バージョン 4 および Amazon Cognito で認証されます。

MQTT クライアントのポリシー

トピック名のワイルドカードを指定するには、デバイスが複数のトピックをパブリッシュし、サブスクライブする際に、ポリシーの resource 属性で * を使用します。次のポリシーでは、デバイスが同じモノ名で始まるすべてのサブトピックにパブリッシュできるようにします。

Registered devices (5)

AWS IoT Core レジストリでモノとして登録されているデバイスの場合、次のポリシーにより、モノの名前に一致するクライアント ID を使用して AWS IoT Core に接続し、モノの名前のプレフィックスが付いている任意のトピックに発行するアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}", ] }, { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.ThingName}/*" ] } ] }
Unregistered devices (5)

AWS IoT Core レジストリでモノとして登録されていないデバイスの場合、次のポリシーにより、クライアント ID client1client2、または client3 を使用して AWS IoT Core に接続し、クライアント ID のプレフィックスが付いている任意のトピックに発行するアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/client1", "arn:aws:iot:us-east-1:123456789012:client/client2", "arn:aws:iot:us-east-1:123456789012:client/client3" ] } { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}/*" ] } ] }

ワイルドカード * は、トピックフィルターの最後に使用することもできます。ワイルドカード文字を使用すると、意図しない権限を付与することにつながる可能性があるため、慎重に検討した後でのみ使用してください。これが役立つ可能性のある 1 つの例として、デバイスがさまざまなトピックを持つメッセージにサブスクライブする必要がある状況が考えられます(たとえば、デバイスが複数の場所にある温度センサーからの報告にサブスクライブする必要がある場合です)。

Registered devices (6)

AWS IoT Core レジストリでモノとして登録されているデバイスの場合、次のポリシーにより、デバイスのモノの名前をクライアント ID として使用して AWS IoT Core に接続し、モノの名前のプレフィックスが付き、それに room、さらに任意の文字列が続いているトピックにサブスクライブするアクセス許可が付与されます。(これらのトピックは、thing1/room1thing1/room2、などであることが想定されます)。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/${iot:Connection.Thing.ThingName}/room*" ] }, { "Effect": "Allow", "Action": [ "iot:Receive" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/${iot:Connection.Thing.ThingName}/room*" ] } ] }
Unregistered devices (6)

AWS IoT Core レジストリでモノとして登録されていないデバイスの場合、次のポリシーにより、クライアント ID client1client2client3 を使用して AWS IoT Core に接続し、クライアント ID のプレフィックスが付き、それに room、さらに任意の文字列が続いているトピックにサブスクライブするアクセス許可が付与されます。(これらのトピックは、client1/room1client1/room2、などであることが想定されます)。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/client1", "arn:aws:iot:us-east-1:123456789012:client/client2", "arn:aws:iot:us-east-1:123456789012:client/client3" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/${iot:ClientId}/room*" ] }, { "Effect": "Allow", "Action": [ "iot:Receive" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}/room*" ] } ] }

MQTT クライアントの AWS IoT Core ポリシーでトピックフィルタを指定すると、MQTT ワイルドカード文字 (+) および (#) はリテラル文字列として扱われます。このように使用すると、予期しない動作が発生する可能性があります。

Registered devices (4)

AWS IoT Core レジストリでモノとして登録されているデバイスの場合、次のポリシーにより、モノの名前に一致するクライアント ID で AWS IoT Core に接続し、トピックフィルタ some/+/topic のみにサブスクライブするアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/some/+/topic" ] } ] }
Unregistered devices (4)

AWS IoT Core レジストリでモノとして登録されていないデバイスの場合、次のポリシーにより、クライアント ID client1 で AWS IoT Core に接続し、トピックフィルタ some/+/topic のみにサブスクライブするアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/client1" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/some/+/topic" ] } ] }
注記

ポリシー内では、MQTT ワイルドカード文字 + は、ワイルドカードではなく、リテラルとして処理されます。パターン (some/+/topic) に一致するトピックフィルターに登録しようとすると失敗し、クライアントは切断されます。

Registered devices (7)

AWS IoT Core レジストリでモノとして登録されているデバイスの場合、次のポリシーにより、デバイスのモノの名前をクライアント ID として使用して AWS IoT Core に接続し、トピック my/topic および my/othertopic にサブスクライブするアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic", "arn:aws:iot:us-east-1:123456789012:topicfilter/my/othertopic" ] } ] }
Unregistered devices (7)

AWS IoT Core レジストリでモノとして登録されていないデバイスの場合、次のポリシーにより、クライアント ID client1 を使用して AWS IoT Core に接続し、トピック my/topic および my/othertopic にサブスクライブするアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/client1" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic", "arn:aws:iot:us-east-1:123456789012:topicfilter/my/othertopic" ] } ] }
Registered devices (8)

AWS IoT Core レジストリでモノとして登録されているデバイスの場合、次のポリシーにより、デバイスのモノの名前をクライアント ID として使用して AWS IoT Core に接続し、そのモノの名前/クライアント ID に一意なトピックにサブスクライブするアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}" ] }, { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:Thing.ThingName}" ] } ] }
Unregistered devices (8)

AWS IoT Core レジストリでモノとして登録されていないデバイスの場合、次のポリシーにより、クライアント ID client1 を使用して AWS IoT Core に接続し、そのクライアント ID に一意のトピックにサブスクライブするアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/client1" ] }, { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/my/topic/${iot:ClientId}" ] } ] }
Registered devices (9)

AWS IoT Core レジストリでモノとして登録されているデバイスの場合、次のポリシーにより、デバイスのモノの名前をクライアント ID として使用して AWS IoT Core に接続し、そのモノの名前またはクライアントのプレフィックスが付いた任意のトピック (bar で終わる 1 つのトピックを除く)に接続するアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}" ] }, { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/${iot:Thing.ThingName}/*" ] }, { "Effect": "Deny", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/${iot:Thing.ThingName}/bar" ] } ] }
Unregistered devices (9)

AWS IoT Core レジストリでモノとして登録されていないデバイスの場合、次のポリシーにより、クライアント ID client1 および client1 を使用して AWS IoT Core に接続し、接続に使用されるクライアント ID のプレフィックスが付いた任意のトピック (bar で終わる 1 つのトピックを除く)に接続するアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/client1", "arn:aws:iot:us-east-1:123456789012:client/client2" ] }, { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}/*" ] }, { "Effect": "Deny", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/${iot:ClientId}/bar" ] } ] }
Registered devices (10)

AWS IoT Core レジストリでモノとして登録されているデバイスの場合、次のポリシーにより、デバイスのモノの名前をクライアント ID として使用して AWS IoT Core に接続するアクセス許可が付与されます。デバイスはトピック my/topic にサブスクライブすることはできますが、<thing-name> /bar に発行することはできません。ここで <thing-name> は AWS IoT Core に接続している IoT のモノの名前です。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic" ] }, { "Effect": "Deny", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/${iot:Thing.ThingName}/bar" ] } ] }
Unregistered devices (10)

AWS IoT Core レジストリでモノとして登録されていないデバイスの場合、次のポリシーにより、クライアント ID client1 を使用して AWS IoT Core に接続し、トピック my/topic にサブスクライブするアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/client1" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic" ] } ] }

モノのポリシー変数は、証明書または認証された Amazon Cognito ID がモノにアタッチされているときにも置き換えられます。次のポリシーは、クライアント ID client1 で AWS IoT Core に接続し、トピック iotmonitor/provisioning/987654321098 に発行および受信するためのアクセス許可を付与します。また、証明書所有者がこのトピックにサブスクライブできるようにします。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/client1" ] }, { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Receive" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/iotmonitor/provisioning/987654321098" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/iotmonitor/provisioning/987654321098" ] } ] }

HTTP および WebSocket クライアントのポリシー

以下のオペレーションに対して、AWS IoT Core は、AttachPolicy API により Amazon Cognito ID にアタッチされた AWS IoT Core ポリシーを使用して、認証済みの ID の Amazon Cognito ID ID プールにアタッチされたアクセス権限の適用範囲を制限します。つまり、Amazon Cognito ID には、プールにアタッチされた IAM ロールポリシーからのアクセス許可と、AWS IoT Core AttachPolicy API により Amazon Cognito ID にアタッチされた AWS IoT Core ポリシーが必要です。

  • iot:Connect

  • iot:Publish

  • iot:Subscribe

  • iot:Receive

  • iot:GetThingShadow

  • iot:UpdateThingShadow

  • iot:DeleteThingShadow

注記

他の AWS IoT Core オペレーションまたは非認証の ID に対して、AWS IoT Core は、Amazon Cognito ID プールのロールにアタッチされたアクセス権限の適用範囲を制限します。認証済みの ID と非認証の ID の両方に対して、これは、Amazon Cognito プールのロールにアタッチすることをお勧めする最も緩いポリシーです。

HTTP

非認証の Amazon Cognito ID が Amazon Cognito ID に固有のトピックで HTTP を介してメッセージをパブリッシュできるようにするには、Amazon Cognito ID プールロールに以下のポリシーをアタッチします。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Publish", ], "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${cognito-identity.amazonaws.com:sub}"] } ] }

認証されたユーザーを許可するには、AWS IoT Core AttachPolicy API を使い、前述のポリシーを Amazon Cognito ID プールロールおよび Amazon Cognito ID に添付します。

注記

Amazon Cognito を許可するときに、AWS IoT Core は両方のポリシーを考慮し、指定された最低限の特権を付与します。アクションは、両方のポリシーで要求されたアクションが許可されている場合にのみ許可されます。いずれかのポリシーでアクションが許可されていない場合、そのアクションは許可されません。

MQTT

非認証の Amazon Cognito ID がアカウントで Amazon Cognito ID に固有のトピックで WebSocket を介して MQTT メッセージをパブリッシュできるようにするには、Amazon Cognito ID プールロールに以下のポリシーをアタッチします。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Publish", ], "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/${cognito-identity.amazonaws.com:sub}"] }, { "Effect": "Allow", "Action": [ "iot:Connect", ], "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${cognito-identity.amazonaws.com:sub}"] } ] }

認証されたユーザーを許可するには、AWS IoT Core AttachPolicy API を使い、前述のポリシーを Amazon Cognito ID プールロールおよび Amazon Cognito ID に添付します。

注記

Amazon Cognito ID を許可するときに、AWS IoT Core はこれら両方を考慮し、指定された最低限の特権を付与します。アクションは、両方のポリシーで要求されたアクションが許可されている場合にのみ許可されます。いずれかのポリシーでアクションが許可されていない場合、そのアクションは許可されません。

受信ポリシーの例

Registered devices (11)

AWS IoT Core レジストリで登録されているデバイスの場合、次のポリシーにより、モノの名前に一致するクライアント ID を使用して AWS IoT Core に接続し、my/topic トピックでメッセージへのサブスクライブと受信を行うアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic" ] }, { "Effect": "Allow", "Action": [ "iot:Receive" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/my/topic" ] } ] }
Unregistered devices (11)

AWS IoT Core レジストリで登録されていないデバイスの場合、次のポリシーにより、クライアント ID client1 を使用して AWS IoT Core に接続し、1 つのトピックでメッセージへのサブスクライブと受信を行うアクセス許可が付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": ["arn:aws:iot:us-east-1:123456789012:client/client1"] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topicfilter/my/topic" ] }, { "Effect": "Allow", "Action": [ "iot:Receive" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/my/topic" ] } ] }