Получение списка экземпляров в группе автоматического масштабирования EC2?
Существует ли утилита или сценарий для получения списка всех экземпляров из группы автоматического масштабирования AWS EC2?
Мне нужен динамически генерируемый список производственных экземпляров, чтобы подключиться к нашему процессу развертывания. Есть ли существующий инструмент или это то, что я собираюсь написать?
5 ответов
Я фактически закончил писать скрипт на Python, потому что я чувствую себя более комфортно в Python, чем Bash,
#!/usr/bin/env python
"""
ec2-autoscale-instance.py
Read Autoscale DNS from AWS
Sample config file,
{
"access_key": "key",
"secret_key": "key",
"group_name": "groupName"
}
"""
from __future__ import print_function
import argparse
import boto.ec2.autoscale
try:
import simplejson as json
except ImportError:
import json
CONFIG_ACCESS_KEY = 'access_key'
CONFIG_SECRET_KEY = 'secret_key'
CONFIG_GROUP_NAME = 'group_name'
def main():
arg_parser = argparse.ArgumentParser(description=
'Read Autoscale DNS names from AWS')
arg_parser.add_argument('-c', dest='config_file',
help='JSON configuration file containing ' +
'access_key, secret_key, and group_name')
args = arg_parser.parse_args()
config = json.loads(open(args.config_file).read())
access_key = config[CONFIG_ACCESS_KEY]
secret_key = config[CONFIG_SECRET_KEY]
group_name = config[CONFIG_GROUP_NAME]
ec2_conn = boto.connect_ec2(access_key, secret_key)
as_conn = boto.connect_autoscale(access_key, secret_key)
try:
group = as_conn.get_all_groups([group_name])[0]
instances_ids = [i.instance_id for i in group.instances]
reservations = ec2_conn.get_all_reservations(instances_ids)
instances = [i for r in reservations for i in r.instances]
dns_names = [i.public_dns_name for i in instances]
print('\n'.join(dns_names))
finally:
ec2_conn.close()
as_conn.close()
if __name__ == '__main__':
main()
Ответ по адресу /questions/2091652/spisok-ekzemplyarov-v-gruppe-avtomaticheskogo-masshtabirovaniya-s-pomoschyu-boto/2091663#2091663 был полезен при разработке этого сценария.
Вот команда bash, которая выдаст вам список IP-адресов ваших экземпляров в группе AutoScaling.
for ID in $(aws autoscaling describe-auto-scaling-instances --region us-east-1 --query AutoScalingInstances[].InstanceId --output text);
do
aws ec2 describe-instances --instance-ids $ID --region us-east-1 --query Reservations[].Instances[].PublicIpAddress --output text
done
(возможно, вы захотите отрегулировать регион и выполнить фильтрацию для каждой группы AutoScaling, если у вас их несколько)
С точки зрения более высокого уровня - я бы поставил под сомнение необходимость подключения к отдельным экземплярам в группе AutoScaling. Динамическая природа AutoScaling побудит вас полностью автоматизировать процессы развертывания и администрирования. Цитирую клиента AWS: "Если вам нужен ssh для вашего экземпляра, измените процесс развертывания"
--Seb
Вы также можете использовать команду ниже для получения частного IP-адреса без каких-либо jq/awk/sed/cut
$ aws autoscaling describe-auto-scaling-instances --region us-east-1 --output text \
--query "AutoScalingInstances[?AutoScalingGroupName=='ASG-GROUP-NAME'].InstanceId" \
| xargs -n1 aws ec2 describe-instances --instance-ids $ID --region us-east-1 \
--query "Reservations[].Instances[].PrivateIpAddress" --output text
любезно это
Команда description-auto-scaling-groups из интерфейса командной строки AWS выглядит так, как вы ищете.
Редактировать: Получив идентификаторы экземпляров, вы можете использовать команду description-instances для получения дополнительных сведений, включая общедоступные имена DNS и IP-адреса.
Вы можете использовать describe-auto-scaling-instances
команда cli и запрос имени вашей автомасштабной группы.
Пример:
aws автоматическое масштабирование description-auto-scaling-instances --region us-east-1 --query 'AutoScalingInstances[?AutoScalingGroupName==`YOUR_ASG`]' - выходной текст
надеюсь, это поможет
Используйте приведенный ниже фрагмент кода для сортировки ASG с конкретными тегами и перечисления деталей его экземпляра.
#!/usr/bin/python
import boto3
ec2 = boto3.resource('ec2', region_name='us-west-2')
def get_instances():
client = boto3.client('autoscaling', region_name='us-west-2')
paginator = client.get_paginator('describe_auto_scaling_groups')
groups = paginator.paginate(PaginationConfig={'PageSize': 100})
#print groups
filtered_asgs = groups.search('AutoScalingGroups[] | [?contains(Tags[?Key==`{}`].Value, `{}`)]'.format('Application', 'CCP'))
for asg in filtered_asgs:
print asg['AutoScalingGroupName']
instance_ids = [i for i in asg['Instances']]
running_instances = ec2.instances.filter(Filters=[{}])
for instance in running_instances:
print(instance.private_ip_address)
if __name__ == '__main__':
get_instances()
Для ruby с использованием aws-sdk gem v2 Сначала создайте объект ec2 следующим образом:
ec2 = Aws:: EC2:: Resource.new (регион: 'регион', учетные данные: Aws::Credentials.new('IAM_KEY', 'IAM_SECRET'))
случаи = []
ec2.instances.each do |i|
p "instance id---", i.id
instances << i.id
конец
Это извлечет все идентификаторы экземпляров в определенном регионе и может использовать больше фильтров, таких как ip_address.