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

时间:2018-09-06 00:20:24

标签: amazon-web-services aws-lambda amazon-sns amazon-cloudwatch

我面临一个问题。我的主要目的是在ec2实例发生状态更改时发送电子邮件。

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

我期望电子邮件模板中的服务器名称及其IP,而SNS却没有让我修改它的选项。所以我在想让lambda参与进来

  • cloudwatch事件以监视EC2实例的状态更改和
  • 将输入提供给Lambda,它将具有自定义的电子邮件模板
  • 然后调用SNS将电子邮件发送给收件人。

请让我知道您是否认为这是符合我预期的正确方法。并提供一些有关如何在Cloud Watch和SNS之间使用Lambda的见解

感谢与问候

1 个答案:

答案 0 :(得分:1)

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主题,该主题可以将信息转发给订阅者(通过电子邮件或SMS), OR
  • 通过 Amazon Simple Email Service(SES)发送电子邮件,该服务可以发送格式复杂的电子邮件

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

这里有一些示例代码,它们将在实例更改状态时从Amazon CloudWatch 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 state\n' +
                  'State: ' + instance['State']['Name'] + '\n' +
                  'IP Address: ' + instance['PublicIpAddress'] + '\n' +
                  'Name: ' + name
    )

要设置:

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