Autoscaling 그룹 인스턴스 IP 주소를 얻는 방법


16

AutoScaling 그룹의 일부인 모든 인스턴스의 프라이빗 IP 주소를 얻는 방법은 무엇입니까? 자동 확장 그룹의 일부인 모든 인스턴스에서 일부 작업을 수행하려고합니다.

답변:


16

IP 목록을 얻기 위해 아래와 같은 작은 스크립트를 작성했습니다.

#! / bin / bash
`aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name ASGName | grep -i instanceid | awk '{print $ 2}'| 컷 -d ','-f1 | sed -e 's / "// g'`
하다
aws ec2 describe-instances-인스턴스 ID $ i | grep -i PrivateIpAddress | awk '{print $ 2}'| 헤드 -1 | 컷 -d ","-f1
끝난;

내 모든 손으로 공감
Jameel Grand

이 때문에 downvote 현명을 구문 분석 JSON과 그렙과 AWK
xenoterracide

jq명령을 사용 하여 json을 구문 분석 할 수 있습니다
Chase T.

완벽한 답변, 감사합니다.
John Humphreys-w00te

10

대안으로, 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
10.228.43.71
10.230.178.160
10.228.15.171
10.233.160.163
10.228.18.123
10.225.222.195
10.237.149.97
10.136.163.109
10.152.35.71
10.233.157.230

보다 최적화 된 버전

# aws ec2 describe-instances --region us-east-1 --instance-ids \
$(aws autoscaling describe-auto-scaling-instances --region us-east-1 --output text \
--query "AutoScalingInstances[?AutoScalingGroupName=='ASG_NAME'].InstanceId") \
--query "Reservations[].Instances[].PrivateIpAddress"
[
    "10.230.178.160",
    "10.152.35.71",
    "10.233.157.230",
    "10.237.149.97",
    "10.228.15.171",
    "10.136.163.109",
    "10.225.222.195",
    "10.233.160.163",
    "10.228.43.71",
    "10.228.18.123"
]

출력에 일반 목록 만 있으면 다른 파이프 라인을 추가 할 수 있습니다.

| jq -r '.[]'


이 광산은 내 말 하나, 당신은 단지 이m를 생성 할 수 있습니다 생성, 많은 "설명-경우"요청을 생성합니다,하지만 당신은 xargs를 사용을 중지해야 할 것
xenoterracide

this creates many "describe-instances" requests과? 귀하의 검색어가 태그에서만 작동한다는 것을 이해하는 한, 그것은 보편적이지 않습니다.
imex

당신은 보편적이지 않습니다. 실제로 쿼리에서 이름을 사용할 수 없습니다. 자동화 된 시스템의 일부인 생성 된 이름입니다. 요점은 이것이 10 + 1 RPC 요청을 생성하므로 보유한 인스턴스 수에 따라 속도가 느려진다는 것입니다.
xenoterracide

실제로 OP는 검색에 필요한 기준으로 지정하지 않았으므로 회색 영역입니다. :)
ALex_hha

네, 알고 계실 것입니다.보다 효율적인 쿼리를 만들 수 있습니다.
xenoterracide


1

Ramesh의 답변과 비슷하게 현재 인스턴스와 그룹을 기반으로 한 멋진 스크립트가 있습니다. 지역을 설정했는지 확인하십시오.이 경우 현재 인스턴스를 건너 뜁니다 (클러스터링에 사용). 필요한 경우 PrivateIpAddress를 Public으로 변경할 수도 있습니다.

#!/bin/bash
wget http://s3.amazonaws.com/ec2metadata/ec2-metadata
sudo chmod u+x ec2-metadata
INSTANCE_ID=$(./ec2-metadata | grep instance-id | awk 'NR==1{print $2}')
AG_NAME=$(aws autoscaling describe-auto-scaling-instances --instance-ids ${INSTANCE_ID} --region eu-west-1 --query AutoScalingInstances[].AutoScalingGroupName --output text)
for ID in $(aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names ${AG_NAME} --region eu-west-1 --query AutoScalingGroups[].Instances[].InstanceId --output text);
do
    if [ "${ID}" == ${INSTANCE_ID} ] ; then
        continue;
    fi
    IP=$(aws ec2 describe-instances --instance-ids $ID --region eu-west-1 --query Reservations[].Instances[].PrivateIpAddress --output text)
    # Do what you want with ${IP} here
done

1

당신은 또한 사용할 수 jq는 구문 분석 HTML로 정규 표현식을 사용하는 나쁜 생각되는 유사한 노드 구조를 구문 분석, 그것은 사용 AWK, GREP, 또는 나오지도 등으로 나쁜 생각, 출력을 구문 분석 할 수 있습니다.

$ aws ec2 describe-instances \
--instance-ids $(aws autoscaling describe-auto-scaling-groups \
    |jq -r '.AutoScalingGroups[]| select( .Tags[].Value == "playground").Instances[].InstanceId' \
    |paste -s -d" ") \
| jq -r '.Reservations[].Instances[].PrivateIpAddress'
192.169.0.202
192.169.0.177
192.169.0.160

JFYI : AWS CLI는 --query 옵션을 통해 json을 필터링 할 수 있습니다.
ALex_hha

정확히 같은 방식으로 작동하지 않는 것 같습니다
xenoterracide

하지만 그렇습니다. 다른 방법입니다.
xenoterracide

내 버전을 살펴보세요
ALex_hha

내가 생각하는 경우에도 그것이 가장 좋은 대답 아니기 때문에, 여기를 떠날거야 jq유용한 도구이며, 작전 사람들이 그것을 발견하자 여기를 떠나 심지어 당신이 가진 모든 것을 할 수 아마존 경우 aws명령
xenoterracide

0

EC2-> Auto Scaling Groups-> 인스턴스 탭에서 AWS 웹 콘솔 UI를 확인할 수도 있습니다. 현재 ASG 하의 모든 인스턴스가 표시되면 각 instance-ID를 클릭하여 IP를 얻을 수 있습니다 (다른보기로 리디렉션합니다).


예, 그러나 전체 목록을 원하고 100 개가 넘는 인스턴스가있는 ASG가 있고 IP 목록을 적용하려는 경우가 있습니다.
Ramesh Kumar

아래는 IP 목록을 얻기 위해 작성한 작은 스크립트입니다.
Ramesh Kumar

이 경우 cli를 사용하면 정확합니다.
mindblowwn

0
$instanceIPs = aws ec2 describe-instances --filters "Name=tag:Name,Values=<name-of-your-auto-scaling-group>" --query 'Reservations[].Instances[].PrivateDnsName' --output text

$instanceIPsArray = $instanceIPs.Trim() -split("`t")
foreach($ip in $instanceIPsArray)
{
    //Do something
}

0

ASG에서 인스턴스의 모든 프라이빗 IP를 반환합니다.

PRIVATEIPS=$(aws ec2 describe-instances --filters "Name=tag:aws:autoscaling:groupName,Values=$(aws autoscaling describe-auto-scaling-instances --instance-ids="$(ec2metadata --instance-id)" | jq -r '.AutoScalingInstances[].AutoScalingGroupName')" --query 'Reservations[].Instances[].PrivateIpAddress' --output text --region $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/\(.*\)[a-z]/\1/'))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.