本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
用于数据传输的 IAM 权限
使用本主题了解在 Amazon Kinesis Data Streams 中创建和管理交付资源所需的 IAM 权限,以及数据交付在将数据传输到目标时所承担的服务执行角色。
生命周期管理权限
要创建、更新、删除、描述和列出交付资源,调用的 IAM 委托人必须具有以下权限。
| 处理建议 | 资源 | 说明 |
|---|---|---|
kinesis:CreateChannel |
直播 ARN () arn:aws:kinesis: |
在 Kinesis Data Streams 流上创建分发。 |
kinesis:AssociateStreamsWithChannel |
直播 ARN () arn:aws:kinesis: |
将直播与配送关联。这是一个虚拟操作,必须授予调用主体权限才能创建从指定流中读取数据的传送。除此之外,它还获得授权kinesis:CreateChannel。 |
kinesis:UpdateChannel |
频道 ARN () arn:aws:kinesis: |
更新现有的交付配置。 |
kinesis:DeleteChannel |
频道 ARN | 删除现有配送。 |
kinesis:DescribeChannel |
频道 ARN | 检索配送的详细信息。 |
kinesis:ListChannels |
账户等级 (arn:aws:kinesis:) |
列出账户中的所有配送。 |
服务执行角色
数据交付扮演 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:GetSchemaVersionlue 架构注册表是必需的。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-namearn:aws:s3:::有关更多信息,请参阅 Amazon S3 用户指南中的配置 S 3 存储桶密钥。dlq-bucket-name -
该
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>:*" } ] }