【问题标题】:Using bash script in AWS infrastructure to install packages from Autoscalling Group tags在 AWS 基础设施中使用 bash 脚本从 Autoscaling Group 标签安装包
【发布时间】:2016-01-25 22:01:12
【问题描述】:

我正在尝试为 AWS Autoscaling Group 编写 bash 脚本。这意味着即使实例被终止,Autoscaling Group 也会通过包名称和值包编号从标签中重新安装实例和所有包。 这是来自 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”的用户数据标签中找到。因为我有几种类型的实例,每一种都带有其他几个包。

这是我第一次用 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

我有两个问题。首先,如果我以正确的方式这样做。其次,我如何获取包名称值的值(它是一些包版本)?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    首先,最佳做法是不要在脚本中包含 AWS 密钥。而是在启动时将 role 附加到您的实例(这可以在您的自动缩放组的启动配置中完成)。

    其次,你所做的是一种方法,它绝对可以工作。实现此目的的另一种方法(适当但稍微复杂一点)是使用像 puppet 或 AWS opsworks 这样的工具。

    但是,我并没有真正了解您在脚本中所做的事情,这似乎过于复杂:您为什么不在用户数据脚本中包含您的包名称?如果这只是更改/更新脚本时的敏捷性问题,您可以将此脚本外包给 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”?

    【讨论】:

    • 正如我在此解释的:“...Autoscaling Group 重新安装实例和所有来自标签的包名称和值包编号...”您可以在 AWS 文档中阅读有关 Autoscaling 组的信息。为什么我使用标签?当有人更改软件包版本时,它也会像这样更新标签:“/opt/aws/apitools/ec2/bin/ec2-create-tags”仅适用于 AutoscalingGroup
    • 谢谢,我在日常职业生涯中使用 ASG,不需要任何文档。我只是为您提供探索的见解:正如我所说,您的观点是正确的并且会起作用,但是您可以使用诸如 AWS opsworks 服务之类的东西做得更好。不确定我是否正确理解了您的第二个问题,也许这就是我们在这里误解的原因。我个人会依赖 S3 存储桶脚本/Opsworks 而不是标签来进行此配置,但这由您决定
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2023-01-02
    • 2021-01-25
    • 2014-04-15
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多