Exemplo do Linux: valor do índice de execução da AMI - Amazon Elastic Compute Cloud

Exemplo do Linux: valor do índice de execução da AMI

Este exemplo demonstra como é possível usar dados do usuário e metadados de instância para configurar as instâncias do Linux.

nota

Os exemplos nesta seção usam o endereço IPv4 do IMDS: 169.254.169.254. Se você estiver recuperando metadados de instância para instâncias do EC2 pelo endereço IPv6, certifique-se de habilitar e usar o endereço IPv6: [fd00:ec2::254]. O endereço IPv6 do IMDS é compatível com comandos IMDSv2. O endereço IPv6 só pode ser acessado em instâncias baseadas no AWS Nitro System e em uma sub-rede compatível com IPv6 (pilha dupla ou IPv6 apenas).

Alice deseja executar quatro instâncias de sua AMI de banco de dados favorita, em que a primeira atua como a instância original e as três restantes como réplicas. Ao executá-las, ela deseja adicionar dados do usuário sobre a estratégia de replicação para cada réplica. Ela sabe que esses dados estarão disponíveis para todas as quatro instâncias, então, ela precisa estruturar os dados do usuário de forma que permita a cada instância reconhecer quais partes são aplicáveis a ela. Ela pode fazer isso usando o valor de metadados da instância ami-launch-index, que será exclusivo para cada instância. Se você iniciar mais de uma instância ao mesmo tempo, o ami-launch-indexindicará a ordem em que as instâncias foram executadas. O valor da primeira instância iniciada é 0.

Veja a seguir os dados de usuário construídos por Alice.

replicate-every=1min | replicate-every=5min | replicate-every=10min

Os dados replicate-every=1min definem a configuração da primeira réplica, replicate-every=5min definem a configuração da segunda réplica e assim por diante. Alice decide fornecer esses dados como uma string ASCII com um símbolo de pipe (|) que limita os dados para as instâncias separadas.

Alice executa quatro instâncias usando o comando run-instances e especificando os dados do usuário.

aws ec2 run-instances \ --image-id ami-0abcdef1234567890 \ --count 4 \ --instance-type t2.micro \ --user-data "replicate-every=1min | replicate-every=5min | replicate-every=10min"

Depois de executadas, todas as instâncias têm uma cópia dos dados do usuário e os metadados comuns mostrados aqui:

  • ID da AMI: ami-0abcdef1234567890

  • ID da reserva: r-1234567890abcabc0

  • Chaves públicas: nenhuma

  • Nome do security group: padrão

  • Tipo de instância: t2.micro

No entanto, cada instância tem metadados exclusivos, conforme mostrado nas tabelas a seguir.

Metadados Valor
instance-id i-1234567890abcdef0
ami-launch-index 0
public-hostname ec2-203-0-113-25.compute-1.amazonaws.com
public-ipv4 67.202.51.223
local-hostname ip-10-251-50-12.ec2.internal
local-ipv4 10.251.50.35
Metadados Valor
instance-id i-0598c7d356eba48d7
ami-launch-index 1
public-hostname ec2-67-202-51-224.compute-1.amazonaws.com
public-ipv4 67.202.51.224
local-hostname ip-10-251-50-36.ec2.internal
local-ipv4 10.251.50.36
Metadados Valor
instance-id i-0ee992212549ce0e7
ami-launch-index 2
public-hostname ec2-67-202-51-225.compute-1.amazonaws.com
public-ipv4 67.202.51.225
local-hostname ip-10-251-50-37.ec2.internal
local-ipv4 10.251.50.37
Metadados Valor
instance-id i-1234567890abcdef0
ami-launch-index 3
public-hostname ec2-67-202-51-226.compute-1.amazonaws.com
public-ipv4 67.202.51.226
local-hostname ip-10-251-50-38.ec2.internal
local-ipv4 10.251.50.38

Alice pode usar o valor ami-launch-index para determinar qual parte dos dados do usuário é aplicável a uma instância específica.

  1. Ela se conecta a uma das instâncias e recupera o ami-launch-index dessa instância para garantir que ela seja uma das réplicas:

    IMDSv2
    [ec2-user ~]$ 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" http://169.254.169.254/latest/meta-data/ami-launch-index 2

    Para as etapas a seguir, as solicitações do IMDSv2 usam o token armazenado do comando anterior do IMDSv2, supondo-se que o token não tenha expirado.

    IMDSv1
    [ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ami-launch-index 2
  2. Ela salva o ami-launch-index como uma variável.

    IMDSv2
    [ec2-user ~]$ ami_launch_index=`curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-launch-index`
    IMDSv1
    [ec2-user ~]$ ami_launch_index=`curl http://169.254.169.254/latest/meta-data/ami-launch-index`
  3. Ela salva os dados do usuário como uma variável.

    IMDSv2
    [ec2-user ~]$ user_data=`curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data`
    IMDSv1
    [ec2-user ~]$ user_data=`curl http://169.254.169.254/latest/user-data`
  4. Finalmente, Alice usa o comando cut para extrair a parte dos dados do usuário aplicável à instância.

    IMDSv2
    [ec2-user ~]$ echo $user_data | cut -d"|" -f"$ami_launch_index" replicate-every=5min
    IMDSv1
    [ec2-user ~]$ echo $user_data | cut -d"|" -f"$ami_launch_index" replicate-every=5min