Day 28 - 使用 CDK 创建 CloudWatch Alarm 的含图告警同时发送到 LINE 与 Discord

昨天教大家怎麽简单的在 LINE Notify 上面看到 CloudWatch 的 Alarm,不过这样只有通知没有目前的状态图对於平常判断系统是否有问题好像少了什麽,所以今天来教大家怎麽让 LINE Notify 上面除了可以看到 CloudWatch 的 Alarm 之外还可以看到 CloudWatch Graph

https://ithelp.ithome.com.tw/upload/images/20201012/20117701DXnf49N8qV.jpg

而今天的内容除了可以把讯息发到 LINE Notify 之外还加码支援把讯息发送到 Discord

https://ithelp.ithome.com.tw/upload/images/20201012/20117701R5IkkogXCH.png

今日目标

  1. 更新 Lambda 程序
  2. Lambda 加入 Policy
  3. Lambda 加入 environment
  4. 加入压测工具

创建一个 CloudWatch Alarm 的含图告警

更新 Lambda 程序

先更新新版的 Lambda 程序,程序位置 GitHub

主要功能我都已经先写好并且放到 GitHub 上面了,所以大家只要 pull 就可以取得新版程序了呦!

写得很烂请大家见谅

$ cd lambda
$ git pull

Lambda 加入 Policy

我们需要让 Lambda 可以吃到 CloudWatch 的资料,所以要修改一下它的权限,其实这边权限还可以再给得更小不过今天就先开个 cloudwatch:Get* 吧 XD

myFunction.addToRolePolicy(
  new iam.PolicyStatement({
    actions: ["cloudwatch:Get*"],
    resources: ["*"],
  })
);

Lambda 加入 environment

还记得昨天的范例我们需要直接修改 "your-line-notify-token" 吗?这个部分我做了一点改变,让参数直接从 CDK 喂给 Lambda 的 environment

const myFunction = new lambda.Function(this, "Lambda", {
  handler: "index.handler",
  runtime: lambda.Runtime.NODEJS_10_X,
  code: lambda.Code.fromAsset("lambda"),
  environment: {
    LINE_NOTIFY_TOKEN: "your-line-notify-token",
    DISCORD_URL: "your-discord-webhook-url",
  },
});

取得 Discord Webhook 的方法可以参考官方文件

加入压测工具

昨天的教学因为篇幅关系没有介绍到如何使用人为方法给予机器负载做测试,今天来把这段补起来

我们平常使用的 AMI 为 AMAZON LINUX 2 所以以此介绍,首先我们需要先安装 epel 不然我们没有软件包可以使用

$ sudo amazon-linux-extras install epel -y

如果对 epel 有问题可以参考 AWS 的文件 How do I enable the EPEL repository for my Amazon EC2 instance running CentOS, RHEL, or Amazon Linux?

安装 stress-ng

这次我们选用 stress-ng 作为我们的测试工具,还是记得我们前面有教大家使用 User Data 吗?我们就直接请 User Data 安装这样我们开启系统的时候就可以直接使用了

$ sudo yum install stress-ng -y

制造 CPU Load

我们范例定义的 CPU Utilization threshold 为 5 基本上只要给他一点压力 CloudWatch Alarm 就会有反应了,所以我们先给予他 CPU 40% 的压力作为测试给予压力的指令如:

$ stress-ng -c 1 -l 40
stress-ng: info:  [1084] defaulting to a 86400 second run per stressor
stress-ng: info:  [1084] dispatching hogs: 1 cpu
stress-ng: info:  [1084] successful run completed in 74.43s (1 min, 14.43 secs)

整理一下范例

今天的范例建立了

  • EC2
    • 放入 Default VPC 加速部署
    • 等级 t3a.nano
    • Security Group 22 全开
    • Image:AMAZON_LINUX_2
    • Subnet:PUBLIC
    • User Data:
      • amazon-linux-extras install epel -y
      • yum install stress-ng tmux htop -y
  • SNS
  • CloudWatch
  • Lambda
const vpc = ec2.Vpc.fromLookup(this, "VPC", {
  isDefault: true,
});

