如何使用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环境)如下:
- 先安装依赖:
npm install @aws-sdk/client-ec2
- 栈代码示例:
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上下文:
- 本地执行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
- 在执行cdk命令时通过context传入实例ID:
cdk deploy --context instanceIds=$(cat instance_ids.txt)
- 在栈中读取context参数处理:
const instanceIds = (this.node.tryGetContext('instanceIds') as string).split(','); // 后续遍历创建告警逻辑和方案1一致
提示:两种方案都是部署时静态拉取实例列表,如果后续账号下新增EC2实例,需要重新执行
cdk deploy才能为新实例配置告警。如果需要自动适配新增实例,可以搭配EventBridge监听EC2实例创建事件,触发Lambda动态创建告警规则。
内容的提问来源于stack exchange,提问作者FilipKamenar
相关产品推荐
相关产品推荐

