Как передать код ошибки из пользовательских данных в конвейер кода, чтобы указать сбой - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть требование, где я буду загружать jar из s3 с другой версией для экземпляра ec2. Я сделаю это как часть раздела userdata. Работает нормально. Предположим, что если баночка недоступна, приложение не запускается. У меня есть проверка для этого и возвращаю не 0 (т. Е. Выход 1). В cloud-init-output.log я вижу сообщение об ошибке и выход из него с ненулевым значением. Но на стадии разработки это показывает успех. Ниже приведен пример кода: echo "Опубликовать проверки развертывания" если [netstat -ntpl | grep java | grep 8080 | wc -l -экв 0] затем echo "Приложение не слушает порт 8080" echo "Развертывание неудачно!" выход 1 еще echo "Приложение слушает порт 8080" фи

У меня вопрос: как я могу передать значение обратно в конвейер, чтобы обработка на этапе остановилась, если приложение не запущено.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

В вашем шаблоне CloudFormation можно дождаться получения сигнала, прежде чем завершить.Если этот сигнал не будет получен в течение времени ожидания, он откатит шаблон, и ваше развертывание не будет выполнено.Есть несколько способов сделать это.Вот некоторые варианты документации.

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-signal.html https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-waitcondition.html

Я бы предпочел первый вариант, просто добавьте CreationPolicy к экземпляру EC2 и затем укажите его в UserData.Например:

Resources:
  AppEC2Instance:
    Type: "AWS::EC2::Instance"
    CreationPolicy:
      ResourceSignal:
        Timeout: "PT5M"
    Properties:
      UserData:
        Fn::Base64:
          Fn::Join:
            - ""
            - - "#!/bin/bash -x\n"
              - "aws s3 sync s3://mybucket-id/ ./\n"
              - "java -jar ./app.jar\n"
              - "/opt/aws/bin/cfn-signal -e $? --stack ",
              - !Ref AWS::StackName
              - " --resource AppEC2Instance --region "
              - !Ref AWS::Region
              - "\n"

Использование -e $? должно предоставить код выхода обратно в стек, и, я надеюсь, затем вернет его обратно в конвейер.

0 голосов
/ 15 апреля 2019

Я могу придумать три варианта высокого уровня, чтобы вернуть отказ в конвейер:

  1. Узнайте, как завершить обновление стека CloudFormation при сбое в облачной инициализации.
  2. Добавьте последующее действие в конвейер (например, Lambda Invoke), где вы пишете некоторый код для сбоя действия в случае сбоя cloud-init.
  3. Используйте что-то вроде CodeDeploy для управления развертываниями в экземплярах EC2.
...