簡體   English   中英

獲取 EC2 自動縮放組中的實例列表?

[英]Getting a list of instances in an EC2 auto scale group?

是否有實用程序或腳本可用於從 AWS EC2 自動縮放組檢索所有實例的列表?

我需要一個動態生成的生產實例列表來連接到我們的部署過程。 是否有現有的工具或者這是我必須編寫的腳本?

這是一個 bash 命令,它將為您提供 AutoScaling 組中實例的 IP 地址列表。

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 組中的單個實例的必要性。 AutoScaling 的動態特性會鼓勵您完全自動化您的部署和管理流程。 引用 AWS 客戶的話:“如果您需要 ssh 到您的實例,請更改您的部署過程”

--塞伯

AWS 命令​​行界面中的describe-auto-scaling-groups命令看起來像您要查找的內容。

編輯:獲得實例 ID 后,您可以使用describe-instances命令獲取其他詳細信息,包括公共 DNS 名稱和 IP 地址。

您可以使用describe-auto-scaling-instances cli 命令,並查詢您的自動縮放組名稱。

例子:

aws autoscaling describe-auto-scaling-instances --region us-east-1 --query 'AutoScalingInstances[?AutoScalingGroupName==`YOUR_ASG`]' --output text

希望有幫助

您也可以使用以下命令來獲取私有 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

禮貌這個

我實際上最終用 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()

要旨

https://stackoverflow.com/a/12592543/20774 上的答案有助於開發此腳本。

使用以下代碼段整理具有特定標簽的 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()

對於使用 aws-sdk gem v2 的 ruby​​ 首先創建 ec2 對象,如下所示:

ec2 = Aws::EC2::Resource.new(region: 'region', 憑證: Aws::Credentials.new('IAM_KEY', 'IAM_SECRET') )

實例 = []

ec2.instances.each do |i|
   p "instance id---", i.id
   instances << i.id

結尾

這將獲取特定區域的所有實例 ID,並可以使用更多過濾器,如 ip_address。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM