You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将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"]
                }
            }
        }
    }
    
  • 步骤3:启动Agent
    执行sudo systemctl start amazon-cloudwatch-agent启动服务,再加个开机自启:sudo systemctl enable amazon-cloudwatch-agent
额外提醒
  • 自定义指标会产生CloudWatch费用,别把采集频率设得太密,也别采集不必要的指标,避免额外开销
  • 托管集群的ES API有调用速率限制,触发Lambda的间隔别太短
  • Lambda的超时时间要调够,确保能完成指标拉取和推送的全流程

内容的提问来源于stack exchange,提问作者Archana Devi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:30:52