我有一个AWS Opensearch/ElasticSearch域,该域具有集群配置,可以每小时拍摄快照。我正在尝试在集群崩溃时自动恢复快照。
目前,我遇到了一个问题,代码在尝试从cs-automated
存储库获取可用快照列表时收到超时:
FailedExecution:无法自动从存储库获取快照信息。错误:由-ReadTimeout引起的ConnectionTimeout(HTTPSConnectionPool(host='my-domain.eu-west-1.es.amazonaws.com',port=443(:读取超时。(读取超时=10(
使用python 3.8代码如下所示:
import boto3
import curator
import datetime
import json
from elasticsearch import Elasticsearch, RequestsHttpConnection
import os
from requests_aws4auth import AWS4Auth
def handler(event, context):
... # get host details for connection
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
# Build the Elasticsearch client.
es = Elasticsearch(
hosts = [{'host': host, 'port': 443}],
http_auth = awsauth,
use_ssl = True,
verify_certs = True,
connection_class = RequestsHttpConnection
)
index_list = curator.SnapshotList(es, repository="cs-automated")
我已经将这些iamRoleStatements
添加到我的无服务器配置中
- Effect: Allow
Resource:
- arn:aws:es:${aws:region}:${aws:accountId}:domain/${self:custom.domains.${opt:stage}.reportinganalytics}/*
Action:
- es:ESHttpGet
- Effect: Allow
Resource: arn:aws:s3:::cs-automated/*
Action:
- s3:GetObject
- Effect: Allow
Resource: arn:aws:s3:::cs-automated
Action:
- s3:ListBucket
但这仍然会导致ConnectionTimeout。我是不是错过了许可?当我注销ES客户端连接的信息时,它使用的主机与AWS opensearch中的域端点匹配。
ConnectionTimeout
表示Lambda函数和OpenSearch集群之间没有网络路由。这不是IAM策略问题,这将导致与AWS API的403
HTTP响应代码的成功网络连接。
您的OpenSearch集群位于专有网络中,该专有网络有一个安全组来控制对该集群的网络访问。我相信你的Lambda函数是:
- 不在专有网络中,因此无法访问私有资源
- 或者在不同的专有网络中,没有跨专有网络的访问,因此没有到OpenSearch集群的网络路由
- 或者它在同一个VPC中,但OpenSearch安全组不允许在443端口上访问入站网络
我建议验证这些:
- 确保您的Lambda函数与您的OpenSearch集群位于同一VPC中。如果不在VPC中,则无法访问OpenSearch API。如果在不同的VPC中,则需要VPC对等或类似的跨VPC访问
- 确保OpenSearch群集的安全组允许端口443上的入站TCP流量,该流量来自附加到Lambda函数的安全组ID
此AWS页面也可能有助于调试连接问题:配置Lambda函数以访问VPC 中的资源
希望这能有所帮助,让我知道进展如何!