Как передать переменные среды при программном запуске нового Amazon EC2 из образа? - PullRequest
21 голосов
/ 31 марта 2012

Я использую AWS Java API RunInstance (), чтобы запустить новый экземпляр EC2 из моего собственного образа AMI. Как передать переменные среды в новый EC2 INSTANCE, такие как URL базы данных, учетные данные AWS и т. Д.?

Ответы [ 3 ]

12 голосов
/ 31 марта 2012

http://alestic.com/2009/06/ec2-user-data-scripts объясняет, как это сделать с пользовательскими данными. о том, как использовать Java, см. Запуск AmazonEC2 с данными пользователя .

обратите внимание, что я видел упоминание, что это не работает с Windows, только с Unix.

[обновить] дополнительные данные по настройке переменных среды здесь: https://forums.aws.amazon.com/message.jspa?messageID=139744

[после долгих испытаний] для меня лучше всего использовать переменные окружения в / etc / environment, например:

 reservation = connection.run_instances(image_id = image_id,
  key_name = keypair,
  instance_type = 'm1.small',
  security_groups = ['default'],
  user_data = '''#!/bin/sh\necho export foozle=barzle >> /etc/environment\n''')

затем при входе в систему:

ubuntu@ip-10-190-81-29:~$ echo $foozle
barzle
7 голосов
/ 21 августа 2014

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не являюсь системным администратором!

Я использую безопасную корзину S3, то есть корзину, к которой имеет доступ только запускаемый вами экземпляр.Вы можете настроить роль IAM, которая выглядит следующим образом:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "arn:aws:s3:::some-secure-bucket/*"
    }
  ]
}

Затем вы можете загрузить свой файл .env в это ведро (хранить его в зашифрованном виде).Затем, чтобы получить доступ к нему на своем экземпляре EC2, вы можете использовать инструменты AWS cli:

sudo apt-get install -y python-pip (for aws s3 CLI library)
sudo pip install awscli
aws s3 cp --region us-east-1 s3://some-secure-bucket/.some-dot-env-file output_file_path

Вы можете извлечь этот файл при запуске кода или, если нужно, запустить его при загрузке, указав вышеупомянутый cpкоманда в сценарии инициализации, расположенная где-то вроде /etc/init.d/download_credentials.sh

Я думаю, что это действительно хороший вариант для загрузки вещей, которые нужны каждому экземпляру, использующему AMI, например учетные данные.Однако, если вы хотите указать метаданные для каждого экземпляра, я просто использовал теги, которые, как мне кажется, работают хорошо.Для этого измените вышеупомянутую роль IAM с помощью чего-то более похожего на:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "arn:aws:s3:::some-secure-bucket/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:DescribeTags"
      ],
      "Resource": "*"
    }
  ]
}

Затем установите ec2-api-tools

sudo sed -i.dist 's,universe$,universe multiverse,' /etc/apt/sources.list
sudo apt-get update
sudo apt-get install -y ec2-api-tools

И теперь вы сможете получать метаданные для каждого экземпляра через теги.Например, «Имя» вашего экземпляра:

ec2-describe-tags --filter resource-id="$(ec2metadata --instance-id)" --filter "key=Name" | cut -f5

Примечание: я сосу в bash, поэтому я убираю имя в ruby, но вы можете использовать tr для удаления новой строки, если выв это!

4 голосов
/ 16 января 2013

Вы также можете использовать извлечение метаданных экземпляра, как описано в http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html

. Из приведенного выше документа следующий запрос GET будет извлекать пользовательские данные для экземпляра, если вы запустите его из экземпляра:

GET http://169.254.169.254/latest/user-data

Таким образом, пользовательские данные могут быть получены динамически, даже после того, как экземпляр уже запущен и работает.

...