![如何确定自动扩展组中的 EC2 实例索引/位置?](https://linux22.com/image/707554/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E8%87%AA%E5%8A%A8%E6%89%A9%E5%B1%95%E7%BB%84%E4%B8%AD%E7%9A%84%20EC2%20%E5%AE%9E%E4%BE%8B%E7%B4%A2%E5%BC%95%2F%E4%BD%8D%E7%BD%AE%EF%BC%9F.png)
我正在编写一些自动化脚本来引导我的应用程序,并将使用 AWS 中的自动扩展组来为我的应用程序启动/关闭 EC2 实例。
我需要能够为遵循以下模式的机器重新创建一个一致的名称:MYAPP001
,,MYAPP002
。MYAPP003
问题
有没有办法在用户数据引导阶段查询元数据来确定这刚刚上来的机器002
在群里吗?
如果我能确定这一点,那么我可以将机器重命名为MYAPP002
。
有助于解释的情景
想象一下第三方服务需要将机器命名为MYAPP001
、MYAPP002
、MYAPP003
。在此软件中,机器可以离线,稍后再使用不同的 IP 地址重新上线。但是,不能让两台不同的机器同时使用相同的主机名与该软件通信。
答案1
文档表明这是可能的: 示例:AMI 启动索引值。
$ TOKEN=$(curl -X PUT "http://169.254.169.254/latest/meta-data/api/token"-H "X-aws-ec2-metadata-token-ttl-seconds: 21600") \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ami-launch-index
答案2
好的,我搜索了一些 Google,然后在 AWS 中启动了一些实例,进行了远程处理和测试。感谢 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")
遗憾的是,这并没有证明非常成功,因为我的自动缩放组创建了 2 个实例,并且都说它们是“索引#0”——我将继续努力并根据我的发现调整答案。
答案3
我的解决方案(针对 Windows 机器)是赋予它们一个在整个环境中唯一的 NetBios 名称。将此 powershell 脚本放入实例元数据中:
$instanceId = Invoke-RestMethod http://169.254.169.254/latest/meta-data/instance-id
$instanceIdShort = $instanceId.substring($instanceId.length-3,3)
$Env = "${EnvironmentName}" # we pass this as a cloudformation parameter
if ($Env.length -gt 9) {$Env = $Env.substring(0,9)} # netBios names can only be 13 characters. crazy, i know.
Write-Host "Renaming this instance netbios name to $Env-$instanceIdShort"
Rename-Computer -NewName $Env-$instanceIdShort -Restart
看起来 Timothy 希望名称可以递增或重复,但这个脚本无法做到这一点。但如果您只需要它们唯一,那么它可以工作。
用例:我们的安全团队希望在有未修补的实例时通知我们。他们看到计算机名称(它用于加入域),我们希望轻松将该计算机名称与其所在的实例 ID 和帐户匹配。
答案4
您可以通过保留通用标签名称(如“appserver”)并在运行时将数字添加到该字符串来重命名服务器。
!Sub '$Env=''${Environment}'''
- ' $instanceid = Get-EC2InstanceMetadata -Category InstanceId'
- !Sub '$tag_Name=''${Name}'''
- ' $Dev=901'
- ' $Test=801'
- ' $Prod=101'
- ' if($Env -eq "dev"){$StartVal = $Dev}'
- ' if($Env -eq "test"){$StartVal = $Test}'
- ' if($Env -eq "prod"){$StartVal = $Prod}'
- ' Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
- ' Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
- ' Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
- ' Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
- ' Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
- ' Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
- ' Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
- ' $a=@(Get-EC2Tag -Filter @{Name="key";Value="Name"},@{Name="resource-type";Value="instance"})'
- ' $b = @()'
- ' foreach( $item in $a){'
- ' if($item.Value -match $tag_Name){'
- ' $item.Value=$item.Value.substring($item.Value.length - 3, 3)'
- ' $b += $item.Value'
- ' }'
- ' }'
- ' Write-Host $b'
- ' if($b -eq $null){'
- ' $StartVal=$StartVal'
- ' }'
- ' else {'
- ' foreach( $item in $b){'
- ' if($b -contains $StartVal){'
- ' $StartVal = $StartVal+1 '
- ' }'
- ' else {$StartVal=$StartVal}'
- ' }'
- ' }'
- ' Write-Host $StartVal'
- ' $tag_Name += $StartVal'
- ' Write-Host $tag_Name'
- ' $tag = New-Object Amazon.EC2.Model.Tag'
- ' $tag.Key = "Name"'
- ' $tag.Value = $tag_Name'
- ' New-EC2Tag -Resource $instanceid -Tag $tag'
- ' $newcomputername = $tag_Name'