Existem algumas abordagens a serem consideradas para encerrar uma instância de si mesma:
-
Inicie a instância do EC2 com o comportamento iniciado pela instância de desligamento definido como "terminate" e, em seguida, "sudo halt" ou equivalente de dentro da instância.
-
Inicie a instância do EC2 com uma função do IAM que permita que ela seja encerrada e invoque a API ec2 terminate-instances da instância (por exemplo, usando o aws-cli). Obtenha o ID da instância dos metadados da instância.
O primeiro método é um pouco mais fácil e tem menos risco de a instância ser capaz de encerrar outras instâncias, mas você já está chamando a API da AWS a partir da instância, então está na metade do caminho para rm /etc/rc2.d / S90halt-after-create-image o segundo método também.
Agora, para saber como acionar o encerramento após a reinicialização da criação de imagem.
Você poderia simplesmente soltar o comando halt / terminate desejado em um script de inicialização como /etc/rc.local e ele seria executado quando o sistema voltasse a funcionar. Como o @AlexB aponta nos comentários, você precisa ter certeza de que isso não faz com que novas instâncias com a imagem parem, então talvez teste o instance_id.
Não há necessidade de esperar pela conclusão da nova criação da AMI. Ele terminará bem, mesmo que sua instância não esteja mais em execução.
Aqui está um hack rápido que tem muito espaço para melhorias:
# This would be dangerous in a non-EC2 environment or on an instance that
# does not fit the criteria in the original question.
original_instance_id=$(curl -s http://instance-data/latest/meta-data/instance-id)
cat >/etc/rc2.d/S90halt-after-create-image <<EOF
#!/bin/sh
rm \# This would be dangerous in a non-EC2 environment or on an instance that
# does not fit the criteria in the original question.
original_instance_id=$(curl -s http://instance-data/latest/meta-data/instance-id)
cat >/etc/rc2.d/S90halt-after-create-image <<EOF
#!/bin/sh
rm \%pre%
instance_id=\$(curl -s http://instance-data/latest/meta-data/instance-id)
test "\$instance_id" = "$original_instance_id" && sudo halt
EOF
chmod +x /etc/rc2.d/S90halt-after-create-image
instance_id=\$(curl -s http://instance-data/latest/meta-data/instance-id)
test "\$instance_id" = "$original_instance_id" && sudo halt
EOF
chmod +x /etc/rc2.d/S90halt-after-create-image
Este código cria um script de inicialização que se remove e interrompe o sistema se determinadas condições forem verdadeiras. Poderia causar confusão geral se as coisas derem errado. Testado no Ubuntu 12.04. Pode não funcionar em outro lugar.