Gostaria de executar alguns scripts em hosts que são instâncias do EC2, mas não sei como ter certeza de que o host é realmente uma instância do EC2.
Eu fiz alguns testes, mas isso não é suficiente:
- Teste se ec2_userdata binário está disponível (mas isso nem sempre será verdadeiro)
- Teste a disponibilidade de " http://169.254.169.254/latest/meta-data " (mas isso sempre será verdade? E o que é esse "IP mágico"?)
amazon-ec2
Kelindil
fonte
fonte
Respostas:
Bem, na verdade, existe uma maneira muito simples de detectar se o host é uma instância do EC2: verifique a pesquisa inversa do seu IP público. Os reversos do EC2 são bastante difíceis de perder.
Além disso, se você não o modificou, o nome do host deve ser o contrário, facilitando ainda mais a identificação.
Você também pode usar o "IP mágico" de que falou, já que é realmente a maneira padrão de obter tags de Instância EC2; no entanto, se você não estiver em uma rede EC2, precisará aguardar um tempo limite, o que geralmente não é desejável...
Se esses métodos não forem suficientes, faça um whois do seu IP e verifique se você está dentro do bloco de IP do Amazon EC2.
EDIT: você pode usar este pequeno pedaço de shell:
Cuidado, porém, [[é um basismo. Você também pode usar um Python ou Perl uniline, YMMV.
fonte
hostname -d
retornaeu-west-1.compute.internal
Alteração da resposta de Hannes para evitar mensagens de erro e incluir exemplo de uso no script:
Isso não funciona nas instâncias do Windows. A vantagem sobre o enrolamento é que é quase instantâneo no EC2 e no não EC2.
fonte
ec2
- um falso positivo. É improvável (uma chance de 1 em 256) e apenas se você estiver usando um hipervisor que preenche esse arquivo. É por isso que a documentação vinculada acima diz "você provavelmente está procurando uma instância do EC2".Primeiro, senti a necessidade de postar uma nova resposta por causa dos seguintes problemas sutis com as respostas existentes e depois de receber uma pergunta sobre meu comentário na resposta do @ qwertzguy . Aqui estão os problemas com as respostas atuais:
hostname -d
, que é usado para DNS interno, e não qualquer coisa com "amazonaws.com" nele.)instance-data.ec2.internal
pesquisa de DNS pode não funcionar. Em uma instância VPC do Ubuntu EC2 em que acabei de testar, vejo: o$ curl http://instance-data.ec2.internal curl: (6) Could not resolve host: instance-data.ec2.internal
que faria com que o código que confia nesse método conclua falsamente que não está no EC2!dmidecode
no @tamale pode funcionar, mas depende de você a.) Terdmidecode
disponível em sua instância eb) ter capacidade de root ou semsudo
senha a partir do seu código.bios_version
das1.0
. Esse arquivo não está documentado no documento da Amazon , então eu realmente não confiaria nele.whois
no resultado é problemática em vários níveis. Observe que o URL sugerido nessa resposta é uma página 404 agora! Mesmo se você encontrasse um serviço de terceiros que funcionasse, seria comparativamente muito lento (comparado à verificação de um arquivo localmente) e possivelmente teria problemas de limitação de taxa ou problemas de rede, ou talvez sua instância do EC2 nem sequer tenha acesso à rede externa.-m
ou--max-time
curl para evitar que ele fique paralisado por muito tempo, especialmente em uma instância não-EC2 em que esse endereço possa levar a lugar nenhum e travar (como na resposta de @ algal ).Além disso, não vejo que alguém tenha mencionado o fallback documentado da Amazon de verificar o arquivo (possível)
/sys/devices/virtual/dmi/id/product_uuid
.Quem sabia que determinar se você está executando o EC2 pode ser tão complicado ?! OK, agora que temos (a maioria) dos problemas relacionados às abordagens listadas, aqui está um snippet de bash sugerido para verificar se você está executando no EC2. Eu acho que isso deve funcionar geralmente em quase todas as instâncias do Linux, instâncias do Windows são um exercício para o leitor.
Obviamente, você pode expandir isso com ainda mais verificações de fallback e incluir paranóia sobre o manuseio, por exemplo, um falso positivo
/sys/hypervisor/uuid
aconteça para começar com "ec2" por acaso e assim por diante. Mas esta é uma solução suficientemente boa para fins de ilustração e provavelmente quase todos os casos de uso não patológicos.[†] Recuperei esta explicação do suporte da AWS sobre a alteração para instâncias c5 / m5:
fonte
elif
diz o comentário acima desse bloco, e é por isso que oelif
teste usa o-r
operador de teste, que verifica se o arquivo existe e se você tem permissões de leitura para o arquivo.Procure os metadados pelo nome de domínio interno do EC2 em vez do IP, que retornará uma falha rápida do DNS se você não estiver no EC2 e evita conflitos de IP ou problemas de roteamento:
Em algumas distribuições, sistemas muito básicos, ou muito precoce em estágios installion onda não está disponível. Usando o wget :
fonte
-bash: !": event not found
. Use aspas simples para essesecho
s.Se o objetivo é saber se é uma instância do EC2 OU outro tipo de instância da nuvem, como o google,
dmidecode
funciona muito bem e não é necessária rede. Eu gosto disso vs algumas das outras abordagens porque o caminho do URL de metadados é diferente para EC2 e GCE.fonte
1.0
- sem mencionaramazon
.É provável que os nomes de host sejam alterados, execute um whois no seu IP público:
ou acesse o URL de metadados da AWS
fonte
Isso também funciona bem para hosts Linux no ec2 e não requer a rede e nenhum tempo limite relacionado:
grep -q amazon /sys/devices/virtual/dmi/id/bios_version
Isso funciona, porque a Amazon define essa entrada da seguinte maneira:
$ cat /sys/devices/virtual/dmi/id/bios_version 4.2.amazon
fonte
1.0
. Nenhuma mençãoamazon
.mas não sei como isso é portátil nas distribuições.
fonte
Resposta rápida:
Eu estava usando uma das respostas postadas aqui há mais de um ano - mas ela não funciona nos novos tipos de instância 'c5' (estou trabalhando na atualização do 'c4' agora).
Eu gosto dessa solução porque parece ser a menos provável de quebrar no futuro.
Nos tipos de instância mais antigos e nos mais novos, esse arquivo está presente e começa com 'EC2'. Eu verifiquei no Ubuntu rodando no VirtualBox (que eu também preciso suportar) e ele contém a string 'VirtualBox'.
Como um pôster anterior observou (mas foi fácil perder) - há documentação da Amazon sobre maneiras de fazer isso - que inclui minha resposta.
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
fonte
Talvez você possa usar "facter":
"O Facter é uma biblioteca multiplataforma para recuperar fatos simples do sistema operacional, como sistema operacional, distribuição linux ou endereço MAC".
http://www.puppetlabs.com/puppet/related-projects/facter/
Por exemplo, se dermos uma olhada no fato do ec2 (facter-1.6.12 / lib / facter / ec2.rb):
fonte
Se você tiver o curl instalado, esse comando retornará 0 se você estiver executando no EC2 e diferente de zero se não estiver:
Ele tenta extrair os metadados do EC2 que declaram o AMI-ID. Se isso não der certo após 3 segundos, ele assumirá que não está sendo executado no EC2.
fonte
Um pouco tarde para esta festa, no entanto, me deparei com esta postagem e encontrei esta documentação da AWS:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
Isso, é claro, requer a sobrecarga da rede, embora você possa definir o tempo limite da ondulação da seguinte forma:
Isso define o tempo limite para 5s.
fonte