Amazon Kinesis Data Firehose
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 Amazon Kinesis Data Firehose 控制访问

以下部分介绍如何控制对 Kinesis Data Firehose 资源的访问和来自这些资源的访问。涵盖的信息包括如何授予您的应用程序访问这些资源的权限,以便可以向您的 Kinesis Data Firehose 传输流发送数据。另外,还介绍如何授予 Kinesis Data Firehose 访问 Amazon Simple Storage Service (Amazon S3) 存储桶、Amazon Redshift 集群或 Amazon Elasticsearch Service 集群的权限,以及使用 Splunk 作为目标时所需的访问权限。本主题指南的最后还会介绍如何配置 Kinesis Data Firehose,以便它可以向属于其他 AWS 账户的目标传输数据。所有这些形式的访问都采用 AWS Identity and Access Management (IAM) 技术进行管理。有关 IAM 的更多信息,请参阅什么是 IAM?

授予应用程序访问您的 Kinesis Data Firehose 资源的权限

要授予您的应用程序访问 Kinesis Data Firehose 传输流的权限,请使用类似下例的策略。您可以通过修改 Action 部分对要授予权限的各个 API 操作进行调整,或通过 "firehose:*" 向所有操作授予权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:DeleteDeliveryStream", "firehose:PutRecord", "firehose:PutRecordBatch", "firehose:UpdateDestination" ], "Resource": [ "arn:aws:firehose:region:account-id:deliverystream/delivery-stream-name" ] } ] }

允许 Kinesis Data Firehose 担任 IAM 角色

如果您使用控制台创建传输流,并选择该选项以创建新角色,AWS 会将所需的信任策略附加到角色。另一方面,如果您希望 Kinesis Data Firehose 使用现有 IAM 角色或您自己创建角色,将以下信任策略附加到该角色,以便 Kinesis Data Firehose 可以担任该角色。请编辑该策略以将 account-id 替换为您的 AWS 账户 ID。这确保仅您可以请求 Kinesis Data Firehose 担任该 IAM 角色。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId":"account-id" } } } ] }

有关如何修改角色的信任关系的更多信息,请参阅修改角色

授予 Kinesis Data Firehose 访问 Amazon S3 目标的权限

在使用 Amazon S3 目标时,Kinesis Data Firehose 将数据传输到 S3 存储桶,并且可以选择使用您拥有的 AWS KMS 密钥进行数据加密。如果启用了错误日志,Kinesis Data Firehose 还会将数据传输错误发送到您的 CloudWatch 日志组和流。要创建传输流,您需要具有一个 IAM 角色。Kinesis Data Firehose 担任该 IAM 角色,并获得指定的存储桶、密钥以及 CloudWatch 日志组和流的访问权限。

为使 Kinesis Data Firehose 能够访问您的 S3 存储桶和 AWS KMS 密钥,请使用以下访问策略。如果您没有 S3 存储桶,请将 s3:PutObjectAcl 添加到 Amazon S3 操作列表中。这会为存储桶所有者授予 Kinesis Data Firehose 传输的对象的完全访问权限。此策略还包含允许访问 Amazon Kinesis Data Streams 的语句。如果您不使用 Kinesis Data Streams 作为数据源,可以删除该语句。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] }, { "Effect": "Allow", "Action": [ "kinesis:DescribeStream", "kinesis:GetShardIterator", "kinesis:GetRecords" ], "Resource": "arn:aws:kinesis:region:account-id:stream/stream-name" }, { "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:::bucket-name/prefix*" } } }, { "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:region:account-id:log-group:log-group-name:log-stream:log-stream-name" ] }, { "Effect": "Allow", "Action": [ "lambda:InvokeFunction", "lambda:GetFunctionConfiguration" ], "Resource": [ "arn:aws:lambda:region:account-id:function:function-name:function-version" ] } ] }

有关允许其他 AWS 服务访问您的 AWS 资源的更多信息,请参阅 IAM 用户指南 中的创建角色以向 AWS 服务委派权限

授予 Kinesis Data Firehose 访问 Amazon Redshift 目标的权限

在使用 Amazon Redshift 目标并授予 Kinesis Data Firehose 的访问权限时,请参阅以下内容。

IAM 角色和访问策略

在使用 Amazon Redshift 目标时,Kinesis Data Firehose 将数据传输到 S3 存储桶以作为中间位置。它可以选择使用您的 AWS KMS 密钥对数据进行加密。然后,Kinesis Data Firehose 将数据从该 S3 存储桶加载到您的 Amazon Redshift 集群。如果启用了错误日志,Kinesis Data Firehose 还会将数据传输错误发送到您的 CloudWatch 日志组和流。Kinesis Data Firehose 使用指定的 Amazon Redshift 用户名和密码访问您的集群,并使用 IAM 角色访问指定的存储桶、密钥、CloudWatch 日志组和流。要创建传输流,您需要具有一个 IAM 角色。

