实例可用时AWS触发器

时间:2018-01-16 17:36:00

标签: amazon-web-services amazon-ec2 lambda

我创建了一个这样的工作流程:

  • 通过API网关端点使用请求创建实例
  • 网关调用执行以下代码的lamda函数
  • 使用公共DNS生成RDP以将其提供给用户,以便他们可以连接。

    ec2 = boto3.resource('ec2', region_name='us-east-1')
    instances = ec2.create_instances(...)
    instance = instances[0]
    time.sleep(3)
    instance.load()
    return instance.public_dns_name

这种方法的问题是用户必须等待将近2分钟才能成功登录。我完全可以通过添加以下代码让lamda运行:

instance.wait_until_running()

但不幸的是,API网关对于lambda集成有29秒的超时时间。所以即使我愿意花钱也行不通。克服这个问题的最简单方法是什么?

1 个答案:

答案 0 :(得分:1)

我完成您的方案的方法可能是Cloudwatch事件规则。

  • 创建实例后的lambda函数必须存储实例和用户之间的一种关系,如下所示:

建议表: 表结构取决于您,但这些是最重要的列。

------------------------------
| Instance_id   |  User_Id   |
------------------------------
  • 创建CloudWatch事件规则以执行Lambda函数。

首先,选择事件类型:EC2 Instance State-change Notification,然后选择特定状态:Running

enter image description here

其次,选择目标:Lambda function

enter image description here

  • Lambda函数向用户发送电子邮件。

Lambda函数将收到InstanceId。使用该信息,您可以找到相关的User_Id并将必要的信息发送给用户。您可以使用SDK获取EC2实例的信息,例如,public_dns_name

这是Cloudwatch事件规则通知将发送的有效负载示例:

{
  "version": "0",
  "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718",
  "detail-type": "EC2 Instance State-change Notification",
  "source": "aws.ec2",
  "account": "111122223333",
  "time": "2015-12-22T18:43:48Z",
  "region": "us-east-1",
  "resources": [
    "arn:aws:ec2:us-east-1:123456789012:instance/i-12345678"
  ],
  "detail": {
    "instance-id": "i-12345678",
    "state": "running"
  }
}

这样,您可以在实例完全投入使用时发送public_dns_name

希望有所帮助!