Я написал следующий шаблон 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)