如何等待直到在Python中使用Boto3并从Shell脚本调用Lambda函数传递EC2(在Lambda中创建)2/2状态检查

如何等待直到在Python中使用Boto3并从Shell脚本调用Lambda函数传递EC2(在Lambda中创建)2/2状态检查,python,amazon-web-services,boto3,Python,Amazon Web Services,Boto3,我正在执行的用例是: 创建EC2实例 在这种情况下,等待EC2实例启动并运行 通过在EC2实例中运行shell脚本来部署构建 从shell脚本获取成功响应 终止实例 在实例终止并且运行shell脚本的响应是成功代码之后,我需要在Jenkins中运行不同的管道,这将依次调用创建EC2实例等等 等待的主要目的是: 如果我的lambda函数在没有执行整个代码的情况下退出,那么我的构建将不会被部署,并且下一个jenkins管道(步骤6)将运行,直到我成功完成第一个部署为止 如果build deploy(

我正在执行的用例是:

  • 创建EC2实例
  • 在这种情况下,等待EC2实例启动并运行
  • 通过在EC2实例中运行shell脚本来部署构建
  • 从shell脚本获取成功响应
  • 终止实例
  • 在实例终止并且运行shell脚本的响应是成功代码之后,我需要在Jenkins中运行不同的管道,这将依次调用创建EC2实例等等

  • 等待的主要目的是:

  • 如果我的lambda函数在没有执行整个代码的情况下退出,那么我的构建将不会被部署,并且下一个jenkins管道(步骤6)将运行,直到我成功完成第一个部署为止
  • 如果build deploy(步骤3)中有任何错误,它应该返回该错误,并且不应该运行我无法处理的下一个管道,因为我的响应代码在EC2实例运行之前就返回了
  • 我正在从shell脚本(shellScript.sh)调用Lambda函数,要调用的命令位于AWS文档中的以下代码中

    在Lambda函数中,我使用以下python代码首先创建一个EC2实例,然后检测EC2是否与2/2状态检查一起运行,但当“实例状态”显示正在运行时,它退出并向shell脚本返回200个成功代码(Lambda仍然继续执行其他命令,在这里没有提到的命令之后运行,并且EC2状态处于初始化状态)

    在EC2“状态检查”显示“2/2检查通过”之前,我应该使用哪个API函数来阻止?(在状态显示“2/2检查通过”之前,我不希望Lambda函数退出。)

    注意:打印响应给出“确定”状态

    我参考了下面的Stack overflow链接并尝试了这些选项(如下面的代码所示),但它对我不起作用

    ShellScript.sh:

    aws lambda invoke --invocation-type RequestResponse --function-name <my-function-name> --payload '{"Key": "'$value'"}' /dev/stdout
    
    aws lambda invoke--调用类型RequestResponse--函数名--有效负载“{”Key:“$value'}”/dev/stdout
    
    Lambda_function.py:

    instance=EC2.run\u实例(
    ImageId=,
    InstanceType=,
    MinCount=1,
    MaxCount=1,
    .......
    )
    实例id=instance['Instances'][0]['InstanceId']
    ec2instance=ec2.Instance(id=Instance\u id)
    ec2instance.等待\u直到\u运行()
    服务员=EC2.get\u服务员('instance\u status\u ok')
    服务员,等等(
    InstanceId=[instance_id],
    服务员配置={
    “延迟”:15,
    “最大尝试数”:40
    },
    includealInstances=True
    )
    响应=EC2.description\u实例\u状态(
    InstanceId=[instance_id],
    includealInstances=True
    )
    打印(答复)
    

    @UNH实习生


    请尝试附加的链接,看看它对您的情况是否有帮助

    为什么要等待状态检查完成?Amazon EC2不表示操作系统或任何应用程序已“就绪”。您对等待的实际要求是什么?您通常不希望Lambda函数“等待”,因为它们是按时间计费的。如果您能更好地解释您的用例,我们可能会建议一种替代方法。我正在执行的用例是:1.创建EC2实例2。在这种情况下,请等待EC2实例启动并运行g 3.通过在EC2实例4中运行外壳脚本来部署构建。从外壳脚本5中获得成功响应。终止实例6。在实例终止并且运行外壳脚本的响应带有成功代码之后,我需要在Jenkins中运行不同的管道,这将依次调用创建EC2实例等。主要目的是f等待是:1.如果我的lambda函数在没有执行整个代码的情况下退出,我的构建将不会部署,下一个jenkins管道(步骤6)将运行,我不希望运行,直到我成功完成第一个部署。2.如果构建部署中有任何错误(步骤3),它应该返回该错误,并且不应该运行我无法处理的下一个管道,因为我的响应代码是在EC2实例运行之前返回的。