IAM を使用した Amazon Kinesis Data Streams リソースへのアクセスの制御 - Amazon Kinesis Data Streams

IAM を使用した Amazon Kinesis Data Streams リソースへのアクセスの制御

AWS Identity and Access Management (IAM) は、以下の実行を可能にします。

  • AWS アカウントでユーザーとグループを作成する

  • お客様の AWS アカウントでユーザーごとに固有のセキュリティ認証情報を割り当てる

  • AWS のリソースを使用してタスクを実行するために各ユーザーのアクセス権限を制御する

  • 別の AWS アカウントのユーザーがお客様の AWS のリソースを共有できるようにする

  • AWS アカウントにロールを作成し、それを行えるユーザーまたはサービスを定義する

  • 既存のエンタープライズ ID を使用して、AWS リソースを用いてタスクを実行するための許可を付与する

Kinesis Data Streams と組み合わせて IAM を使用すると、組織のユーザーが特定の Kinesis Data Streams API アクションを使用してタスクを実行できるかどうか、また、特定のAWS リソースを使用できるかどうかを制御できます。

Kinesis Client Library (KCL) を使用してアプリケーションを開発する場合、ポリシーに Amazon DynamoDB と Amazon CloudWatch への許可を含める必要があります。KCL は DynamoDB を使用してアプリケーションの状態情報を追跡し、CloudWatch を使用してユーザーに代わって KCL メトリクスを CloudWatch に送信します。KCL の詳細については、KCL 1.x コンシューマーを開発するを参照してください。

IAM の詳細については、以下を参照してください。

IAM と Amazon DynamoDB の詳細については、Amazon DynamoDB デベロッパーガイドIAM を使用した Amazon DynamoDB リソースへのアクセスのコントロールを参照してください。

IAM と Amazon CloudWatch の詳細については、Amazon CloudWatch ユーザーガイドAWS アカウントへのユーザーアクセスのコントロールを参照してください。

ポリシー構文

IAM ポリシーは、1 つ、または複数のステートメントで構成される JSON ドキュメントです。各ステートメントは次のように構成されます。

{ "Statement":[{ "Effect":"effect", "Action":"action", "Resource":"arn", "Condition":{ "condition":{ "key":"value" } } } ] }

ステートメントはさまざまなエレメントで構成されています。

  • [Effect]: effect は、Allow または Deny にすることができます。デフォルトでは、IAM ユーザーはリソースおよび API アクションを使用するアクセス許可がないため、リクエストはすべて拒否されます。明示的な許可はデフォルトに優先します。明示的な拒否はすべての許可に優先します。

  • [Action]: action はアクセス許可を付与または拒否する対象とする、特定の API アクションです。

  • [リソース]: アクションによって影響を及ぼされるリソースです。ステートメント内でリソースを指定するには、Amazonリソースネーム(ARN)を使用する必要があります。

  • Condition: condition はオプションです。これらは、ポリシーがいつ有効になるかを制御するために使用できます。

IAM のポリシーを作成および管理するときは、IAM Policy GeneratorIAM Policy Simulator を使用することもできます。

Kinesis Data Streams のアクション

IAM ポリシーステートメントで、IAM をサポートするすべてのサービスからの任意の API アクションを指定できます。Kinesis Data Streams の場合、API アクションの名前とともに次のプレフィックスを使用します: kinesis:。例えば、kinesis:CreateStreamkinesis:ListStreams、および kinesis:DescribeStreamSummary のようになります。

単一のステートメントで複数のアクションを指定するには、次のようにカンマで区切ります。

"Action": ["kinesis:action1", "kinesis:action2"]

ワイルドカードを使用して複数のアクションを指定することもできます。たとえば、Getという単語で始まる名前のすべてのアクションは、以下のように指定できます。

"Action": "kinesis:Get*"

すべてのKinesis Data Streams オペレーションを指定するには、次のように * ワイルドカードを使用します。

"Action": "kinesis:*"

Kinesis Data Streams API アクションの一覧については、Amazon Kinesis API リファレンス を参照してください。

Kinesis Data Streams の Amazon リソースネーム (ARN)

各 IAM ポリシーステートメントは、ARN を使用して指定されたリソースに適用されます。

Kinesis data streams には、以下の ARN リソースフォーマットを使用します。

arn:aws:kinesis:region:account-id:stream/stream-name

例:

"Resource": arn:aws:kinesis:*:111122223333:stream/my-stream

Kinesis Data Streams のポリシーの例

次のポリシー例は、Kinesis Data Streams へのユーザーアクセスの制御方法について説明しています。

Example 1: Allow users to get data from a stream

このポリシーは、ユーザーまたはグループが、指定されたストリームで DescribeStreamSummaryGetShardIterator、または GetRecords 操作を実行し、任意のストリームで ListStreams を実行できるようにします。このポリシーは、特定のストリームからデータを取得できるユーザーに適用できます。

