Назад | Перейти на главную страницу

CloudFormation: как экспортировать переменную bash в пользовательские данные, чтобы переменные были доступны при запуске экземпляра?

Я написал следующий шаблон CloudFormation:

{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "company - LaunchConfiguration and AutoScalingGroup Template",

    "Parameters" : {

        "Vpc" : {
          "Type" : "AWS::EC2::VPC::Id"
          },

          "SecurityGroup" : {
            "Type" : "AWS::EC2::SecurityGroup::Id",
            "Description": "choose sg"
          },

          "Environment" : {
            "Type" : "String",
            "Description" : "Choose environment",
            "AllowedValues" : [ "dev", "stg", "prd" ],
            "Default" : "stg"
          },

          "VPCtoPeerto" : {
            "Type" : "String",
            "Description" : "Choose VPC to peer to",
            "AllowedValues" : [ "xsiteprd", "boostprd", "booststg", "xsitestg"],
            "Default" : "boostprd"
        },

        "ParentStackName": {
          "Description": "Name of an active CloudFormation stack that contains the networking resources, such as the subnet and security group, that will be used in this stack.",
          "Type": "String",
          "MinLength" : 1,
          "MaxLength" : 255,
          "AllowedPattern" : "^[a-zA-Z][-a-zA-Z0-9]*$",
          "Default" : "test"
       }
    },

    "Mappings" : {

    "AMIMap" : {
            "us-east-1" : { "amiid" : "ami-759bc50a" },
            "us-east-2" : { "amiid" : "ami-5e8bb23b" },
            "us-west-1" : { "amiid" : "ami-4aa04129" },
            "us-west-2" : { "amiid" : "ami-ba602bc2" },
            "eu-west-1" : { "amiid" : "ami-4aa04129" },
            "eu-central-1" : { "amiid" : "ami-de8fb135" },
            "eu-west-2" : { "amiid" : "ami-6b3fd60c" },
      "ap-northeast-1" : { "amiid" : "ami-98cfaa75" },
      "ap-southeast-1" : { "amiid" : "ami-1c106cf6" },
      "sa-east-1" : { "amiid" : "ami-8eecc9e2" }
        },

    "KeyName" : {
      "us-east-1" : { "key" : "va-ni" },
            "eu-west-2" : { "key" : "ni-uk" },
      "ap-southeast-1" : { "key" : "ni-au" },
      "sa-east-1" : { "key" : "ni-sp" },
      "eu-central-1" : { "key" : "ni-fr" }
    },

        "AsgSize" : {
            "dev"  : { "MinSize" :  1 , "MaxSize" : 2 },
            "stg" : { "MinSize" :  1 , "MaxSize" : 2 },
            "prd"  : { "MinSize" :  1 , "MaxSize" : 2 }
        },

        "PeeringVpcId" : {
            "xsiteprd" : { "VAVpcId" : "vpc-71e55e15" },
            "boostprd" : { "VAVpcId" : "vpc-1f0e197d" },
            "booststg" : { "VAVpcId" : "vpc-de5b15b9" },
            "xsitestg" : { "VAVpcId" : "vpc-25f59042" }
        }
  },

  "Resources" : {

    "AutoScalingGroup" : {
                "Type" : "AWS::AutoScaling::AutoScalingGroup",
                "Properties" : {
                    "VPCZoneIdentifier" : [ { "Fn::ImportValue" :  { "Fn::Sub" : "${ParentStackName}-SubnetOne" } }, { "Fn::ImportValue" :  { "Fn::Sub" : "${ParentStackName}-SubnetTwo" } }, { "Fn::ImportValue" :  { "Fn::Sub" : "${ParentStackName}-SubnetThree" } } ],
                    "LaunchConfigurationName" : { "Ref" : "LaunchConfiguration" },
                    "MinSize" : { "Fn::FindInMap" : [ "AsgSize", { "Ref" : "Environment" }, "MinSize" ] },
                    "MaxSize" : { "Fn::FindInMap" : [ "AsgSize", { "Ref" : "Environment" }, "MaxSize" ] },
                    "TerminationPolicies" : [ "NewestInstance" ],
                    "MetricsCollection": [
                        {
                            "Granularity": "1Minute",
                            "Metrics": []
                        }
                    ],
                    "Tags" : [
                        { "Key" : "Name", "Value" : { "Fn::Join" : [ "-", [ { "Ref" : "AWS::StackName" }, { "Fn::ImportValue" :  { "Fn::Sub" : "${ParentStackName}-Environment" } } ] ] }, "PropagateAtLaunch" : "true" }
                    ]
                }
    },

        "LaunchConfiguration" : {
            "Type" : "AWS::AutoScaling::LaunchConfiguration",
            "Properties" : {
                "ImageId" : { "Fn::FindInMap" : [ "AMIMap", { "Ref" : "AWS::Region" }, "amiid" ]},
                "InstanceType" : "t2.micro",
                "KeyName" : { "Fn::FindInMap" : [ "KeyName", { "Ref" : "AWS::Region" }, "key" ]},
                "AssociatePublicIpAddress" : "true",
                "SecurityGroups" : [ { "Fn::ImportValue" :  { "Fn::Sub" : "${ParentStackName}-SG" } } ],
                "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
          "#!/bin/bash -xe\n",
          "/usr/bin/cloud-init-per once apt-update apt-get update\n",
                    "/usr/bin/cloud-init-per once bootstrap-deps1 apt-get install python-pip jq python-setuptools heat-cfntools -y\n",
                    "/usr/bin/cloud-init-per once bootstrap-deps2 pip install awscli botocore boto \n",
                    "export LC_ALL=C\n",
                    "export vpcid=",{ "Ref" : "Vpc" }, "\n",
                    "export vpctopeer=",{ "Fn::FindInMap" : [ "PeeringVpcId", { "Ref" : "VPCtoPeerto" }, "VAVpcId" ] }, "\n",
                    "mkdir aws-cfn-bootstrap-latest\n",
                "curl https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz | tar xz -C aws-cfn-bootstrap-latest --strip-components 1\n",
                "easy_install aws-cfn-bootstrap-latest\n",
                "/usr/local/bin/cfn-init --stack ", { "Ref" : "AWS::StackName" }, " --resource ", { "Ref" : "AutoScalingGroup" } , " --region ", { "Ref": "AWS::Region" }, "\n",
        ]]}}
            }
        },

        "ServerProfile" : {
                "Type" : "AWS::IAM::InstanceProfile",
                "Properties" : {
                    "Path" : "/",
                    "Roles" : ["BackendServer"]
                }
        }
    }
}

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

