使用AWS基础结构中的bash脚本从Autoscalling Group标签安装软件包

时间:2016-01-25 08:03:53

标签: linux bash shell amazon-web-services aws-cli

我试图在bash中为AWS Autoscaling Group编写脚本。这意味着即使实例终止,Autoscaling Group也会按包名和Value Package号从标签重新安装实例和所有包。 以下是AWS Cloudformation模板中的LaunchConfiguration组:

"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}
            ]
        }
    }

所以,现在很难。现在我尝试在带有文本" worker"的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 个答案:

答案 0 :(得分:1)

首先,作为最佳做法,不要在脚本中包含AWS密钥。而是在启动时将High Availability and load balancing with round robin DNS, does it really work?附加到您的实例(这可以在您的自动缩放组的启动配置中完成)。

其次,你所做的是一种方法,它绝对可行。实现这一目标的另一种方法(适当但稍微复杂一点)是使用像puppet或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`

不确定为什么要使用“key = worker”进行过滤,而不是使用“WorkersScalingGroup”进行过滤

然后你调用下面的if条件:

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

(我假设这里有拼写错误,应该是PackageName),就在下面你打电话:

"worker-${PackageName}"

会给“ worker-worker ”?