如何确定自动扩展组中的 EC2 实例索引/位置?

如何确定自动扩展组中的 EC2 实例索引/位置?

我正在编写一些自动化脚本来引导我的应用程序,并将使用 AWS 中的自动扩展组来为我的应用程序启动/关闭 EC2 实例。

我需要能够为遵循以下模式的机器重新创建一个一致的名称:MYAPP001,,MYAPP002MYAPP003

问题

有没有办法在用户数据引导阶段查询元数据来确定刚刚上来的机器002在群里吗?

如果我能确定这一点,那么我可以将机器重命名为MYAPP002

有助于解释的情景

想象一下第三方服务需要将机器命名为MYAPP001MYAPP002MYAPP003。在此软件中,机器可以离线,稍后再使用不同的 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

就是这样。这将返回启动顺序的“从零开始”的索引。这是来自亚马逊的文档,他们提供了一个很好的用例来说明为什么你需要这个:

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#AMI-launch-index-examples

这是我用来获取机器名称的 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'

相关内容