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

如何使用AWS CDK获取现有EC2实例ID存入数组并配置CloudWatch告警

AWS CDK 批量查询EC2实例实现批量监控方案

CDK目前没有内置类似vpc.fromLookup的批量查询所有EC2实例的方法,你可以通过以下两种方案实现实例列表拉取,再批量配置CloudWatch CPU告警和SNS通知:

方案1:CDK运行时调用AWS SDK拉取实例列表

直接在CDK栈初始化前调用EC2 SDK的describeInstances接口拉取实例ID,再遍历创建告警规则,示例代码(TypeScript环境)如下:

  1. 先安装依赖:
npm install @aws-sdk/client-ec2
  1. 栈代码示例:
import { EC2Client, DescribeInstancesCommand } from "@aws-sdk/client-ec2";
import { App, Stack, StackProps, Duration } from 'aws-cdk-lib';
import { Metric, Alarm, ComparisonOperator } from 'aws-cdk-lib/aws-cloudwatch';
import { SnsAction } from 'aws-cdk-lib/aws-cloudwatch-actions';
import { Topic } from 'aws-cdk-lib/aws-sns';

const app = new App();
class Ec2CpuMonitorStack extends Stack {
  constructor(scope: App, id: string, instanceIds: string[], props?: StackProps) {
    super(scope, id, props);

    // 替换为你的SNS通知主题ARN
    const alarmNotifyTopic = Topic.fromTopicArn(this, 'AlarmNotifyTopic', 'arn:aws-cn:sns:cn-north-1:123456789012:ec2-alarm-topic');

    // 遍历为每个实例创建CPU利用率告警
    instanceIds.forEach(instanceId => {
      const cpuUtilMetric = new Metric({
        namespace: 'AWS/EC2',
        metricName: 'CPUUtilization',
        dimensionsMap: { InstanceId: instanceId },
        period: Duration.minutes(5),
        statistic: 'Average'
      });

      new Alarm(this, `CpuHighAlarm-${instanceId}`, {
        metric: cpuUtilMetric,
        threshold: 80, // 可自定义阈值,示例为80%
        evaluationPeriods: 3,
        comparisonOperator: ComparisonOperator.GREATER_THAN_THRESHOLD,
        alarmDescription: `EC2实例 ${instanceId} 连续3个周期平均CPU利用率超过80%`
      }).addAlarmAction(new SnsAction(alarmNotifyTopic));
    });
  }
}

// 拉取当前区域所有EC2实例ID
const getAllEc2InstanceIds = async () => {
  const ec2Client = new EC2Client({ region: process.env.CDK_DEFAULT_REGION });
  const resp = await ec2Client.send(new DescribeInstancesCommand({
    // 可按需添加过滤器,比如只拉取运行中实例、按标签过滤等
    Filters: [{ Name: 'instance-state-name', Values: ['running'] }]
  }));
  const instanceIds: string[] = [];
  resp.Reservations?.forEach(reservation => {
    reservation.Instances?.forEach(instance => {
      if (instance.InstanceId) instanceIds.push(instance.InstanceId);
    });
  });
  return instanceIds;
};

// 初始化栈并执行synth
getAllEc2InstanceIds().then(instanceIds => {
  new Ec2CpuMonitorStack(app, 'Ec2CpuMonitorStack', instanceIds);
  app.synth();
});

注意事项

  • 执行cdk synth/cdk deploy的环境需要具备对应AWS账号的ec2:DescribeInstances权限
  • 示例默认拉取所有运行中实例,你可以修改DescribeInstancesCommand的Filters参数按需过滤实例

方案2:预拉取实例ID存入CDK Context

如果你不想在CDK运行时调用SDK,可以提前导出实例ID写入CDK上下文:

  1. 本地执行AWS CLI命令导出运行中实例ID:
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].InstanceId" --output text | tr '\t' ',' > instance_ids.txt
  1. 在执行cdk命令时通过context传入实例ID:
cdk deploy --context instanceIds=$(cat instance_ids.txt)
  1. 在栈中读取context参数处理:
const instanceIds = (this.node.tryGetContext('instanceIds') as string).split(',');
// 后续遍历创建告警逻辑和方案1一致

提示:两种方案都是部署时静态拉取实例列表,如果后续账号下新增EC2实例,需要重新执行cdk deploy才能为新实例配置告警。如果需要自动适配新增实例,可以搭配EventBridge监听EC2实例创建事件,触发Lambda动态创建告警规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 04:18:03