2016-01-25 3 views
0

Я пытаюсь написать скрипт в bash для AWS Autoscaling Group. Это означает, что даже если экземпляр завершен, Autoscaling Group переустанавливает экземпляр и все пакеты из тегов по имени пакета и номеру пакета значений. Вот LaunchConfiguration группа из AWS шаблона CloudFormation:Использование сценария bash в инфраструктуре AWS для установки пакетов из тегов Autoscalling Group

"WorkerLC": { 
    "Type" : "AWS::AutoScaling::LaunchConfiguration", 
    "Properties" : { 
    "ImageId": {"Ref" : "SomeAMI"}, 
    "InstanceType" : "m3.medium", 
    "SecurityGroups" : [{"Ref": "SecurityGroup"}], 
    "UserData" : { 
     "Fn::Base64": { 
     "Fn::Join": [ "", [ 
      {"Fn::Join": ["", ["Engine=", {"Ref": "Env"},".app.net"," \n"]]}, 
      {"Fn::Join": ["", [ 
      "#!/bin/bash\n", 
      "cd /app/\n", 
      "./worker-install-package.sh" 
      ]]} 
     ]] 
     } 
    } 
    } 
} 

И я хочу взять из тегов AutoscalingGroup как то:

"Worker": { 
     "Type" : "AWS::AutoScaling::AutoScalingGroup", 
     "Properties": { 
      "LaunchConfigurationName": {"Ref": "Worker"}, 
      "LoadBalancerNames": [{"Ref": "WorkerELB"}], 
      "AvailabilityZones": {"Ref": "AZs"}, 
      "MinSize" : "1", 
      "MaxSize" : "1", 
      "HealthCheckGracePeriod": 300, 
      "Tags" : [ 
       {"Key": "WorkersScalingGroup", "Value": {"Fn::Join": ["", ["Offering-", {"Ref": "Env"} "-Worker-1"]]}, "PropagateAtLaunch": true}, 
       {"Key": "EIP", "Value": {"Ref": "WorkerIP"}, "PropagateAtLaunch": true}, 
       {"Key": "Environment", "Value": {"Ref": "Env"}, "PropagateAtLaunch": true} 
      ] 
     } 
    } 

Итак, теперь сложная часть. Теперь я попытался найти в тегах Userdata текст «рабочий». Потому что у меня есть несколько типов экземпляров, и каждый из них поставляется с другими пакетами.

Это первый раз, когда я что-то написал в bash. Вот worker-install-package.sh:

#read tag for the installed package 
EC2_REGION='us-east-1' 
AWS_ACCESS_KEY='xxxxx' 
AWS_SECRET_ACCESS_KEY='xxxxxxxxxxxxxxxxxx' 
InstanceID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id` 

PackageName=`/opt/aws/apitools/ec2/bin/ec2-describe-tags -O $AWS_ACCESS_KEY -W $AWS_SECRET_ACCESS_KEY --filter resource-id=$InstanceID --filter key='worker' | cut -f5` 

while read line 
    if [ "$PackageNmae" = "worker" ]; then 
    sudo -- sh -c "./install-package.sh ${PackageName} ${Value}" 
    /opt/aws/apitools/ec2/bin/ec2-create-tags $InstanceID -O $AWS_ACCESS_KEY -W $AWS_SECRET_ACCESS_KEY --tag "worker-${PackageName}"=$Value 
    fi 
done 

У меня есть два вопроса. Во-первых, если я делаю это правильно. Во-вторых, как я могу оценить значение имени пакета (это некоторое количество версий пакета)?

Спасибо!

ответ

1

Прежде всего, в качестве лучшей практики не включайте в свой скрипт ключи AWS. Вместо этого добавьте role к вашему экземпляру при запуске (это можно сделать в конфигурации запуска вашей группы автомасштабирования).

Во-вторых, то, что вы делаете, это один из способов, и это определенно может работать. Другой способ (правильный, но немного более сложный) для достижения этой цели - использовать инструмент, подобный марионетке или AWS opsworks.

Тем не менее, я действительно не понимаю, что вы делаете в своем скрипте, которые кажутся слишком сложными для этой цели: почему вы не включаете имя своего пакета в свой скрипт userdata? Если это связано с изменением/обновлением сценария, вы можете передать этот сценарий в ведро S3 и загрузить/выполнить его экземпляры во время создания. Таким образом, вам не нужно читать из тегов.

Это было сказано и более как комментарий, если вы хотите оставаться в тегах, тогда я действительно не понимаю ваш сценарий. Если вам нужна помощь по сценарию, просьба предоставить более подробную информацию в этом смысле (например, образцы отладки и т. Д.):

при оценке PackageName, это работает?

PackageName=`/opt/aws/apitools/ec2/bin/ec2-describe-tags -O $AWS_ACCESS_KEY -W $AWS_SECRET_ACCESS_KEY --filter resource-id=$InstanceID --filter key='worker' | cut -f5` 

не знаю, почему вы фильтр с «ключ = рабочий», а не «WorkersScalingGroup»

Затем вы вызываете ниже, если условие:

if [ "$PackageNmae" = "worker" ]; then 

(я предполагаю, есть опечатка здесь и должны быть PACKAGENAME) и прямо под вами по телефону:

"worker-${PackageName}" 

который дал бы "рабочий-рабочий "?

+0

Как я объяснил здесь: «... Autoscaling Group переустанавливает экземпляр и все пакеты из тегов по имени пакета и номеру пакета значений ...». Вы можете прочитать об Autoscaling group в документах AWS. Почему я использую теги?Когда кто-то меняет версию пакета, он также обновляет тег: «/ opt/aws/apitools/ec2/bin/ec2-create-tags» только для AutoscalingGroup – muzafarow

+1

Спасибо, я использую ASG в своей повседневной профессиональной жизни и не нуждаюсь любой документ об этом. Я просто даю вам возможность изучить: как я говорю, ваше мнение правильно и будет работать, однако вы можете лучше использовать sth, например, службу AWS opsworks. Не уверен, что я правильно понимаю ваш второй вопрос, и, возможно, это причина нашего недоразумения здесь. Я лично полагался бы на скрипт ведро S3/Opsworks, а не на теги для этой цели конфигурации, но это зависит от вас, чтобы решить – Tom