const securityGroup = new ec2.SecurityGroup(this, "SecurityGroup", {
  vpc,
  allowAllOutbound: true,
});
securityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(22));

const instance = new ec2.Instance(this, "Instance", {
  vpc,
  instanceType: ec2.InstanceType.of(
    ec2.InstanceClass.T3A,
    ec2.InstanceSize.NANO
  ),
  machineImage: ec2.MachineImage.latestAmazonLinux({
    generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
  }),
  securityGroup,
  vpcSubnets: {
    subnetType: ec2.SubnetType.PUBLIC,
  },
  keyName: "KeyPair",
});
instance.userData.addCommands(
  `amazon-linux-extras install epel -y`,
  `yum install stress-ng tmux htop -y`
);
new cdk.CfnOutput(this, "instance", {
  value: instance.instancePublicDnsName,
});

const topic = new sns.Topic(this, "Topic");

const metric = new cloudwatch.Metric({
  namespace: "AWS/EC2",
  metricName: "CPUUtilization",
  dimensions: {
    InstanceId: instance.instanceId,
  },
  period: cdk.Duration.minutes(1),
});

const alarm = new cloudwatch.Alarm(this, "Alarm", {
  metric,
  threshold: 5,
  evaluationPeriods: 1,
});

alarm.addAlarmAction(new cw_actions.SnsAction(topic));

const myFunction = new lambda.Function(this, "Lambda", {
  handler: "index.handler",
  runtime: lambda.Runtime.NODEJS_10_X,
  code: lambda.Code.fromAsset("lambda"),
  environment: {
    LINE_NOTIFY_TOKEN: "your-line-notify-token",
    DISCORD_URL: "your-discord-webhook-url",
  },
});
myFunction.addToRolePolicy(
  new iam.PolicyStatement({
    actions: ["cloudwatch:Get*"],
    resources: ["*"],
  })
);

topic.addSubscription(new subscriptions.LambdaSubscription(myFunction));

参考资料


今天介绍如何部署一个 CloudWatch Alarm 的含图告警,有机会我会在修改目前的程序让它变得更灵活使用或是支援更多的通讯程序,希望对大家有帮助 ~

想要看更多吗?欢迎到我的部落格参观

文章内容主要是网路或是程序开发类型的文章

本文同步刊载於 Clarence 部落格:Day 28 - 使用 CDK 创建 CloudWatch Alarm 的含图告警同时发送到 LINE 与 Discord


「AWS CDK 完全学习手册:打造云端基础架构程序码 IaC」
本书改编并延伸自第 12 届 iT 邦帮忙铁人赛获得 DevOps 组冠军的《用 CDK 定义 AWS 架构》系列文章,以简单、好读的行文风格详述技术细节,并提供完整的程序码范例与说明,一步一步带领新手从零开始踏上 AWS CDK 技术达人之路。

有兴趣的朋友欢迎至天珑书局选购!

购书连结 https://bit.ly/2ZMAebE

https://ithelp.ithome.com.tw/upload/images/20211103/20117701W7l6fQnn2L.jpg


<<:  Typescript (tsconfig.json)

>>:  Day 28:Visual Search Engine Within Elasticsearch

用这9种技巧让你的部落格有个好名字

一、前言 经营部落格,会是一个长期的网路事业,在初期有许多部分我认为就应该思考好,在整个经营路上才...

Day26 用python写UI-聊聊Text(三)

今天的程序码也超长的,因为范例有结合昨天的一起呈现,所以就越加越长了~ ♠♣今天的文章大纲♥♦ 储存...

Day29. 虽然今年是2021,但我们要做2048(3)

来到2048的最後一天!看看这麽多的删除线!虽然可能我们不一定能清光我们购物网站上的愿望清单,但是今...

Day05 - 使用 Link 实作换页

Link 在了解了 Next.js 的三种路由方式後,接下来就让我们来聊聊怎麽在 component...

DAY 1 系列文章启文

近年来 ROS (Robot Operating System,机器人作业系统) 目前已成熟应用於智...