我创建了一个这样的工作流程:
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秒的超时时间。所以即使我愿意花钱也行不通。克服这个问题的最简单方法是什么?
答案 0 :(得分:1)
我完成您的方案的方法可能是Cloudwatch事件规则。
建议表: 表结构取决于您,但这些是最重要的列。
------------------------------
| Instance_id | User_Id |
------------------------------
首先,选择事件类型:EC2 Instance State-change Notification
,然后选择特定状态:Running
:
其次,选择目标:Lambda function
:
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
。
希望有所帮助!