为使 Kinesis Data Firehose 能够访问您的 S3 存储桶和 AWS KMS 密钥,请使用以下访问策略。如果您没有 S3 存储桶,请在 Amazon S3 操作列表中添加 s3:PutObjectAcl,从而为存储桶拥有者授予 Kinesis Data Firehose 传输的对象的完全访问权限。此策略还包含允许访问 Amazon Kinesis Data Streams 的语句。如果您不使用 Kinesis Data Streams 作为数据源,可以删除该语句。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] }, { "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:::bucket-name/prefix*" } } }, { "Effect": "Allow", "Action": [ "kinesis:DescribeStream", "kinesis:GetShardIterator", "kinesis:GetRecords" ], "Resource": "arn:aws:kinesis:region:account-id:stream/stream-name" }, { "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:region:account-id:log-group:log-group-name:log-stream:log-stream-name" ] }, { "Effect": "Allow", "Action": [ "lambda:InvokeFunction", "lambda:GetFunctionConfiguration" ], "Resource": [ "arn:aws:lambda:region:account-id:function:function-name:function-version" ] } ] }

有关允许其他 AWS 服务访问您的 AWS 资源的更多信息,请参阅 IAM 用户指南 中的创建角色以向 AWS 服务委派权限

VPC 对 Amazon Redshift 集群的访问

如果 Amazon Redshift 集群位于 Virtual Private Cloud (VPC) 中,它必须具有公有 IP 地址以公开进行访问。此外,还可以通过取消阻止 Kinesis Data Firehose IP 地址来为 Kinesis Data Firehose 授予访问您的 Amazon Redshift 集群的权限。目前,Kinesis Data Firehose 为每个可用区域使用一个 CIDR 块:

  • 52.89.255.224/27 用于 美国西部(俄勒冈)

  • 35.180.1.96/27 用于 欧洲 (巴黎)

  • 52.70.63.192/27 用于 美国东部(弗吉尼亚北部)

  • 52.19.239.192/27 用于 欧洲(爱尔兰)

  • 18.162.221.32/27 用于 亚太地区(香港)

  • 13.232.67.32/27 用于 亚太地区(孟买)

  • 13.58.135.96/27 用于 美国东部(俄亥俄州)

  • 35.158.127.160/27 用于 欧洲(法兰克福)

  • 18.228.1.128/27 用于 南美洲(圣保罗)

  • 13.209.1.64/27 用于 亚太区域(首尔)

  • 18.130.1.96/27 用于 欧洲 (伦敦)

  • 13.113.196.224/27 用于 亚太区域(东京)

  • 13.57.135.192/27 用于 美国西部(加利福尼亚北部)

  • 13.228.64.192/27 用于 亚太区域(新加坡)

  • 13.210.67.224/27 用于 亚太区域(悉尼)

  • 35.183.92.128/27 用于 加拿大 (中部)

  • 52.61.204.160/27 for AWS GovCloud (US-West)

  • 18.253.138.96/27 for AWS GovCloud(美国东部)

  • 13.53.63.224/27 用于 欧洲(斯德哥尔摩)

有关如何取消阻止 IP 地址的更多信息,请参阅 Amazon Redshift 入门 指南中的授予对集群的访问权限步骤。

授予 Kinesis Data Firehose 访问 Amazon ES 目标的权限

在使用 Amazon ES 目标时,Kinesis Data Firehose 将数据传输到 Amazon ES 集群,同时将失败的文档或所有文档备份到 S3 存储桶中。如果启用了错误日志,Kinesis Data Firehose 还会将数据传输错误发送到您的 CloudWatch 日志组和流。Kinesis Data Firehose 使用 IAM 角色访问指定的 Elasticsearch 域、S3 存储桶、AWS KMS 密钥和 CloudWatch 日志组及流。要创建传输流,您需要具有一个 IAM 角色。

