View a markdown version of this page

用于数据传输的 IAM 权限 - Amazon Kinesis Data Streams
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

用于数据传输的 IAM 权限

使用本主题了解在 Amazon Kinesis Data Streams 中创建和管理交付资源所需的 IAM 权限,以及数据交付在将数据传输到目标时所承担的服务执行角色。

生命周期管理权限

要创建、更新、删除、描述和列出交付资源,调用的 IAM 委托人必须具有以下权限。

处理建议 资源 说明
kinesis:CreateChannel 直播 ARN () arn:aws:kinesis:region:account-id:stream/stream-name 在 Kinesis Data Streams 流上创建分发。
kinesis:AssociateStreamsWithChannel 直播 ARN () arn:aws:kinesis:region:account-id:stream/stream-name 将直播与配送关联。这是一个虚拟操作,必须授予调用主体权限才能创建从指定流中读取数据的传送。除此之外,它还获得授权kinesis:CreateChannel。
kinesis:UpdateChannel 频道 ARN () arn:aws:kinesis:region:account-id:channel/channel-id 更新现有的交付配置。
kinesis:DeleteChannel 频道 ARN 删除现有配送。
kinesis:DescribeChannel 频道 ARN 检索配送的详细信息。
kinesis:ListChannels 账户等级 (arn:aws:kinesis:region:account-id:stream/*) 列出账户中的所有配送。

服务执行角色

数据交付扮演 IAM 服务执行角色,将数据传送到您的目的地。您必须创建此角色并附加信任策略和权限策略。

信任策略

信任策略允许 Kinesis Data Streams 服务担任该角色。包括条件键以防止出现混乱的副手问题。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "kinesis.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "<account-id>" }, "ArnLike": { "aws:SourceArn": "arn:aws:kinesis:<region>:<account-id>:channel/*" } } } ] }

Apache Iceberg 上直播表格的权限策略

在 Apache Iceberg 上向流式传输表时,服务执行角色需要以下权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3TablesAccess", "Effect": "Allow", "Action": [ "s3tables:GetTable", "s3tables:GetTableBucket", "s3tables:GetTableMetadataLocation", "s3tables:UpdateTableMetadataLocation", "s3tables:CreateTable", "s3tables:CreateNamespace", "s3tables:PutTableData", "s3tables:GetTableData", "s3tables:TagResource", "s3tables:PutTableRecordExpirationConfiguration", "s3tables:PutTableEncryption" ], "Resource": [ "arn:aws:s3tables:<region>:<account-id>:bucket/<table-bucket-name>", "arn:aws:s3tables:<region>:<account-id>:bucket/<table-bucket-name>/table/*" ] }, { "Sid": "AllowCreateTableWithTag", "Effect": "Allow", "Action": "s3tables:CreateTable", "Resource": [ "arn:aws:s3tables:<region>:<account-id>:bucket/<table-bucket-name>/table/*", "arn:aws:s3tables:<region>:<account-id>:bucket/<table-bucket-name>" ], "Condition": { "StringEquals": { "aws:RequestTag/TableName": "<table-name>" } } }, { "Sid": "AllowPutTableDataWithTag", "Effect": "Allow", "Action": "s3tables:PutTableData", "Resource": "arn:aws:s3tables:<region>:<account-id>:bucket/<table-bucket-name>/table/*", "Condition": { "StringEquals": { "aws:ResourceTag/TableName": "<table-name>" } } }, { "Sid": "DLQBucketAccess", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:ListBucket", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::<dlq-bucket-name>", "arn:aws:s3:::<dlq-bucket-name>/*" ], "Condition": { "StringEquals": { "aws:ResourceAccount": "<dlq-account-id>" } } }, { "Sid": "GlueSchemaRegistryAccess", "Effect": "Allow", "Action": [ "glue:GetSchemaVersion" ], "Resource": [ "arn:aws:glue:<region>:<account-id>:registry/<registry-name>", "arn:aws:glue:<region>:<account-id>:schema/<registry-name>/<schema-name>" ] }, { "Sid": "KMSForCreateTimeValidation", "Effect": "Allow", "Action": ["kms:Decrypt", "kms:GenerateDataKey"], "Resource": ["arn:aws:kms:<region>:<account-id>:key/<key-id>"], "Condition": { "StringEqualsIfExists": { "kms:ViaService": "kinesis.<region>.amazonaws.com" } } }, { "Sid": "KMSForS3TablesEncryption", "Effect": "Allow", "Action": ["kms:Decrypt", "kms:GenerateDataKey"], "Resource": ["arn:aws:kms:<region>:<account-id>:key/<key-id>"], "Condition": { "StringEquals": { "kms:ViaService": "s3.<region>.amazonaws.com" }, "StringLike": { "kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3tables:<region>:<account-id>:bucket/<table-bucket-name>/*", "arn:aws:s3:::<dlq-bucket-name>/*" ] } } }, { "Sid": "KMSForCreateTable", "Effect": "Allow", "Action": ["kms:DescribeKey"], "Resource": ["arn:aws:kms:<region>:<account-id>:key/<key-id>"], "Condition": { "StringEquals": { "kms:ViaService": "s3tables.<region>.amazonaws.com" } } }, { "Sid": "KMSForDecryptSourceStreamRecords", "Effect": "Allow", "Action": "kms:Decrypt", "Resource": ["arn:aws:kms:<region>:<account-id>:key/<stream-key-id>"], "Condition": { "StringEqualsIfExists": { "kms:ViaService": "kinesis.<region>.amazonaws.com" }, "StringEquals": { "kms:EncryptionContext:aws:kinesis:arn": "arn:aws:kinesis:<region>:<account-id>:stream/<stream-name>" } } } ] }
  • s3tables:PutTableEncryption只有在使用客户管理的密 Amazon KMS 钥加密目标表时才需要。如果没有它,CreateTable则会成功,但是表加密失败,并且永远不会创建表。

  • s3tables:TagResource是必需的,因为该服务会对其创建的表进行标记。

  • AllowCreateTableWithTag和AllowPutTableDataWithTag语句是可选的。只有当你想要基于标签的访问控制而不是仅根据表 ARN 来确定范围时,才包括它们。它们将s3tables:CreateTable和限制s3tables:PutTableData在带有匹配TableName标签的资源上。如果您按照 ARN 确定范围,请省略它们。

  • 只有 G glue:GetSchemaVersion lue 架构注册表是必需的。JSON和GSR_JSON输入格式都需要它。

  • 该KMSForCreateTimeValidation声明允许 Amazon Kinesis Data Streams 在您创建交付时验证 Amazon KMS 您的密钥。只有当您的目标表或源流使用客户托管 Amazon KMS 密钥时,才需要这样做。

  • 该KMSForS3TablesEncryption语句授予用于加密已交付的静态表数据的 Amazon KMS 操作。只有当您的表存储桶使用客户托管密钥时,才需要这样做。

  • 该KMSForCreateTable语句允许 Amazon Kinesis Data Streams 在创建目标表时读取密钥配置。只有当表存储桶使用客户托管密钥时,才需要这样做。

  • 该KMSForDecryptSourceStreamRecords语句允许角色解密从源流中读取的记录。只有当你的 Kinesis Data Streams 数据流使用客户管理的密钥加密时,才需要这样做。

通用型 Amazon S3 存储桶的权限策略

在向通用的 Amazon S3 存储桶传送数据时,服务执行角色需要以下权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DeliveryBucketList", "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::<delivery-bucket-name>", "arn:aws:s3:::<delivery-bucket-name>/*" ] }, { "Sid": "DeliveryBucketWrite", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:CreateMultipartUpload", "s3:UploadPart", "s3:CompleteMultipartUpload", "s3:ListMultipartUploads", "s3:ListMultipartUploadParts" ], "Resource": [ "arn:aws:s3:::<delivery-bucket-name>/*" ] }, { "Sid": "DLQBucketAccess", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:ListBucket", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::<dlq-bucket-name>", "arn:aws:s3:::<dlq-bucket-name>/*" ], "Condition": { "StringEquals": { "aws:ResourceAccount": "<dlq-account-id>" } } }, { "Sid": "KMSForCreateTimeValidation", "Effect": "Allow", "Action": ["kms:Decrypt", "kms:GenerateDataKey"], "Resource": ["arn:aws:kms:<region>:<account-id>:key/<key-id>"], "Condition": { "StringEqualsIfExists": { "kms:ViaService": "kinesis.<region>.amazonaws.com" } } }, { "Sid": "KMSForS3BucketEncryption", "Effect": "Allow", "Action": ["kms:Decrypt", "kms:GenerateDataKey"], "Resource": ["arn:aws:kms:<region>:<account-id>:key/<key-id>"], "Condition": { "StringEquals": { "kms:ViaService": "s3.<region>.amazonaws.com" }, "StringLike": { "kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::<delivery-bucket-name>/*", "arn:aws:s3:::<dlq-bucket-name>/*" ] } } }, { "Sid": "KMSForDecryptSourceStreamRecords", "Effect": "Allow", "Action": "kms:Decrypt", "Resource": ["arn:aws:kms:<region>:<account-id>:key/<stream-key-id>"], "Condition": { "StringEqualsIfExists": { "kms:ViaService": "kinesis.<region>.amazonaws.com" }, "StringEquals": { "kms:EncryptionContext:aws:kinesis:arn": "arn:aws:kinesis:<region>:<account-id>:stream/<stream-name>" } } } ] }
  • 该KMSForCreateTimeValidation声明允许 Amazon Kinesis Data Streams 在您创建交付时验证 Amazon KMS 您的密钥。只有当您的目标存储桶或源流使用客户托管 Amazon KMS 密钥时,才需要这样做。

  • 该KMSForS3BucketEncryption语句授予 Amazon S3 用于加密已交付的静态对象的 Amazon KMS 操作。只有当您的目标存储桶或死信队列存储桶与客户托管密钥 SSE-KMS 一起使用时,才需要使用它。显示的kms:EncryptionContext:aws:s3:arn值使用对象 ARN,该对象在 S3 存储桶密钥被禁用时适用。如果您在目标存储桶或死信队列存储桶上启用 S3 存储桶密钥,Amazon S3 将使用存储桶 ARN 而不是对象 ARN 作为加密上下文,因此您必须将相应值更改为该存储桶 ARN(例如,或)。arn:aws:s3:::delivery-bucket-name arn:aws:s3:::dlq-bucket-name有关更多信息,请参阅 Amazon S3 用户指南中的配置 S 3 存储桶密钥。

  • 该KMSForDecryptSourceStreamRecords语句允许角色解密从源流中读取的记录。只有当你的 Kinesis Data Streams 数据流使用客户管理的密钥加密时,才需要这样做。

重要

如果您将s3:PutObject资源限制为特定的前缀(例如arn:aws:s3:::my-bucket/data*),则输出密钥模板生成的对象密钥必须以该相同的前缀开头。IAM 资源前缀和输出密钥模板不匹配会导致访问被拒绝错误,并且不会传送任何数据。

例如,如果您的策略授予s3:PutObject启用arn:aws:s3:::my-bucket/data*,则您的输出密钥模板必须以开头data/,例如data/!{yyyy}/!{MM}/!{dd}/!{HH}/。为避免这种情况,要么将资源范围限定为整个存储桶 (arn:aws:s3:::my-bucket/*),要么确保前缀完全匹配。

可选 CloudWatch 日志权限

如果您为交付启用 CloudWatch 日志,请向服务执行角色添加以下权限:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "CloudWatchLogsAccess", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:<region>:<account-id>:log-group:<log-group-name>:*" } ] }