Я хотел бы, чтобы экземпляр, который запускается в группе автоматического масштабирования, имел идентификаторы vpcid и vpcid однорангового vpc, заполненные в переменных среды.

Когда я проверяю /var/log/cloud-init.log, Я вижу это:

+ export LC_ALL=C
+ LC_ALL=C
+ export vpcid=vpc-aff8a6c4
+ vpcid=vpc-aff8a6c4
+ export vpctopeer=vpc-1f0e197d
+ vpctopeer=vpc-1f0e197d

Но переменные не экспортируются должным образом, потому что, когда я отправляю ssh на сервер, эти переменные не устанавливаются.

Я знаю, что могу повторить эти переменные в /etc/environment но мне кажется, что есть способ сделать это лучше.

Как лучше всего этого добиться?

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

Я считаю, что хранение переменных в / etc / environment - самый простой способ сделать эти переменные доступными на новых виртуальных машинах.

Вы можете использовать сценарий пользовательских данных для вывода данных в файл .sh на диске, а затем создать cron для выполнения cron - даже если вы решите не использовать этот долгий срок, я рекомендую это в качестве тестового шага, чтобы подтвердить, что user-data экспортирует правильные данные (т.е. вы можете указать файл .sh, чтобы убедиться, что правильные значения присутствуют в файле .sh)