

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

# 用于数据传输的 IAM 权限
<a name="data-delivery-iam"></a>

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

## 生命周期管理权限
<a name="data-delivery-iam-lifecycle"></a>

 要创建、更新、删除、描述和列出交付资源，调用的 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/\*) | 列出账户中的所有配送。 | 

## 服务执行角色
<a name="data-delivery-iam-execution-role"></a>

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

### 信任策略
<a name="data-delivery-iam-trust-policy"></a>

 信任策略允许 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 上直播表格的权限策略
<a name="data-delivery-iam-permission-s3tables"></a>

 在 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 存储桶的权限策略
<a name="data-delivery-iam-permission-s3"></a>

 在向通用的 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 存储桶密钥](https://docs.amazonaws.cn/AmazonS3/latest/userguide/configuring-bucket-key.html)。
+ 该`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 日志权限
<a name="data-delivery-iam-cloudwatch-logs"></a>

 如果您为交付启用 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>:*"
        }
    ]
}
```