通过 SNS 和 Lambda 的电子邮件通知



我遇到了一个问题。我的主要动机是在 ec2 实例发生状态更改时发送电子邮件。

我直接尝试了SNS及其工作的云监视事件,但是我收到的电子邮件模板没有适当的信息来理解。

我期待电子邮件模板中的服务器名称及其IP,SNS没有给我修改它的选项。所以我的想法是涉及lambda,以便

  • 用于监控 EC2 实例状态更改和
  • 向 Lambda 提供输入,该 Lambda 将具有自定义的电子邮件模板,即
  • 然后调用 SNS 向收件人发送电子邮件。

如果您认为这是我所期望的正确方法,请告诉我。 并就如何在云观察和 SNS 之间获取 Lambda 提供一些见解

感谢和问候

Amazon CloudWatch Events控制台所示,由实例状态更改触发的示例事件为:

{
"version": "0",
"id": "7bf73129-1428-4cd3-a780-95db273d1602",
"detail-type": "EC2 Instance State-change Notification",
"source": "aws.ec2",
"account": "123456789012",
"time": "2015-11-11T21:29:54Z",
"region": "us-east-1",
"resources": [
"arn:aws:ec2:us-east-1:123456789012:instance/i-abcd1111"
],
"detail": {
"instance-id": "i-abcd1111",
"state": "pending"
}
}

然后,CloudWatch 事件可以直接触发 AWS Lambda 函数,传入此信息。

Lambda 函数可以使用实例 ID 检索有关实例的更多详细信息(例如服务器名称、IP 地址(。

然后,该函数可以:

  • Amazon SNS主题发送文本,该主题可以将信息转发给订阅者(通过电子邮件或短信(,或者
  • 通过亚马逊简单电子邮件服务(SES(发送电子邮件,该服务可以发送格式复杂的电子邮件

如果您不介意基于文本的内容,使用SNS 将是最简单的

下面是一些示例代码,当实例更改状态时,这些代码将从 AmazonCloudWatch Events 接收事件,然后向 Amazon SNS 主题发送一条消息,其中包含更多详细信息:

import boto3
def lambda_handler(event, context):
# Extract Instance ID from event
instance_id = event['detail']['instance-id']
# Obtain information about the instance
ec2_client = boto3.client('ec2')
instance_info = ec2_client.describe_instances(InstanceIds=[instance_id])
instance = instance_info['Reservations'][0]['Instances'][0]
# Extract name tag
name_tags = [t['Value'] for t in instance['Tags'] if t['Key']=='Name']
name = name_tags[0] if name_tags is not None else ''
# Send message to SNS
MY_SNS_TOPIC_ARN = 'arn:aws:sns:ap-southeast-2:123456789012:foo'
sns_client = boto3.client('sns')
sns_client.publish(
TopicArn = MY_SNS_TOPIC_ARN,
Subject = 'Instance Change State: ' + instance_id,
Message = 'Instance: ' + instance_id + ' has changed staten' +
'State: ' + instance['State']['Name'] + 'n' +
'IP Address: ' + instance['PublicIpAddress'] + 'n' +
'Name: ' + name
)

要设置:

  • 创建 SNS 主题以接收消息并将主题 ARN 放入代码中
  • 创建SNS主题的订阅者(最简单的方法是在测试时通过短信(
  • 创建 AWS Lambda 函数(如上所示(
  • 创建 Amazon CloudWatch 事件以触发 EC2 实例状态更改,并将目标设置为 Lambda 函数

示例代码如下所示。这对你真的很有帮助。

import boto3
import json
def lambda_handler(event, context):
#print(event)
test={}
test['instanceID']=event['detail']['configuration']['metrics'][0]['metricStat']['metric']['dimensions']['InstanceId']
test['CPUALARM']='The CPU of the'+ test['instanceID']+'has gone above 80%'
ec2_client = boto3.client('ec2')
instance_info = ec2_client.describe_instances(InstanceIds=[str(test['instanceID'])])
print(instance_info)
sns_client = boto3.client('sns')
response=sns_client.publish(
TopicArn = 'arn:aws:sns:us-east-1:1234567890:test',
Subject = 'CPU-ALARM: ' + test['instanceID'],
Message = str(test)
)
print(response)
return {
'statusCode': 200,
'body': test
}

相关内容

最新更新