为使 Kinesis Data Firehose 能够访问您的 S3 存储桶、Amazon ES 域和 AWS KMS 密钥,请使用以下访问策略。如果您没有 S3 存储桶,请在 Amazon S3 操作列表中添加 s3:PutObjectAcl,从而为存储桶拥有者授予 Kinesis Data Firehose 传输的对象的完全访问权限。此策略还包含允许访问 Amazon Kinesis Data Streams 的语句。如果您不使用 Kinesis Data Streams 作为数据源,可以删除该语句。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] }, { "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:::bucket-name/prefix*" } } }, { "Effect": "Allow", "Action": [ "es:DescribeElasticsearchDomain", "es:DescribeElasticsearchDomains", "es:DescribeElasticsearchDomainConfig", "es:ESHttpPost", "es:ESHttpPut" ], "Resource": [ "arn:aws:es:region:account-id:domain/domain-name", "arn:aws:es:region:account-id:domain/domain-name/*" ] }, { "Effect": "Allow", "Action": [ "es:ESHttpGet" ], "Resource": [ "arn:aws:es:region:account-id:domain/domain-name/_all/_settings", "arn:aws:es:region:account-id:domain/domain-name/_cluster/stats", "arn:aws:es:region:account-id:domain/domain-name/index-name*/_mapping/type-name", "arn:aws:es:region:account-id:domain/domain-name/_nodes", "arn:aws:es:region:account-id:domain/domain-name/_nodes/stats", "arn:aws:es:region:account-id:domain/domain-name/_nodes/*/stats", "arn:aws:es:region:account-id:domain/domain-name/_stats", "arn:aws:es:region:account-id:domain/domain-name/index-name*/_stats" ] }, { "Effect": "Allow", "Action": [ "kinesis:DescribeStream", "kinesis:GetShardIterator", "kinesis:GetRecords" ], "Resource": "arn:aws:kinesis:region:account-id:stream/stream-name" }, { "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:region:account-id:log-group:log-group-name:log-stream:log-stream-name" ] }, { "Effect": "Allow", "Action": [ "lambda:InvokeFunction", "lambda:GetFunctionConfiguration" ], "Resource": [ "arn:aws:lambda:region:account-id:function:function-name:function-version" ] } ] }

有关允许其他 AWS 服务访问您的 AWS 资源的更多信息,请参阅 IAM 用户指南 中的创建角色以向 AWS 服务委派权限

授予 Kinesis Data Firehose 访问 Splunk 目标的权限

在使用 Splunk 目标时,Kinesis Data Firehose 将数据传输到 Splunk HTTP 事件收集器 (HEC) 终端节点。它还会将该数据备份到您指定的 Amazon S3 存储桶中,您可以选择使用您拥有的 AWS KMS 密钥进行 Amazon S3 服务器端加密。如果启用了错误日志记录,Kinesis Data Firehose 还会将数据传输错误发送到您的 CloudWatch 日志流。您也可以使用 AWS Lambda 进行数据转换。如果您使用 AWS 负载均衡器,请确保它是 传统负载均衡器。Kinesis Data Firehose 既不支持 Application Load Balancer,也不支持 Network Load Balancer。此外,启用基于持续时间的粘性会话,并禁用 Cookie 过期。有关如何执行此操作的信息,请参阅基于持续时间的会话粘性

要创建传输流,您需要具有一个 IAM 角色。Kinesis Data Firehose 担任该 IAM 角色,并获得指定的存储桶、密钥以及 CloudWatch 日志组和流的访问权限。

为使 Kinesis Data Firehose 能够访问您的 S3 存储桶,请使用以下访问策略。如果您没有 S3 存储桶,请在 Amazon S3 操作列表中添加 s3:PutObjectAcl,从而为存储桶拥有者授予 Kinesis Data Firehose 传输的对象的完全访问权限。此策略还授予 Kinesis Data Firehose 访问 CloudWatch(以便进行错误日志记录)和 AWS Lambda(以便进行数据传输)的权限。此策略还包含允许访问 Amazon Kinesis Data Streams 的语句。如果您不使用 Kinesis Data Streams 作为数据源,可以删除该语句。Kinesis Data Firehose 不使用 IAM 访问 Splunk。要访问 Splunk,它使用您的 HEC 令牌。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] }, { "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:::bucket-name/prefix*" } } }, { "Effect": "Allow", "Action": [ "kinesis:DescribeStream", "kinesis:GetShardIterator", "kinesis:GetRecords" ], "Resource": "arn:aws:kinesis:region:account-id:stream/stream-name" }, { "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:region:account-id:log-group:log-group-name:log-stream:*" ] }, { "Effect": "Allow", "Action": [ "lambda:InvokeFunction", "lambda:GetFunctionConfiguration" ], "Resource": [ "arn:aws:lambda:region:account-id:function:function-name:function-version" ] } ] }

有关允许其他 AWS 服务访问您的 AWS 资源的更多信息,请参阅 IAM 用户指南 中的创建角色以向 AWS 服务委派权限

在 VPC 中访问 Splunk

