Tivemos o mesmo problema. Construímos muitas instâncias do EC2 a partir do CloudFormation automaticamente todos os dias e precisávamos de uma maneira de identificá-las facilmente no console com base em seu hosthame.
Atualmente, todos os servidores criados automaticamente têm o mesmo nome, que é uma string fixa no modelo de formação de nuvem.
Já dispúnhamos de um mecanismo de cintagem de inicialização baseado em "dados do usuário", em que as instâncias criadas automaticamente executavam algum código do PowerShell quando eram inicializadas pela primeira vez.
Portanto, para obter o nome do host no console da AWS, percebi que a maneira mais fácil era alterar a tag "name", anexando o nome do host à tag existente.
Eu adicionei o seguinte código ao bootstrap:
function Get-NameTagValue()
{
param(
[parameter(Mandatory)] [string] $InstanceId
)
$filter1 = New-Object -TypeName Amazon.EC2.Model.Filter -Property @{
Name = 'resource-id'
Values = $InstanceId
}
$filter2 = New-Object -TypeName Amazon.EC2.Model.Filter -Property @{
Name = 'key'
Values = 'Name'
}
$filters = $filter1, $filter2
$tag = Get-EC2Tag '
-Region $Region '
-ProfileName $ProfileName '
-Filter $filters
#Output the tag value
$tag.Value
}
function Set-InstanceNameTag()
{
$instanceId = (Invoke-RestMethod -Method Get -Uri http://169.254.169.254/latest/meta-data/instance-id)
#Get the current value of the name tag
$currentNameTagValue = Get-NameTagValue -InstanceId $instanceId
$newNameTagValue = "$currentNameTagValue - $env:COMPUTERNAME"
Remove-EC2Tag '
-Resource $instanceId '
-Tag @{ Key="Name" } '
-Region $Region '
-ProfileName $ProfileName '
-Force
New-EC2Tag '
-Resource $instanceId '
-Tag @{ Key="Name"; Value=$newNameTagValue } '
-Region $Region '
-ProfileName $ProfileName '
}
O código primeiro obtém o id de isnance dos metadados e, em seguida, usando esse id, ele encontra a tag Name existente, remove-a e adiciona uma nova tag Name contendo o valor existente seguido pelo nome do host.
Essas duas funções estão contidas em nosso script Bootstrap, que possui parâmetros para $Region
e $ProfileName
, que são usados nas funções.
Em seguida, chamamos a função Set-InstanceNameTag
do script principal e voilà, você tem a tag Name existente seguida por um hífen e o nome do host.
Para que isso funcione, a instância do EC2 precisa ter uma função que tenha permissões para: CreateTags, DeleteTags e DescribeTags.
Você pode conseguir isso usando a seguinte política:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:CreateTags",
"ec2:DeleteTags",
"ec2:DescribeTags"
],
"Resource": [
"*"
]
}
]
}
Espero que ajude alguém.
Carl