使用 Kinesis Firehose 时 VPC 内的 Elasticsearch 持续出现 503 错误
Constant 503 errors from Elasticsearch inside a VPC when using Kinesis Firehose
我正在使用 Amazon Kinesis Data Generator 将数据发送到测试 Kinesis Firehose Stream,以便在 Elasticsearch 服务集群中编制索引。
数据生成器发送一个相当基本的 json 文档进行处理,流元素工作正常,Lambda 转换也是如此。到目前为止,我已经验证并能够测试所有内容。只有在我的 VPC 中向 Elasticsearch 发出请求时,我才会收到错误。
如果我将管道切换为使用 public Elasticsearch 域,它工作正常,但是当我在我的 VPC 中使用 Elasticsearch 域时,我得到一个 503 error。这是每个请求的一致错误,因此不是容量问题。
这是我遇到的错误示例。只是一个通用的 503。我不确定这是来自负载均衡器还是目标(Elasticsearch 本身)。
{
"deliveryStreamARN": "arn:aws:firehose:eu-west-2:xxx:deliverystream/firehose-test",
"destination": "arn:aws:es:eu-west-2:xxx:domain/elasticsearch-test",
"deliveryStreamVersionId": 1,
"message": "Error received from Elasticsearch cluster. <html><body><h1>503 Service
Unavailable</h1>\nNo server is available to handle this request.\n</body></html>",
"errorCode": "ES.ServiceException",
"processor": "arn:aws:lambda:eu-west-2:xxx:function:transform-test:$LATEST"
}
VPC内的其他应用可以正常使用Elasticsearch服务。这似乎是 Firehose 特有的东西。
我已经阅读并重新阅读了文档,但无法弄清楚为什么相同的数据管道在 public ES 域上工作正常,但在我的 VPC 内的 ES 域上却不行。我仔细检查了所有角色、策略、安全组和子网。 Firehose 和 Elasticsearch 都使用相同的 VPC、安全组和子网。安全组的入站规则允许 HTTPS。一切看起来都正确,但仍然出现错误,并且没有在 Elastic 中建立索引。
我也阅读了这篇 AWS 博客 post 大约 15 遍,但无济于事。
Ingest streaming data into Amazon Elasticsearch Service within the privacy of your VPC with Amazon Kinesis Data Firehose
所以经过几天的痛苦我意识到我的 mistake/quirk Firehose 设置。
我的 Elasticsearch 集群是 Multi-AZ。创建 Firehose 时,我只是让它根据 pre-existing Elasticsearch 域选择默认安全组。我只在 Firehose 上定义了一个安全组。如果您的 Elasticsearch 在 VPC 中,则需要两个。
- 一个用于 Firehose 出站
- 一个用于 Elasticsearch 入站(您可能已经有了)
然后需要使用 SG 规则将它们连接在一起。
Firehose Delivery Stream 设置向导不会警告您您只有一个安全组并且这将不起作用。 (也许它适用于 single-AZ 上的 Elasticsearch 域,但我还没有测试过。)
您必须先创建两个必需的安全组 ,然后再 创建 Firehose 传输流。
为允许 HTTPS/433 出站流量的 Firehose 端点创建第一个安全组。
然后确保 Elasticsearch 域安全组允许入站 HTTPS/433 流量,特别是来自您刚刚创建的 Firehose 端点安全组。
这是需要什么的图表(来自这个博客post:Ingest streaming data into Amazon Elasticsearch Service within the privacy of your VPC with Amazon Kinesis Data Firehose)
我正在使用 Amazon Kinesis Data Generator 将数据发送到测试 Kinesis Firehose Stream,以便在 Elasticsearch 服务集群中编制索引。
数据生成器发送一个相当基本的 json 文档进行处理,流元素工作正常,Lambda 转换也是如此。到目前为止,我已经验证并能够测试所有内容。只有在我的 VPC 中向 Elasticsearch 发出请求时,我才会收到错误。
如果我将管道切换为使用 public Elasticsearch 域,它工作正常,但是当我在我的 VPC 中使用 Elasticsearch 域时,我得到一个 503 error。这是每个请求的一致错误,因此不是容量问题。
这是我遇到的错误示例。只是一个通用的 503。我不确定这是来自负载均衡器还是目标(Elasticsearch 本身)。
{
"deliveryStreamARN": "arn:aws:firehose:eu-west-2:xxx:deliverystream/firehose-test",
"destination": "arn:aws:es:eu-west-2:xxx:domain/elasticsearch-test",
"deliveryStreamVersionId": 1,
"message": "Error received from Elasticsearch cluster. <html><body><h1>503 Service
Unavailable</h1>\nNo server is available to handle this request.\n</body></html>",
"errorCode": "ES.ServiceException",
"processor": "arn:aws:lambda:eu-west-2:xxx:function:transform-test:$LATEST"
}
VPC内的其他应用可以正常使用Elasticsearch服务。这似乎是 Firehose 特有的东西。
我已经阅读并重新阅读了文档,但无法弄清楚为什么相同的数据管道在 public ES 域上工作正常,但在我的 VPC 内的 ES 域上却不行。我仔细检查了所有角色、策略、安全组和子网。 Firehose 和 Elasticsearch 都使用相同的 VPC、安全组和子网。安全组的入站规则允许 HTTPS。一切看起来都正确,但仍然出现错误,并且没有在 Elastic 中建立索引。
我也阅读了这篇 AWS 博客 post 大约 15 遍,但无济于事。 Ingest streaming data into Amazon Elasticsearch Service within the privacy of your VPC with Amazon Kinesis Data Firehose
所以经过几天的痛苦我意识到我的 mistake/quirk Firehose 设置。
我的 Elasticsearch 集群是 Multi-AZ。创建 Firehose 时,我只是让它根据 pre-existing Elasticsearch 域选择默认安全组。我只在 Firehose 上定义了一个安全组。如果您的 Elasticsearch 在 VPC 中,则需要两个。
- 一个用于 Firehose 出站
- 一个用于 Elasticsearch 入站(您可能已经有了)
然后需要使用 SG 规则将它们连接在一起。
Firehose Delivery Stream 设置向导不会警告您您只有一个安全组并且这将不起作用。 (也许它适用于 single-AZ 上的 Elasticsearch 域,但我还没有测试过。)
您必须先创建两个必需的安全组 ,然后再 创建 Firehose 传输流。
为允许 HTTPS/433 出站流量的 Firehose 端点创建第一个安全组。 然后确保 Elasticsearch 域安全组允许入站 HTTPS/433 流量,特别是来自您刚刚创建的 Firehose 端点安全组。
这是需要什么的图表(来自这个博客post:Ingest streaming data into Amazon Elasticsearch Service within the privacy of your VPC with Amazon Kinesis Data Firehose)