JSON
JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kinesis:Get*", "kinesis:DescribeStreamSummary" ], "Resource": [ "arn:aws:kinesis:us-east-1:111122223333:stream/stream1" ] }, { "Effect": "Allow", "Action": [ "kinesis:ListStreams" ], "Resource": [ "*" ] } ] }
Example 2: Allow users to add data to any stream in the account

このポリシーは、ユーザーまたはグループが、アカウント内の任意のストリームで PutRecord 操作を使用できるようにします。このポリシーは、アカウント内のすべてのストリームにデータレコードを追加できるユーザーに適用できます。

JSON
JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kinesis:PutRecord" ], "Resource": [ "arn:aws:kinesis:us-east-1:111122223333:stream/*" ] } ] }
Example 3: Allow any Kinesis Data Streams action on a specific stream

このポリシーでは、ユーザーまたはグループが、指定したストリームに対して任意の Kinesis Data Streams オペレーションを実行できます。このポリシーは、特定のストリームに対して管理的な制御を行えるユーザーに適用できます。

JSON
JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kinesis:*", "Resource": [ "arn:aws:kinesis:us-east-1:111122223333:stream/stream1" ] } ] }
Example 4: Allow any Kinesis Data Streams action on any stream

このポリシーでは、ユーザーまたはグループが、アカウントの任意のストリームに対して任意の Kinesis Data Streams オペレーションを実行できます。このポリシーはすべてのストリームへの完全なアクセス権を付与するため、管理者のみに制限する必要があります。

JSON
JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kinesis:*", "Resource": [ "arn:aws:kinesis:*:111122223333:stream/*" ] } ] }

別のアカウントとのデータストリームを共有する

注記

Kinesis Producer Library は現在、データストリームへの書き込み時にストリーム ARN の指定をサポートしていません。クロスアカウントデータストリームに書き込む場合は、AWS SDK を使用します。

リソースベースのポリシーをデータストリームにアタッチして、別のアカウント、IAM ユーザー、または IAM ロールへのアクセス権を付与します。リソースベースのポリシーは、データストリームなどのリソースにアタッチする JSON ポリシードキュメントです。これらのポリシーでは、そのリソースに対して特定のアクションを実行する指定されたプリンシパルアクセス許可を付与し、このアクセス許可が適用される条件を定義します。ポリシーには複数のステートメントを含めることができます。リソースベースのポリシーで、[specify a principal] (プリンシパルを指定する) 必要があります。プリンシパルには、アカウント、ユーザー、ロール、フェデレーティッドユーザー、または AWS のサービスを含めることができます。ポリシーは、Kinesis Data Streams コンソール、API、SDK で設定できます。

拡張ファンアウトなどの登録済みコンシューマーへのアクセスを共有するには、データストリーム ARN とコンシューマー ARN の両方でポリシーが必要であることに注意してください。

クロスアカウントアクセスを有効にする

クロスアカウントアクセスを有効にするには、全体のアカウント、または別のアカウントの IAM エンティティを、リソースベースのポリシーのプリンシパルとして指定します。リソースベースのポリシーにクロスアカウントのプリンシパルを追加しても、信頼関係は半分しか確立されない点に注意してください。プリンシパルおよびリソースが別の AWS アカウントである場合は、アイデンティティベースのポリシーを使用して、リソースへのアクセス権をプリンシパルに付与する必要があります。ただし、リソースベースのポリシーで、同じアカウントのプリンシパルへのアクセス権が付与されている場合は、アイデンティティベースのポリシーをさらに付与する必要はありません。

クロスアカウントアクセスでリソースベースのポリシーを使用する方法の詳細については、「IAM でのクロスアカウントのリソースへのアクセス」を参照してください。

データストリームの管理者は AWS Identity and Access Management ポリシーを使用して、誰が何にアクセスできるかを指定できます。つまり、どのプリンシパルがどのリソースに対してどのような条件下でアクションを実行できるかということです。JSON ポリシーの Action 要素にはポリシー内のアクセスを許可または拒否するために使用できるアクションが記述されます。ポリシーアクションの名前は通常、関連する AWS API オペレーションと同じです。

共有可能な Kinesis Data Streams のアクション:

アクション アクセスのレベル
DescribeStreamConsumer コンシューマー
DescribeStreamSummary データストリーム
GetRecords データストリーム
GetShardIterator データストリーム
ListShards データストリーム
PutRecord データストリーム
PutRecords データストリーム
SubscribeToShard コンシューマー

リソースベースのポリシーを使用して、データストリームまたは登録済みコンシューマーにクロスアカウントアクセスを許可する例を以下に示します。

クロスアカウントのアクションを実行するには、データストリームにアクセスするためのストリーム ARN と登録済みコンシューマーにアクセスするためのコンシューマー ARN を指定する必要があります。

Kinesis Data Streams のリソースベースのポリシーの例

登録済みコンシューマーの共有には、必要なアクションを実行するために、データストリームポリシーとコンシューマーポリシーの両方が必要になります。

注記

次に示すのは、Principal の有効な値の例です。

  • {"AWS": "123456789012"}

  • IAM ユーザー – {"AWS": "arn:aws:iam::123456789012:user/user-name"}

  • IAM ロール – {"AWS":["arn:aws:iam::123456789012:role/role-name"]}

  • 複数のプリンシパル (アカウント、ユーザー、ロールの組み合わせが可能) — {"AWS":["123456789012", "123456789013", "arn:aws:iam::123456789012:user/user-name"]}

Example 1: Write access to the data stream
JSON
JSON
{ "Version":"2012-10-17", "Id": "__default_write_policy_ID", "Statement": [ { "Sid": "writestatement", "Effect": "Allow", "Principal": { "AWS": "Account12345" }, "Action": [ "kinesis:DescribeStreamSummary", "kinesis:ListShards", "kinesis:PutRecord", "kinesis:PutRecords" ], "Resource": "arn:aws:kinesis:us-east-2:123456789012:stream/datastreamABC" } ] }
Example 2: Read access to the data stream
JSON
JSON
{ "Version":"2012-10-17", "Id": "__default_sharedthroughput_read_policy_ID", "Statement": [ { "Sid": "sharedthroughputreadstatement", "Effect": "Allow", "Principal": { "AWS": "Account12345" }, "Action": [ "kinesis:DescribeStreamSummary", "kinesis:ListShards", "kinesis:GetRecords", "kinesis:GetShardIterator" ], "Resource": "arn:aws:kinesis:us-east-2:123456789012:stream/datastreamABC" } ] }
Example 3: Share enhanced fan-out read access to a registered consumer

データストリームポリシーステートメント:

JSON
JSON
{ "Version":"2012-10-17", "Id": "__default_sharedthroughput_read_policy_ID", "Statement": [ { "Sid": "consumerreadstatement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/role-name" }, "Action": [ "kinesis:DescribeStreamSummary", "kinesis:ListShards" ], "Resource": "arn:aws:kinesis:us-east-2:123456789012:stream/datastreamABC" } ] }

コンシューマーポリシーステートメント:

JSON
JSON
{ "Version":"2012-10-17", "Id": "__default_efo_read_policy_ID", "Statement": [ { "Sid": "eforeadstatement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/role-name" }, "Action": [ "kinesis:DescribeStreamConsumer", "kinesis:SubscribeToShard" ], "Resource": "arn:aws:kinesis:us-east-2:123456789012:stream/datastreamABC/consumer/consumerDEF:1674696300" } ] }

最小特権の原則を維持するため、アクションやプリンシパルフィールドではワイルドカード (*) はサポートされていません。

データストリームのポリシーのプログラムを管理する

AWS マネジメントコンソール以外にも、Kinesis Data Streams にはデータストリームポリシーを管理するための 3 つの API があります。

PutResourePolicy を使用して、データストリームまたはコンシューマーのポリシーをアタッチまたは上書きします。GetResourcePolicy を使用して、指定したデータストリームまたはコンシューマーのポリシーを確認し、表示します。DeleteResourcePolicy を使用して、指定したデータストリームまたはコンシューマーのポリシーを削除します。

ポリシー制限

Kinesis Data Streams リソースポリシーには次の制限があります。

  • ワイルドカード (*) は、データストリームまたは登録されたコンシューマーに直接アタッチされたリソースポリシーを介して広範なアクセスが付与されないようにするためにサポートされていません。さらに、次のポリシーを注意深く調べて、広範なアクセスが許可されていないことを確かめてください。

    • 関連する AWS プリンシパル (IAM ロールなど) にアタッチされているアイデンティティベースのポリシー

    • 関連する AWS リソース (AWS Key Management Service KMS キーなど) にアタッチされているリソースベースのポリシー

  • 混乱した代理問題を防止するため、プリンシパルでは AWS サービスプリンシパルはサポートされていません。

  • フェデレーションプリンシパルはサポートされていません。

  • 正規ユーザー ID はサポートされていません。

  • ポリシーのサイズは 20 KB までです。

暗号化されたデータへのアクセスを共有する

AWS マネージド KMS キーを使用してデータストリームのサーバー側の暗号化を有効にしている場合に、リソースポリシーを介してアクセスを共有したいときは、カスタマーマネージドキー (CMK) の使用に切り替える必要があります。詳細については、Kinesis Data Streams 用のサーバー側の暗号化とは?を参照してください。さらに、KMS のクロスアカウント共有機能を使用して、共有プリンシパルエンティティが CMK にアクセスできるようにする必要があります。共有プリンシパルエンティティの IAM ポリシーも必ず変更してください。詳細については、「その他のアカウントのユーザーに KMS キーの使用を許可する」を参照してください。

別のアカウントの Kinesis Data Streams から読み取る AWS Lambda 関数を設定する

別のアカウントの Kinesis Data Streams から読み取るように Lambda 関数を設定する方法の例については、「クロスアカウントの AWS Lambda 関数を使用したアクセスを共有する」を参照してください。