Назад | Перейти на главную страницу

Как я могу определить индекс / положение экземпляров EC2 в группе автоматического масштабирования?

Я работаю над некоторыми сценариями автоматизации для начальной загрузки моего приложения и буду использовать группу автоматического масштабирования в AWS для ускорения / остановки экземпляров EC2 для моего приложения.

Мне нужно воссоздать согласованное имя для машины, которое следует шаблону: MYAPP001, MYAPP002, MYAPP003.

Вопрос

Есть ли способ запросить метаданные на этапе начальной загрузки пользовательских данных, чтобы определить, что этот машина, которая только что подошла, это 002 в группе?

Если я могу это определить, то могу переименовать машину в MYAPP002.

Сценарий, помогающий объяснить

Представьте себе стороннюю службу, которая ожидает именования машин. MYAPP001, MYAPP002, MYAPP003. В этом программном обеспечении машина может отключиться и вернуться в сеть позже с другим IP-адресом. Тем не мение, нельзя, чтобы две разные машины одновременно разговаривали с этим программным обеспечением с одним и тем же именем хоста.

В документации сказано, что это возможно: Пример: значение индекса запуска 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

Вы уверены, что эта информация даже доступна через API? Лучшее, что я могу придумать, - это запросить время запуска всех запущенных экземпляров, а затем определить, какой из них является «самым новым».

Я должен сказать, что вы делаете это неправильно, если полагаетесь на любой машинно-зависимое состояние в вашей группе автомасштабирования. Ваш метод развертывания и приложение должны быть построены таким образом, чтобы все экземпляры ASG были одинаковыми, даже их имена хостов. По техническим причинам необходимо назначить конкретное имя хоста воля вернуться, чтобы преследовать вас.

Воспринимайте это как возможность рефакторинга вещей, которые вам не нужно делать. Создайте свое приложение таким образом, чтобы ASG могла создавать и уничтожать экземпляры по своему усмотрению, не беспокоясь о том, что он вызывает на каждом хосте.


В качестве мысленного эксперимента давайте подумаем об этом немного подробнее. Допустим, вы создаете экземпляр ASG с тремя экземплярами: ASG [01,02,03]. В какой-то момент в будущем у ASG02 возникнут проблемы, и она будет прекращена. ASG создает новый экземпляр для его замены, который теперь называется ASG04. Итак, теперь у вас есть ASG [01,03,04]. Это то, что вы имеете в виду? Зачем вам эта информация? Как упоминалось выше, если вы все делаете правильно, вы не нужна эта информация, или в любом случае не должна. Если вы делаете это просто для удобочитаемых целей или для того, чтобы лучше отслеживать ситуацию, просто отпустите это и доверьте ASG свою работу.

Хорошо, потребовалось немного погуглить, а затем развернуть несколько экземпляров в AWS, удаленное взаимодействие и тестирование. Вот (очень простой) ответ благодаря AWS:

http://169.254.169.254/latest/meta-data/ami-launch-index

Вот и все. Это возвращает "отсчитываемый от нуля" индекс порядка запуска. Вот документация от Amazon, и они дают хороший пример использования того, зачем вам это нужно:

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» - я продолжу работать над этим и скорректирую ответ с моими результатами.

вы можете переименовать серверы, сохранив общее имя тега, например «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'