实验3:使用通知去触发AWS Lambda

Using Notifications to Trigger AWS Lambda

实验目标

实验目标

  1. 配置一个auto Scaling 去触发notification
  2. 创建一个Lambda去响应 notification

实验目标架构

实验3:使用通知去触发AWS Lambda_第1张图片
实验目标架构

关键流程说明

  1. 一个Auto scaling group已经被配置好了;
  2. 将通过创建一个EC2实例来触发auto scaling服务来线性扩展;
  3. 这个将触发一个SNS(Amazon Simple Notification Service Topic);
  4. 这个SNS TOPIC会触发一个AWS Lambda函数,这个函数将会:
  • 创建一个EBS volumes snapshot,绑定到EC2实例上
  • 给实例增加一个tag
  • 将log信息发送到 AWS的CloudWatch logs上

操作步骤

创建一个SNS Topic

  1. 用途:用来接收Auto Scaling Group的提醒;
  2. 创建:点击菜单创建一个SNS topic,名字设置为ScaleEvent

配置 Auto Scaling 去发送事件通知

  1. 用途:当创建一个新的EC2实例到指定的Group中,自动触发一个通知到SNS
  2. 操作方式:选择EC2标签,选择到Auto Scaling Group,选择已经创建好的那个Auto Scaling Group:1
  3. 点击notification配置项,创建一个新的notification,对于“send notification to”这个标签,选择接收队列是ScaleEvent;
  4. 设置 只有“lannch(启动)”这个动作会触发通知;并保存;

创建一个IAM角色“Snap_and_Tag”,为了Lambda函数执行使用

  1. 用途:用于Lambda调用S3、DynamoDB等托管服务进行操作时的权限
  2. 操作方式:选择创建角色,选择场景是Lambda,权限设置选择“AmazonEC2FullAccess“、”AWSLambdaExecute”;

创建一个Lambda函数

  1. 用途:用于执行给新增的实例增加一个snapshot volume


    实验3:使用通知去触发AWS Lambda_第2张图片
    image.png
  2. 配置信息参考如下


    实验3:使用通知去触发AWS Lambda_第3张图片
    image.png

    这里选择了执行语言是python2.7,同时执行的角色是刚才创建的Snap_and_Tag

  3. 设置执行的python代码块
# Snap_and_Tag Lambda function
#
# This function is triggered when Auto Scaling launches a new instance.
# A snapshot of EBS volumes will be created and a tag will be added.

from __future__ import print_function

import json, boto3

def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))

    # Extract the EC2 instance ID from the Auto Scaling event notification
    message = event['Records'][0]['Sns']['Message']
    autoscalingInfo = json.loads(message)
    ec2InstanceId = autoscalingInfo['EC2InstanceId']

    # Snapshot all EBS volumes attached to the instance
    ec2 = boto3.resource('ec2')
    for v in ec2.volumes.filter(Filters=[{'Name': 'attachment.instance-id', 'Values': [ec2InstanceId]}]):
        description = 'Autosnap-%s-%s' % ( ec2InstanceId, v.volume_id )

        if v.create_snapshot(Description = description):
            print("\t\tSnapshot created with description [%s]" % description)

    # Add a tag to the EC2 instance: Key = Snapshots, Value = Created
    ec2 = boto3.client('ec2')
    response = ec2.create_tags(
        Resources=[ec2InstanceId],
        Tags=[{'Key': 'Snapshots', 'Value': 'Created'}]
    )
    print ("***Tag added to EC2 instance with id: " + ec2InstanceId)

    # Finished!
    return ec2InstanceId

这个脚本主要完成如下动作:从SNS中获取EC2实例的ID,创建一个snapshot,同时绑定到EC2上,给EC2创建一个Tag标识snapshot已经创建

  1. 填写function的基本信息
    Description:Snapshot and tag EC2 instance
    timeout:3 min 0 sec
  2. 添加触发器
    在触发器页面选择 SNS,设置SNS topic:ScaleEvent
  3. 保存Lambda函数,此时SNS触发的内容已经编写完成;

扩展Auto Scaling Group来触发函数

  1. 用途:通过扩展Auto Scaling Group来触发SNS,通过SNS的notification来调用 Lambda函数,创建Snapshot,并绑定到新增的EC2实例上
  2. 操作方式:选择EC2菜单,只需要更改Auto Scaling组的desired 数值即可,这里设置成“2”,这样就可以自动增加实例了。
  3. 查看过程:通过查看activity history的tab标签页面,查看状态,等到新的实例扩展完毕,我们可以查验 snapshot是否已经创建。
  4. 校验snapshot创建:通过点击snapshot查看是否已经创建了,并且了解tagname的是否已经被打上标签;

你可能感兴趣的:(实验3:使用通知去触发AWS Lambda)