Как передать переменные среды при программном запуске нового Amazon EC2 из образа?
Я использую AWS Java API RunInstance() для запуска нового экземпляра EC2 из моего собственного образа AMI. Как передать переменные среды в новый EC2 INSTANCE, такие как URL базы данных, учетные данные AWS и т. Д.?
3 ответа
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
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не администратор системы!
Я использую безопасную корзину 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
удалить перевод строки, если вы в нее!
Вы также можете использовать извлечение метаданных экземпляра, как описано на сайте http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
Из приведенного выше документа следующий GET-запрос будет извлекать пользовательские данные для экземпляра, если вы запустите его из этого экземпляра:
GET http://169.254.169.254/latest/user-data
Таким образом, пользовательские данные могут быть получены динамически, даже после того, как экземпляр уже запущен и работает.