Cloudformation с ошибками бросания Ubuntu

Я немного читал и пришел к выводу, что если вы хотите использовать launchConfig с Ubuntu, вам нужно будет установить файл cfn-init самостоятельно, что я и сделал:

  "Properties" : {
    "KeyName" : { "Ref" : "KeyName" },
    "SpotPrice" : "0.05",
    "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" },
                                      { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" },
                                      "Arch" ] } ] },
    "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
    "InstanceType" : { "Ref" : "InstanceType" },
    "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
      "#!/bin/bash\n",
      "apt-get -y install python-setuptools\n",
      "easy_install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-1.0-6.tar.gz\n",
      "cfn-init ",
      "         --stack ", { "Ref" : "AWS::StackName" },
      "         --resource LaunchConfig ",
      "         --configset ALL",
      "         --access-key ", { "Ref" : "WorkerKeys" },
      "         --secret-key ", {"Fn::GetAtt": ["WorkerKeys", "SecretAccessKey"]},
      "         --region ", { "Ref" : "AWS::Region" }, " || error_exit 'Failed to run cfn-init'\n"
    ]]}}

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

Jun 15 12:02:34 ip-0 [CLOUDINIT] __init__.py[DEBUG]: config-scripts-per-once already ran once
Jun 15 12:02:34 ip-0 [CLOUDINIT] __init__.py[DEBUG]: handling scripts-per-boot with freq=None and args=[]
Jun 15 12:02:34 ip-0 [CLOUDINIT] __init__.py[DEBUG]: handling scripts-per-instance with freq=None and args=[]
Jun 15 12:02:34 ip-0 [CLOUDINIT] __init__.py[DEBUG]: handling scripts-user with freq=None and args=[]
Jun 15 12:02:34 ip-0 [CLOUDINIT] cc_scripts_user.py[WARNING]: failed to run-parts in /var/lib/cloud/instance/scripts
Jun 15 12:02:34 ip-0 [CLOUDINIT] __init__.py[WARNING]: Traceback (most recent call last):#012  File "/usr/lib/python2.7/dist-packages/cloudinit/CloudConfig/__init__.py", line 117, in run_cc_modules#012    cc.handle(name, run_args, freq=freq)#012  File "/usr/lib/python2.7/dist-packages/cloudinit/CloudConfig/__init__.py", line 78, in handle#012    [name, self.cfg, self.cloud, cloudinit.log, args])#012  File "/usr/lib/python2.7/dist-packages/cloudinit/__init__.py", line 326, in sem_and_run#012    func(*args)#012  File "/usr/lib/python2.7/dist-packages/cloudinit/CloudConfig/cc_scripts_user.py", line 31, in handle#012    util.runparts(runparts_path)#012  File "/usr/lib/python2.7/dist-packages/cloudinit/util.py", line 223, in runparts#012    raise RuntimeError('runparts: %i failures' % failed)#012RuntimeError: runparts: 1 failures
Jun 15 12:02:34 ip-0 [CLOUDINIT] __init__.py[ERROR]: config handling of scripts-user, None, [] failed
Jun 15 12:02:34 ip-0 [CLOUDINIT] __init__.py[DEBUG]: handling keys-to-console with freq=None and args=[]
Jun 15 12:02:34 ip-0 [CLOUDINIT] __init__.py[DEBUG]: handling phone-home with freq=None and args=[]
Jun 15 12:02:34 ip-0 [CLOUDINIT] __init__.py[DEBUG]: handling final-message with freq=None and args=[]
Jun 15 12:02:34 ip-0 [CLOUDINIT] cloud-init-cfg[ERROR]: errors running cloud_config [final]: ['scripts-user']

Я понятия не имею, что означает пользователь сценариев, и Google здесь тоже мало помогает. Я могу, когда я ssh на сервер, увидеть, что он запускает сценарий userdata, так как я могу получить доступ к cfn-init как команда, тогда как я не могу в исходном AMI, из которого сделан экземпляр.

