View a markdown version of this page

数据传输的 IAM 权限 - Amazon Kinesis Data Streams

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

数据传输的 IAM 权限

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

生命周期管理权限

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

交付生命周期权限
处理建议 资源 说明
kinesis:CreateChannel 直播 ARN () arn:aws:kinesis:region:account-id:stream/stream-name 在 Kinesis 数据流上创建交付。
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 数据流服务代入该角色。包括条件键以防止出现混乱的副手问题。

{ "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仅当您使用客户管理的密 AWS KMS 钥加密目标表时才需要。没有它,CreateTable会成功,但是表加密失败,永远不会创建表。

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

  • AllowCreateTableWithTag和AllowPutTableDataWithTag语句是可选的。仅当你想要基于标签的访问控制而不是仅通过表 ARN 来确定范围时,才包括它们。它们s3tables:CreateTables3tables:PutTableData对带有匹配TableName标签的资源进行限制。如果您按 ARN 设定范围,请省略它们。

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

  • 该KMSForCreateTimeValidation声明允许亚马逊 Kinesis 数据流在您创建交付时验证您的 AWS KMS 密钥。仅当您的目标表或源流使用客户管理的密钥时,才需要该 AWS KMS 密钥。

  • 该KMSForS3TablesEncryption语句授予用于对传送的静态表数据进行加密的 AWS KMS 操作。仅当您的表存储桶使用客户管理的密钥时才需要此密钥。

  • 该KMSForCreateTable语句允许 Amazon Kinesis 数据流在创建目标表时读取密钥配置。仅当表存储桶使用客户管理的密钥时才需要此密钥。

  • 该KMSForDecryptSourceStreamRecords语句允许角色解密从源流读取的记录。仅当使用客户管理的密钥对您的 Kinesis 数据流进行加密时,才需要使用该密钥。

通用的 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声明允许亚马逊 Kinesis 数据流在您创建交付时验证您的 AWS KMS 密钥。仅当您的目标存储桶或源流使用客户管理的密钥时,才需要此 AWS KMS 密钥。

  • 该KMSForS3BucketEncryption声明授予了 Amazon S3 用于对交付的静态对象进行加密的 AWS 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 用户指南中的配置 S3 存储桶密钥。

  • 该KMSForDecryptSourceStreamRecords语句允许角色解密从源流读取的记录。仅当使用客户管理的密钥对您的 Kinesis 数据流进行加密时,才需要使用该密钥。

重要

如果您将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>:*" } ] }