AWS Cloudformation, как перезагрузить созданный экземпляр, а затем снова установить часть скрипта

Вот что я должен сделать:

  • Мне нужно создать экземпляр, используя шаблон облачного формирования EC2.
  • После определенной установки пакетов я люблю перезагружать инстанс через сам шаблон формирования облака.
  • После перезагрузки экземпляра мне нужно завершить выполнение оставшегося скрипта.

Пожалуйста, предложите мне, как это можно сделать.

Это мой текущий шаблон:


    {
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "",
  "Parameters": {
    "VPCID": {
      "Description": "The VPC for this  instance",
      "Type": "AWS::EC2::VPC::Id",
    },
    "SubnetID": {
      "Description": "The Subnet for this instance",
      "Type": "AWS::EC2::Subnet::Id",
    },
    "AllowedCIDR": {
      "Description": "IP address range (in CIDR notation) of the client that will be allowed to connect to the cluster using SSH e.g., 203.0.113.5/32",
      "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "Type": "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default": "10.0.0.0/16",
      "ConstraintDescription": "must be a valid CIDR range of the form x.x.x.x/x"
    },
    "SSHKeyName": {
      "Description": "The EC2 Key Pair to allow SSH access to the instance",
      "Type": "AWS::EC2::KeyPair::KeyName",
    },
    "TypeOfInstance": {
      "Type": "String",
      "Default": "t2.medium",
      "Description": "Enter t2.medium, t2.large, m3.large, m4.large, m4.xlarge, etc.",
      "ConstraintDescription": "Must be a valid EC2 instance type."
    }
  },
  "Resources": {
    "Ec2Instance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "SecurityGroupIds": [
          {
            "Ref": "InstanceSecurityGroup"
          }
        ],
        "KeyName": {
          "Ref": "SSHKeyName"
        },
        "ImageId": "ami-a8d369c0",
        "SubnetId": { "Ref": "SubnetID" },
        "InstanceType": { "Ref": "TypeOfInstance" },
        "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
          "#!/bin/bash -xe\n",
          "touch /tmp/testfile\n",
          "yum -y install rng-tools\n",
          "systemctl start rngd\n",
          "systemctl enable rngd\n",
          "yum update -y \n",

          "echo \"################### Install Packages #######################\"\n",


          "reboot \n",


          "echo \"################### Install Remaining packages and configuration #######################\"\n",

        ]]}}
    },
    "InstanceSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Enable SSH access via port 22",
        "VpcId" : {
          "Ref" : "VPCID"
        },
        "GroupName": "my-securitygroup",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": "22",
            "ToPort": "22",
            "CidrIp": "0.0.0.0/0"
          }
        ]
      }
    }
  }
}

person Abhi ji    schedule 25.11.2018    source источник
comment
Связано: serverfault.com/questions/148341/   -  person jarmod    schedule 26.11.2018


Ответы (2)


Так как у cloudformation нет возможности запускать сценарий пользовательских данных в середине пути после того, как экземпляр был остановлен, а затем перезапущен, вот один обходной путь, который я могу придумать.

Сохраните какой-нибудь флаг на экземпляре непосредственно перед перезагрузкой (пример cfn-userdata-script-continue). Загрузите оставшуюся часть вашего скрипта в экземпляр и сохраните его в заранее определенном месте.

После перезагрузки проверьте наличие этого флага. Если флаг существует, перейдите в место, где вы сохранили неполный сценарий. Запустите скрипт. Удалить флаг cfn-userdata-script

person Sushant Sonker    schedule 26.11.2018

Вы также можете использовать запланированные задачи в экземпляре EC2 для выполнения задач. Например. в винде можно настроить задачи на однократный запуск после перезагрузки.

person Juha Airaksinen    schedule 31.03.2021