【问题标题】:Email notification through SNS and Lambda通过 SNS 和 Lambda 的电子邮件通知
【发布时间】:2019-02-11 04:12:17
【问题描述】:

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

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

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

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

如果您认为这对我的预期是否正确,请告诉我。并就如何在 Cloud watch 和 SNS 之间获取 Lambda 提供一些见解

感谢和问候

【问题讨论】:

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


    【解决方案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 主题 发送文本,该主题可以将信息转发给订阅者(通过电子邮件或短信),
    • 通过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 主题创建订阅者(最简单的方法是在测试时通过 SMS)
    • 创建 AWS Lambda 函数(如上所示)
    • 创建 Amazon CloudWatch 事件以触发 EC2 实例状态更改,并将目标设置为 Lambda 函数

    【讨论】:

    • 感谢@John 的指导。因为我不是编码员,并且发现很难为此目的写下一些 lambda 函数。您能否帮助获得一个这样的功能或任何您看到的具有相同方法的链接,以便我可以相应地使用和调整它。这会很有帮助。
    • 谢谢@John,我会试试这个代码。我还想澄清一件事。 lambda 函数需要 IAM 权限才能将数据发送到 SNS 并从 cloudwatch 获取数据?谢谢和问候
    • 它只需要 EC2 describe_instances 和 SNS publish 的权限。调用 Lambda 函数时会自动发送来自 CloudWatch 的信息,因此不需要调用 CloudWatch。
    • 感谢@John 的帮助和投入,您的代码对我有用 :) 您的 lambda 代码完成了我 80% 的工作。您能否建议我如何掌握 lambda 函数,任何链接,在线 pdf,我可以参考学习。谢谢和问候
    • 这只是用 Python、C#、使用 AWS 开发工具包的节点编写的普通代码,并带有一个事件作为输入。它实际上只是在文档中查找执行您想要的 AWS 函数,然后尝试解释返回的响应。
    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多