【发布时间】:2019-11-21 19:07:10
【问题描述】:
我正在执行的用例是:
- 创建 EC2 实例
- 等待 EC2 实例启动并运行
- 通过在 EC2 实例中运行 shell 脚本来部署构建
- 从shell脚本获取成功响应
- 终止实例
- 实例终止并且运行 shell 脚本的响应为成功代码后,我需要在 Jenkins 中运行不同的管道,这将依次调用创建 EC2 实例等。
等待的主要目的是:
- 如果我的 lambda 函数在没有执行整个代码的情况下退出,我的 Build 将不会被部署并且下一个 jenkins 管道(步骤 6)将运行,直到我成功完成第一次部署。
- 如果在构建部署(步骤 3)中出现任何错误,它应该返回该错误并且不应该运行我的下一个管道,这是我无法处理的,因为我的响应代码在我的 EC2 实例运行之前就返回了。
我正在从 shell 脚本 (shellScript.sh) 调用 Lambda 函数,要调用的命令在下面的代码中,该代码来自 AWS 文档。
在 Lambda 函数中,我首先使用 python 代码创建 EC2 实例,然后检测 EC2 是否正在运行以及 2/2 状态检查,但是当“实例状态”时它退出并向 shell 脚本返回 200 成功代码显示正在运行(Lambda 仍会继续执行其他未在此处提及的命令运行,并且 EC2 状态处于 Initializing 状态)。
在 EC2“状态检查”显示“2/2 检查通过”之前,我应该使用哪个 API 函数来阻止? (在状态显示 2/2 检查通过之前,我不希望我的 Lambda 函数退出。)
注意:打印响应给出的状态为 'ok'
我参考了下面的堆栈溢出链接并尝试了这些选项(如下面的代码所示),但它对我不起作用。
How to block until EC2 status check is passed using Python Boto3?
ShellScript.sh:
aws lambda invoke --invocation-type RequestResponse --function-name <my-function-name> --payload '{"Key": "'$value'"}' /dev/stdout
Lambda_function.py:
instance = EC2.run_instances(
ImageId=<image-id>,
InstanceType=<instance-type>,
MinCount=1,
MaxCount=1,
.......
)
instance_id = instance['Instances'][0]['InstanceId']
ec2instance = ec2.Instance(id=instance_id)
ec2instance.wait_until_running()
waiter = EC2.get_waiter('instance_status_ok')
waiter.wait(
InstanceIds=[instance_id],
WaiterConfig={
'Delay': 15,
'MaxAttempts': 40
},
IncludeAllInstances = True
)
response = EC2.describe_instance_status(
InstanceIds=[instance_id],
IncludeAllInstances=True
)
print(response)
【问题讨论】:
-
为什么要等待状态检查完成? Amazon EC2 status checks 并不表示操作系统或任何应用程序已“准备就绪”。您对等待的实际要求是什么?
-
您通常不希望 Lambda 函数“等待”,因为它们是按时间收费的。如果您能更好地解释您的用例,我们或许可以建议一种替代方法。
-
我正在执行的用例是: 1. 创建 EC2 实例 2. 等待 EC2 实例启动并运行 3. 通过在 EC2 实例中运行 shell 脚本来部署构建 4. 获取来自 shell 脚本的成功响应 5. 终止实例 6. 在实例终止并且运行 shell 脚本的响应为成功代码后,我需要在 Jenkins 中运行不同的管道,这将依次调用创建 EC2 实例等等。
-
等待的主要目的是: 1. 如果我的 lambda 函数退出而不执行整个代码,我的 Build 将不会被部署并且下一个 jenkins 管道(步骤 6)将运行,直到我完成第一次部署成功。 2. 如果构建部署(第 3 步)中有任何错误,它应该返回该错误并且不应该运行我的下一个管道,这是我无法处理的,因为我的响应代码在我的 EC2 实例运行之前就返回了。跨度>
标签: python amazon-web-services boto3