0
votes

The Use case that I am executing is:

  1. Create EC2 instance
  2. In that wait till that EC2 instance is up and running
  3. Deploy build by running a shell script in EC2 instance
  4. Get the success response from shell script
  5. Terminate the instance
  6. After the instance is terminated and the response of running shell script is with success code I need to run different pipeline in Jenkins which will in turn call creating EC2 instance and so on.

The main purpose of waiting is:

  1. If my lambda function exit without executing the entire code my Build will not be deployed and next jenkins pipeline (step 6) will run which I don't want until I complete the first deployment successfully.
  2. If there is any error in build deploy (Step 3), it should return that error and should not run my next pipeline this I am not able to handle as my response code is returned well before my EC2 instances is running.

I am invoking the Lambda function from shell script (shellScript.sh), and the command to invoke is in below code which is from AWS documentation.

In the Lambda function I have following python code to create an EC2 instance first and then detect whether an EC2 is running along with 2/2 status check, but it exits and return 200 success code to shell script when "instance state" shows running (Lambda still continues with other commands to run after that which are not mentioned here and EC2 status is in Initializing state).

Which API function should I use to block until EC2 "status check" show "2/2 checks passed"? (I don't want my Lambda function to exit until the status shows 2/2 checks passed.)

Note: Print response gives the status of 'ok'

I referred to Stack overflow link below and tried those options (as seen in my code below) but it didn't work for me.

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)
1
Why do you wish to wait for the status checks to complete? Amazon EC2 status checks do not indicate that the operating system or any applications are "ready". What is your actual requirement for waiting? - John Rotenstein
You typically do not want Lambda functions to 'wait' because they are charged on a time basis. If you can explain your use-case better, we might be able to suggest an alternative approach. - John Rotenstein
The Use case that I am executing is: 1. Create EC2 instance 2. In that wait till that EC2 instance is up and running 3. Deploy build by running a shell script in EC2 instance 4. Get the success response from shell script 5. Terminate the instance 6. After the instance is terminated and the response of running shell script is with success code I need to run different pipeline in Jenkins which will in turn call creating EC2 instance and so on. - UNH Intern
The main purpose of waiting is: 1. If my lambda function exit without executing the entire code my Build will not be deployed and next jenkins pipeline (step 6) will run which I dont want untill I complete the first deployment successfully. 2. If there is any error in build deploy (Step 3), it should return that error and should not run my next pipeline this I am not able to handle as my response code is returned well before my EC2 instances is running. - UNH Intern

1 Answers

-1
votes

boto3 wait_until_running doesn't work as desired

@ UNH Intern,

Try the attached link and see if it is help in your case