我正在开发一些自动化脚本来引导我的应用程序,并将使用AWS中的自动缩放组来为我的应用程序启动/停止EC2实例。
我需要能够为遵循模式的机器重新创build一个一致的名称: MYAPP001 , MYAPP002 , MYAPP003 。
有没有办法在用户数据引导阶段查询元数据,以确定刚刚出现的这台机器是002组?
如果我能确定这一点,那么我可以将机器重命名为MYAPP002 。
设想一个第三方服务,希望机器被命名为MYAPP001 , MYAPP002 , MYAPP003 。 在此软件中,机器可以脱机并稍后以不同的IP地址重新联机。 但是, 不能让两台不同的计算机同时使用相同的主机名与此软件进行通信。
你确定这个信息甚至可以通过API获得吗? 我能想到的最好的办法是查询所有正在运行的实例的启动时间,然后确定哪个是“最新”的。
我不得不说,如果你依赖自动调节组中的任何特定于机器的状态,那么你做错了。 您的部署方法和应用程序应该被构build,使得所有的ASG实例完全相同,甚至是它们的主机名。 出于某种技术原因需要分配一个特定的主机名会回来困扰你。
把这看作是重构事物的一个机会,你不需要这样做。 构build您的应用程序,以便ASG可以根据需要创build和销毁实例,而无需担心所谓的每个主机。
作为一个思想实验,让我们来思考这个问题。 假设你用三个实例实例化一个ASG:ASG [01,02,03]。 在将来的某个时候,ASG02有问题并被终止。 ASG创build一个新的实例来取代它,现在是ASG04。 所以现在你有ASG [01,03,04]。 那是你的意图吗? 你为什么需要这些信息? 如上所述,如果你正在做的事情,你不需要这个信息,或不应该。 如果你只是为了人类可读的目的而做这件事,或者为了更好地跟踪事情,就放手让它去信任ASG去做。
好吧,它花了一些谷歌search,然后在AWS中旋转一些实例,进行远程处理和testing。 这是(非常简单的)回答感谢AWS:
http://169.254.169.254/latest/meta-data/ami-launch-index
而已。 这将返回启动顺序的“零基”索引。 这里是来自亚马逊的文档,他们提供了一个很好的用例,为什么你会需要这个:
这里是我用来获取我的机器名称的PowerShell脚本:
$index = (Invoke-WebRequest "http://169.254.169.254/latest/meta-data/ami-launch-index").Content $name = "MYAPP" + ([Int]::Parse($index) + 1).ToString("000")
可悲的是,这并不是非常成功,因为我的汽车规模小组创build了两个实例,都表示他们是“索引#0” – 我会继续努力,并用我的发现来调整答案。