如果 Splunk 平台位于 VPC 中,它必须具有公有 IP 地址以公开进行访问。此外,还要取消阻止 Kinesis Data Firehose IP 地址,以便为 Kinesis Data Firehose 授予 Splunk 平台的访问权限。Kinesis Data Firehose 当前使用以下 CIDR 块。

  • 34.216.24.32/27, 34.216.24.192/27, 34.216.24.224/27 用于 美国西部(俄勒冈)

  • 35.180.112.0/26 用于 欧洲 (巴黎)

  • 34.238.188.128/26, 34.238.188.192/26, 34.238.195.0/26 用于 美国东部(弗吉尼亚北部)

  • 34.241.197.32/27, 34.241.197.64/27, 34.241.197.96/27 用于 欧洲(爱尔兰)

  • 18.162.221.64/26 用于 亚太地区(香港)

  • 13.232.67.64/26 用于 亚太地区(孟买)

  • 18.216.68.160/27, 18.216.170.64/27, 18.216.170.96/27 用于 美国东部(俄亥俄州)

  • 18.194.95.192/27, 18.194.95.224/27, 18.195.48.0/27 用于 欧洲(法兰克福)

  • 18.228.1.192/26 用于 南美洲(圣保罗)

  • 13.209.71.0/26 用于 亚太区域(首尔)

  • 18.130.91.0/26 用于 欧洲 (伦敦)

  • 13.230.21.0/27, 13.230.21.32/27 用于 亚太区域(东京)

  • 13.57.180.0/26 用于 美国西部(加利福尼亚北部)

  • 13.229.187.128/26 用于 亚太区域(新加坡)

  • 13.211.12.0/26 用于 亚太区域(悉尼)

  • 35.183.92.64/26 用于 加拿大 (中部)

  • 52.61.204.192/26 for AWS GovCloud (US-West)

  • 18.253.138.192/26 for AWS GovCloud(美国东部)

  • 13.53.191.0/26 用于 欧洲(斯德哥尔摩)

跨账户传输

您可以将 Kinesis Data Firehose 传输流配置为将数据传输到属于其他 AWS 账户的目标,只要该目标支持基于资源的权限。有关基于资源的权限的更多信息,请参阅基于身份的 (IAM) 权限和基于资源的权限。有关支持基于资源的权限的 AWS 服务的列表,请参阅使用 IAM 的 AWS 服务

以下过程展示了一个示例,该示例将配置账户 A 拥有的 Kinesis Data Firehose 传输流以向账户 B 拥有的 Amazon S3 存储桶传输数据。

  1. 使用为 Kinesis Firehose 授予 Amazon S3 目标的访问权限中所述的步骤,以账户 A 身份创建 IAM 角色。

    注意

    在本案例中,访问策略中指定的 Amazon S3 存储桶由账户 B 拥有。确保将 s3:PutObjectAcl 添加到访问策略中的 Amazon S3 操作列表,该访问策略为账户 B 授予了对 Amazon Kinesis Data Firehose 传输的对象的完全访问权限。

  2. 要允许从之前创建的 IAM 角色进行访问,请以账户 B 身份创建一个 S3 存储桶策略。以下代码是存储桶策略的示例。有关更多信息,请参阅使用存储桶策略和用户策略

    { "Version": "2012-10-17", "Id": "PolicyID", "Statement": [ { "Sid": "StmtID", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::accountA-id:role/iam-role-name" }, "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] } ] }
  3. 使用在步骤 1 中创建的 IAM 角色,以账户 A 身份创建一个 Kinesis Data Firehose 传输流。

使用标签控制访问

您可以使用 IAM 策略中的可选 Condition 元素(或 Condition )基于标签键和值微调对 Kinesis Data Firehose 的访问权限。以下小节描述如何针对不同的 Kinesis Data Firehose 操作执行上述操作。有关使用 Condition 元素以及您可在其内使用的运算符的更多信息,请参阅 IAM JSON 策略元素:条件

CreateDeliveryStream 和 TagDeliveryStream

对于 CreateDeliveryStreamTagDeliveryStream 操作,请使用 aws:RequestTag 条件键。在以下示例中,MyKeyMyValue 表示标签的键和对应的值。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "firehose:CreateDeliveryStream", "Resource": "*", "Condition": { "StringEquals": { "aws:RequestTag/MyKey": "MyValue" } } } ] }

UntagDeliveryStream

对于 UntagDeliveryStream 操作,请使用 aws:TagKeys 条件键。在以下示例中,MyKey 为示例标签键。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "firehose:UntagDeliveryStream", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "aws:TagKeys": "MyKey" } } } ] }

ListDeliveryStreams

您不能将基于标签的访问控制用于 ListDeliveryStreams

其他 Kinesis Data Firehose 操作

对于 CreateDeliveryStreamTagDeliveryStreamUntagDeliveryStreamListDeliveryStreams 之外的所有 Kinesis Data Firehose 操作,请使用 aws:RequestTag 条件键。在以下示例中,MyKeyMyValue 表示标签的键和对应的值。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "firehose:DescribeDeliveryStream", "Resource": "*", "Condition": { "Null": { "firehose:ResourceTag/MyKey": "MyValue" } } ] }