Шаблон Cloudformation завершает развертывание до завершения UserData - PullRequest
2 голосов
/ 24 февраля 2020

В развернутом шаблоне CloudFormation я запускаю несколько команд в блоке UserData. Одна из этих команд запускает сеанс для NICE DCV: https://aws.amazon.com/hpc/dcv/

Это выглядит следующим образом:

"UserData": {
    "Fn::Base64" : {
        "Fn::Join" : [
        "",
        [
        dcv create-session --type virtual ",
        " --owner ubuntu",
        " --user ubuntu",
        " my-session, "\n",
        "while ! (dcv list-sessions | grep -q 'my-session'); do sleep 1; done\n"
        ]
        ]
     }
}

Сначала я создаю сеанс с командой:

$ dcv create-session --type virtual --owner ubuntu --user ubuntu my-session

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

$ while ! (dcv list-sessions | grep -q 'my-session'); do sleep 1; done

Проблема, с которой я сталкиваюсь, заключается в том, что, как мне кажется, шаблон CloudFormation завершает развертывание до скрипт UserData завершает работу. Я полагаю, что это так, потому что, если я достаточно быстр и вникну в экземпляр, я увижу что-то следующее:

$ dcv list-sessions
There are no sessions available
$ dcv list-sessions
There are no sessions available
$ dcv list-sessions
There are no sessions available
$ dcv list-sessions
There are no sessions available
$ dcv list-sessions
Session: 'my-session' (owner: ubuntu)

, что говорит о том, что что-то все еще работает в экземпляре.


Как я могу убедиться, что код UserData действительно соблюдается?

1 Ответ

3 голосов
/ 25 февраля 2020

Чтобы шаблон CloudFormation ожидал завершения сценария UserData, необходимо сделать две вещи:

  1. Добавить CreationPolicy к целевому ресурсу (виртуальная машина в моем случае).

  2. Добавьте logi c в скрипт, чтобы сообщить о его завершении. Этот пользовательский лог c использует утилиту cfn-signal , которую вам, возможно, придется установить в своем экземпляре.


Вот как теперь выглядит шаблон :

"UserData": {
    "Fn::Base64" : {
        "Fn::Join" : [
        "",
        [
           "curl --silent --show-error --retry 5 https://bootstrap.pypa.io/get-pip.py | sudo python\n",
           "curl https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz -o /home/ubuntu/aws-cfn-bootstrap.tar.gz\n",
           "tar -xvzf /home/ubuntu/aws-cfn-bootstrap.tar.gz -C /home/ubuntu/\n",
           "rm /home/ubuntu/aws-cfn-bootstrap.tar.gz\n",
           "chmod +x /home/ubuntu/aws-cfn-bootstrap-*/bin/cfn-signal\n",
           "pip install /home/ubuntu/aws-cfn-bootstrap-*\n",
           "dcv create-session --type virtual ",
           " --owner ubuntu",
           " --user ubuntu",
           " my-session, "\n",
           "while ! (dcv list-sessions | grep -q 'my-session'); do sleep 1; done\n"
           "/home/ubuntu/aws-cfn-bootstrap-*/bin/cfn-signal -e $? ",
           " --stack ", { "Ref": "AWS::StackName" },
           " --resource MyInstance" ,
           " --region ", { "Ref" : "AWS::Region" }, "\n"
        ]
        ]
     }
},
"CreationPolicy": {
        "ResourceSignal" : {
            "Count": "1",
            "Timeout": "PT5M"
     }
}

Разрушение сценария.

Эта команда извлекает и устанавливает набор инструментов aws -cfn , необходимый для cfn -signal :

"curl --silent --show-error --retry 5 https://bootstrap.pypa.io/get-pip.py | sudo python\n",
"curl https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz -o /home/ubuntu/aws-cfn-bootstrap.tar.gz\n",
"tar -xvzf /home/ubuntu/aws-cfn-bootstrap.tar.gz -C /home/ubuntu/\n",
"rm /home/ubuntu/aws-cfn-bootstrap.tar.gz\n",
"chmod +x /home/ubuntu/aws-cfn-bootstrap-*/bin/cfn-signal\n",
"pip install /home/ubuntu/aws-cfn-bootstrap-*\n",

Это мой пользовательский сценарий, который я хочу убедиться, что он завершен до того, как формирование облака завершит развертывание:

"dcv create-session --type virtual ",
" --owner ubuntu",
" --user ubuntu",
" my-session, "\n",
"while ! (dcv list-sessions | grep -q 'my-session'); do sleep 1; done\n"

Наконец, я использую cfn-signal утилита для оповещения о завершении скрипта:

"/home/ubuntu/aws-cfn-bootstrap-*/bin/cfn-signal -e $? ",
" --stack ", { "Ref": "AWS::StackName" },
" --resource MyInstance" ,
" --region ", { "Ref" : "AWS::Region" }, "\n"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...