【问题标题】:How to wait untill EC2 (created in Lambda) 2/2 status check is passed in Python using Boto3 and Calling Lambda function from Shell script如何等到 EC2(在 Lambda 中创建)2/2 状态检查在 Python 中使用 Boto3 并从 Shell 脚本调用 Lambda 函数
【发布时间】:2019-11-21 19:07:10
【问题描述】:

我正在执行的用例是:

  1. 创建 EC2 实例
  2. 等待 EC2 实例启动并运行
  3. 通过在 EC2 实例中运行 shell 脚本来部署构建
  4. 从shell脚本获取成功响应
  5. 终止实例
  6. 实例终止并且运行 shell 脚本的响应为成功代码后,我需要在 Jenkins 中运行不同的管道,这将依次调用创建 EC2 实例等。

等待的主要目的是:

  1. 如果我的 lambda 函数在没有执行整个代码的情况下退出,我的 Build 将不会被部署并且下一个 jenkins 管道(步骤 6)将运行,直到我成功完成第一次部署。
  2. 如果在构建部署(步骤 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


【解决方案1】:

boto3 wait_until_running doesn't work as desired

@UNH 实习生,

试试附加的链接,看看对你的情况是否有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 2022-01-04
    • 2019-11-14
    • 2020-11-12
    • 2019-11-10
    • 2019-09-10
    • 2016-08-06
    • 1970-01-01
    相关资源
    最近更新 更多