Вариант использования, который я выполняю:
- Создать экземпляр EC2
- В этом ожидании, пока этот экземпляр EC2 будет запущен и работает
- Развертывание сборки путем запуска сценария оболочки в экземпляре EC2
- Получите ответ об успешном выполнении сценария оболочки
- Завершить работу экземпляра
- После того, как экземпляр завершен, и ответ запускаемого сценария оболочки соответствует коду успеха, мне нужно запустить другой конвейер в Jenkins, который, в свою очередь, вызовет создание экземпляра EC2 и т. Д.
Основная цель ожидания:
- Если моя лямбда-функция завершится без выполнения всего кода, моя сборка не будет развернута, и будет запущен следующий конвейер jenkins (шаг 6), который я не хочу, пока я не завершу первое развертывание успешно.
- Если есть какая-либо ошибка в развертывании сборки (Шаг 3), она должна вернуть эту ошибку и не должна запускать мой следующий конвейер, с которым я не могу справиться, так как мой код ответа возвращается задолго до того, как будут запущены мои экземпляры EC2.
Я вызываю функцию Lambda из сценария оболочки (shellScript.sh), и команда для вызова приведена в следующем коде, который взят из документации AWS.
В лямбда-функции у меня есть следующий код Python, чтобы сначала создать экземпляр EC2, а затем определить, работает ли EC2 вместе с проверкой состояния 2/2, но он завершает работу и возвращает 200 успешных кодов в сценарий оболочки, когда «состояние экземпляра» показывает, что работает (Lambda продолжает работать с другими командами для запуска после того, что не упомянуто здесь, и состояние EC2 находится в состоянии инициализации).
Какую функцию API следует использовать для блокировки, пока в EC2 «проверка состояния» не отобразится «2/2 проверки пройдены»? (Я не хочу, чтобы моя лямбда-функция закрывалась до тех пор, пока в статусе не будет пройдено 2/2 проверки.)
Примечание. При ответе на печать отображается состояние «ОК»
Я ссылался на ссылку переполнения стека ниже и пробовал эти опции (как видно из моего кода ниже), но у меня это не сработало.
Как заблокировать, пока проверка состояния EC2 не пройдена с использованием 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)