Однако у меня есть запуск Config:

    "Comment" : "Install a simple PHP application",
    "AWS::CloudFormation::Init" : {
      "configSets" : {
        "ALL" : ["WorkerRole"]
      },
      "WorkerRole" : {
        "files" : {
          "/etc/cron.d/worker.cron" : {
            "content" : "*/1 * * * * ubuntu /home/ubuntu/worker_cron.php &> /home/ubuntu/worker.log\n",
            "mode"    : "000644",
            "owner"   : "root",
            "group"   : "root"
          },

          "/home/ubuntu/worker_cron.php" : {
            "content" : { "Fn::Join" : ["", [
                "#!/usr/bin/env php",
                "<?php",
                "define('ROOT', dirname(__FILE__));",
                "const AWS_KEY = \"", { "Ref" : "WorkerKeys" }, "\";",
                "const AWS_SECRET = \"", { "Fn::GetAtt": ["WorkerKeys", "SecretAccessKey"]}, "\";",
                "const QUEUE = \"", { "Ref" : "InputQueue" }, "\";",
                "exec('git clone x '.ROOT.'/worker');",
                "if(!file_exists(ROOT.'/worker/worker_despatcher.php')){",
                "echo 'git not downloaded right';",
                "exit();",
                "}",
                "echo 'git downloaded';",
                "include_once ROOT.'/worker/worker_despatcher.php';"
            ]]},
            "mode"    : "000755",
            "owner"   : "ubuntu",
            "group"   : "ubuntu"
          }
        }
      }
    }

Который, кажется, не работает вообще. Я проверил наличие файлов в моем домашнем каталоге, и его там нет. Я проверил запись cronjob, и ее там тоже нет. После прочтения документации я не могу понять, что может быть не так с моим кодом.

Есть мысли о том, почему это не работает? Я что-то упустил?

1 ответ

Решение

Хорошо решено.

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

"LaunchConfig" : {
  "Type" : "AWS::AutoScaling::LaunchConfiguration",
  "Metadata" : {
    "Comment" : "Install a simple PHP application",
    "AWS::CloudFormation::Init" : {
       "config" : {
        "files" : {
          "/etc/cron.d/worker" : {
            "content" : "*/1 * * * * ubuntu /home/ubuntu/worker_cronjob &> /home/ubuntu/worker.log\n",
            "mode"    : "000644",
            "owner"   : "root",
            "group"   : "root"
          },

          "/home/ubuntu/worker_cronjob" : {
            "content" : { "Fn::Join" : ["", [
                "#!/usr/bin/env php\n",
                "<?php\n",
                "define('ROOT', dirname(__FILE__));",
                "const AWS_KEY = \"", { "Ref" : "WorkerKeys" }, "\";",
                "const AWS_SECRET = \"", { "Fn::GetAtt": ["WorkerKeys", "SecretAccessKey"]}, "\";",
                "const QUEUE = \"", { "Ref" : "InputQueue" }, "\";",
                "exec('git clone x '.ROOT.'/worker');",
                "if(!file_exists(ROOT.'/worker/worker_despatcher.php')){",
                "echo 'git not downloaded right';",
                "exit();",
                "}",
                "echo 'git downloaded';",
                "include_once ROOT.'/worker/worker_despatcher.php';"
            ]]},
            "mode"    : "000755",
            "owner"   : "ubuntu",
            "group"   : "ubuntu"
          }
        }
      }
    }
  },

И мои userdata для:

    "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
      "#!/bin/bash\n",
      "apt-get -y install python-setuptools\n",
      "easy_install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
      "cfn-init -v ",
      "         -s ", { "Ref" : "AWS::StackName" },
      "         -r LaunchConfig ",
      "         --access-key ", { "Ref" : "WorkerKeys" },
      "         --secret-key ", {"Fn::GetAtt": ["WorkerKeys", "SecretAccessKey"]},
      "         --region ", { "Ref" : "AWS::Region" }, "\n"
    ]]}

И сейчас все работает, денди.

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

Спасибо за помощь:)

Другие вопросы по тегам