能否将Amazon Elasticsearch自定义指标导入CloudWatch?如何实现?
当然可行啦!不管你用的是托管的Amazon OpenSearch Service(以前叫Amazon Elasticsearch Service)还是自己在EC2上搭的Elasticsearch集群,都能把自定义指标同步到CloudWatch。我给你整理了两种最实用的实现方式,按需选就行:
方式一:针对托管Amazon OpenSearch Service(原ES)的方案(Lambda + ES API)
因为托管集群没法直接在节点上装工具,用Lambda定期拉取指标再推去CloudWatch是最稳妥的路子:
- 步骤1:配置IAM权限
先给Lambda建个IAM角色,得授权它俩核心操作:- 允许调用
es:ESHttpGet访问你的ES集群 - 允许调用
cloudwatch:PutMetricData推送指标
另外别忘了在ES集群的访问策略里,加上允许这个Lambda角色ARN访问的规则,不然Lambda连ES的门都进不去~
- 允许调用
- 步骤2:编写Lambda函数代码(以Python为例)
下面是个基础示例,你可以根据自己要采集的指标修改:import boto3 import requests from requests_aws4auth import AWS4Auth region = 'us-east-1' # 替换成你的集群所在区域 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) es_endpoint = 'https://your-es-domain-endpoint' # 替换成你的ES集群端点 # 这里可以换成你要获取的指标路径,比如/_nodes/stats/jvm(节点JVM指标)、/_cat/shards(分片状态)等 metric_path = '/_cat/indices?v&format=json' cloudwatch = boto3.client('cloudwatch', region_name=region) def lambda_handler(event, context): # 调用ES API拉取指标数据 response = requests.get(es_endpoint + metric_path, auth=awsauth) indices = response.json() # 处理并推送指标,这里以索引的文档总数为例 for index in indices: # 排除系统索引,避免无效数据 if index['index'] not in ['.kibana', '.opendistro_security']: doc_count = int(index['docs.count']) cloudwatch.put_metric_data( Namespace='Custom/Elasticsearch', MetricData=[ { 'MetricName': 'DocumentCount', 'Dimensions': [{'Name': 'IndexName', 'Value': index['index']}], 'Value': doc_count, 'Unit': 'Count' } ] ) return '自定义指标已成功推送到CloudWatch' - 步骤3:设置定时触发
用EventBridge(原CloudWatch Events)给Lambda加个定时规则,比如每5分钟执行一次,这样就能定期同步指标了。
方式二:针对自托管在EC2上的Elasticsearch集群(CloudWatch Agent)
如果你的ES集群是自己在EC2上部署的,用CloudWatch Agent直接采集更省心:
- 步骤1:给EC2实例附加IAM角色,授权它调用
cloudwatch:PutMetricData - 步骤2:安装并配置CloudWatch Agent
- 先装Agent:Amazon Linux系统可以用
sudo yum install amazon-cloudwatch-agent,其他系统对应调整安装命令 - 编辑配置文件(比如
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json),添加自定义指标采集规则,示例如下:
{ "metrics": { "namespace": "Custom/Elasticsearch", "metrics_collected": { "elasticsearch": { "metrics_collection_interval": 60, "endpoint": "http://localhost:9200", # 这里填你要采集的指标,比如索引文档数、JVM内存使用率等 "metrics": ["indices.docs.count", "nodes.jvm.mem.heap.used_percent"] } } } } - 先装Agent:Amazon Linux系统可以用
- 步骤3:启动Agent
执行sudo systemctl start amazon-cloudwatch-agent启动服务,再加个开机自启:sudo systemctl enable amazon-cloudwatch-agent
额外提醒
- 自定义指标会产生CloudWatch费用,别把采集频率设得太密,也别采集不必要的指标,避免额外开销
- 托管集群的ES API有调用速率限制,触发Lambda的间隔别太短
- Lambda的超时时间要调够,确保能完成指标拉取和推送的全流程
内容的提问来源于stack exchange,提问作者Archana Devi
相关产品推荐
相关产品推荐

