인스턴스 내에서 EC2 태그 쿼리


96

Amazon은 최근에 많은 수의 VM을 좀 더 쉽게 관리 할 수 ​​있도록 키-값 쌍으로 EC2 인스턴스에 태그를 지정하는 멋진 기능을 추가했습니다.

다른 사용자 설정 데이터와 동일한 방식으로 이러한 태그를 쿼리하는 방법이 있습니까? 예를 들면 :

$ curl http://169.254.169.254/latest/meta-data/placement/availability-zone
us-east-1d

태그를 쿼리하는 유사한 방법이 있습니까?

답변:


35

AWS 메타 데이터 도구 (인스턴스 ID 검색)와 새 Tag API 의 조합을 사용 하여 현재 인스턴스의 태그를 검색 할 수 있습니다.


좋아, 나는 그 링크를 따라 갔고 API 문서처럼 보입니다. 사용할 수있는 도구가 없거나 API 문서를 읽고 내 도구를 작성해야합니까?
Edward Falk 2012

3
ec2-describe-tags 명령을 쉽게 사용할 수 있습니까? 아마도 ec2-api-tools 패키지에 있지만 설치하려고 할 때 404 외에는 아무것도 얻지 못했습니다.
Edward Falk 2012

2
예를 들어 태그 역할의 값을 가져옵니다. aws ec2 describe-tags --filters Name = resource-id, Values ​​= ec2metadata --instance-id--out = json | jq '.Tags [] | (.KEY == "역할")를 선택 | .Value '
jolestar

11
이것은 대답 포인터가 아니라 답변에 앤의 자체
로이 Truelove입니다

3
ec2metadata도구는 더 이상 사용되지 않습니다. 이제 169.254.169.254/latest/meta-data 에서 '매직'URL을 쿼리합니다. cURL을 입력하면 다양한 데이터 비트를 가져 오는 데 사용할 수있는 매직 엔드 포인트가 제공됩니다. 이 경우 curl http://169.254.169.254/latest/meta-data/instance-id인스턴스 ID를 가져
옵니다

52

다음 bash 스크립트는 현재 ec2 인스턴스의 이름 ( "Name"태그의 값)을 반환합니다. TAG_NAME을 구체적인 사례로 수정하세요.

TAG_NAME="Name"
INSTANCE_ID="`wget -qO- http://instance-data/latest/meta-data/instance-id`"
REGION="`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
TAG_VALUE="`aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" "Name=key,Values=$TAG_NAME" --region $REGION --output=text | cut -f5`"

AWS CLI를 설치하려면

sudo apt-get install python-pip -y
sudo pip install awscli

명시 적 자격 증명 대신 IAM을 사용하는 경우 다음 IAM 권한을 사용하십시오.

{
  "Version": "2012-10-17",
  "Statement": [
    {    
      "Effect": "Allow",
      "Action": [ "ec2:DescribeTags"],
      "Resource": ["*"]
    }
  ]
}

와 함께 "이 작업을 수행 할 권한이 없습니다."라는 메시지가 표시되었습니다 aws ec2 describe-tags. 이 IAM을 내 IAM 역할의 인라인 정책에 추가해야했습니다. 감사!
Victor D.

아주 약간의 최적화는 교체 할 수 있습니다 | cut -f5--query="Tags[0].Value".
Richard A Quadling

47

일단 설치 ec2-metadata하고 ec2-describe-tags설치하면 ( 위의 Ranieri의 답변 에서 언급했듯이 ), 여기 당신이 그것을에 "이름 = 푸"태그를 가정, 현재 인스턴스의 "이름"을 얻기 위해 예를 들어 쉘 명령입니다.

EC2_PRIVATE_KEY 및 EC2_CERT 환경 변수가 설정되어 있다고 가정합니다.

ec2-describe-tags \
  --filter "resource-type=instance" \
  --filter "resource-id=$(ec2-metadata -i | cut -d ' ' -f2)" \
  --filter "key=Name" | cut -f5

이것은를 반환합니다 Foo.


17
내 프로세스가 인스턴스에 EC2_PRIVATE_KEY가 없어도 현재 인스턴스에 대한 태그를 가져올 수 있다면 좋았을 것입니다. :-(
William Payne

1
@ william-payne 예, 정말 절름발이입니다. 아마도 Amazon의 IAM을 사용하면 최소한 모든 것에 대한 매우 제한된 액세스 권한을 가진 사용자를 사용할 수 있습니다. FWIW, 더 이상이 방법을 사용하지 않고 외부 스크립트를 사용하여 상자를 설정합니다.
overthink

12
@WilliamPayne "Amazon EC2 읽기 전용 액세스"정책으로 IAM 역할을 설정하고 해당 역할이있는 인스턴스를 생성 할 수 있습니다. 더 세분화하려면 "DescribeTags"권한 만있는 사용자 지정 정책을 생성 할 수도 있습니다.
roverwolf

@WilliamPayne 나는 roverwolf의 제안을 좋아했습니다. 훌륭하게 작동했습니다. 실제로보고 싶다면 세부 정보가 포함 된 다른 질문에 답했습니다. stackoverflow.com/questions/9950586/…
Tony

2
그 주 ec2-describe-tags에 기본값을 us-east-2. --region다른 지역을 사용 하려면 플래그를 전달하십시오 .
advait

15

이 스크립트를 cloud-init 사용자 데이터에 추가하여 EC2 태그를 로컬 파일에 다운로드 할 수 있습니다.

#!/bin/sh
INSTANCE_ID=`wget -qO- http://instance-data/latest/meta-data/instance-id`
REGION=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone | sed 's/.$//'`
aws ec2 describe-tags --region $REGION --filter "Name=resource-id,Values=$INSTANCE_ID" --output=text | sed -r 's/TAGS\t(.*)\t.*\t.*\t(.*)/\1="\2"/' > /etc/ec2-tags

시스템에 AWS CLI 도구가 설치되어 있어야 packages합니다. 스크립트 앞에 클라우드 구성 파일 의 섹션을 사용하여 설치하거나 이미 포함 된 AMI를 사용 apt하거나 yum스크립트 시작 부분에 또는 명령을 추가 할 수 있습니다.

EC2 태그에 액세스하려면 인스턴스의 IAM 역할에 다음과 같은 정책이 필요합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1409309287000",
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeTags"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

인스턴스의 EC2 태그는 /etc/ec2-tags다음 형식으로 제공됩니다.

FOO="Bar"
Name="EC2 tags with cloud-init"

다음과 같이를 사용하여 셸 스크립트에있는 그대로 파일을 포함 할 수 있습니다 . /etc/ec2-tags.

#!/bin/sh
. /etc/ec2-tags
echo $Name

태그는 인스턴스 초기화 중에 다운로드되므로 후속 변경 사항을 반영하지 않습니다.


스크립트 및 IAM 정책은 itaifrenkel의 답변을 기반으로합니다.


a + 선호하는 방법
Cmag

자동 확장 그룹에 의해 생성 된 태그에 대해 너무 나쁘다 :aws:autoscaling:groupName
Cmag

2
그런 다음이 시도 :aws ec2 describe-tags --region $REGION --filter "Name=resource-id,Values=$INSTANCE_ID" --output=text | sed -r 's/TAGS\t(.*)\t.*\t.*\t(.*)/EC2_TAG_\1="\2"/' |sed -r 's/aws:autoscaling:/aws_autoscaling_/' > /etc/ec2-tags
라이언 Gooler

10

기본 가용 영역에 있지 않은 경우 overthink의 결과는 비어 있습니다.

ec2-describe-tags \
   --region \
     $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone  | sed -e "s/.$//") \
   --filter \
     resource-id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id)

특정 태그 (제 경우에는 elasticbeanstalk : environment-name)를 가져 오기 위해 필터를 추가하려면 이렇게 할 수 있습니다.

ec2-describe-tags \
   --region \
     $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone  | sed -e "s/.$//") \
   --filter \
     resource-id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id) \
   --filter \
     key=elasticbeanstalk:environment-name | cut -f5

필터링 한 태그의 값만 얻기 위해 파이프를 통해 잘라 내고 다섯 번째 필드를 얻습니다.

ec2-describe-tags \
  --region \
    $(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone  | sed -e "s/.$//") \
  --filter \
    resource-id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id) \
  --filter \
    key=elasticbeanstalk:environment-name | cut -f5

훌륭한 일, 당신은 대체 이름 태그를 필요로하는 경우 다른 DNS 인스턴스 데이터가 마지막을 위해, 나를 위해 작동하지 않는 데, 감사 elasticbeanstalk:environment-nameName
detzu

5

Python의 경우 :

from boto import utils, ec2
from os import environ

# import keys from os.env or use default (not secure)
aws_access_key_id = environ.get('AWS_ACCESS_KEY_ID', failobj='XXXXXXXXXXX')
aws_secret_access_key = environ.get('AWS_SECRET_ACCESS_KEY', failobj='XXXXXXXXXXXXXXXXXXXXX')

#load metadata , if  = {} we are on localhost
# http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
instance_metadata = utils.get_instance_metadata(timeout=0.5, num_retries=1)
region = instance_metadata['placement']['availability-zone'][:-1]
instance_id = instance_metadata['instance-id']

conn = ec2.connect_to_region(region, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key)
# get tag status for our  instance_id using filters
# http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-DescribeTags.html
tags = conn.get_all_tags(filters={'resource-id': instance_id, 'key': 'status'})
if tags:
    instance_status = tags[0].value
else:
    instance_status = None
    logging.error('no status tag for '+region+' '+instance_id)

합법. 독자들은 기본적인 지역 정보에 대해서는 자격 증명이 필요하지 않습니다.instance_metadata = utils.get_instance_metadata(timeout=0.5, num_retries=1)
Bartvds

또한 이는 IAM 역할과도 잘 어울립니다. 인스턴스 역할을 설정하면 boto가 자동으로 ID와 키를 감지합니다.
dbn

5

describe-instances대신 cli 호출을 사용할 수 있습니다.describe-tags .

이 예에서는 인스턴스의 'my-tag-name'태그 값을 가져 오는 방법을 보여줍니다.

aws ec2 describe-instances \
  --instance-id $(curl -s http://169.254.169.254/latest/meta-data/instance-id) \
  --query "Reservations[*].Instances[*].Tags[?Key=='my-tag-name'].Value" \
  --region ap-southeast-2 --output text

지역 상황에 맞게 지역을 변경하십시오. 이는 인스턴스에 describe-instances 권한이 있지만 인스턴스 프로필 정책에 설명 태그가없는 경우 유용 할 수 있습니다.


3

AWS '사용자 데이터'및 '메타 데이터'API를 사용하면 사용자 지정 인증서 이름으로 퍼펫 실행을 시작하기 위해 퍼펫을 래핑하는 스크립트를 작성할 수 있습니다.

먼저 사용자 지정 사용자 데이터 'role : webserver'로 AWS 인스턴스를 시작합니다.

#!/bin/bash

# Find the name from the user data passed in on instance creation
USER=$(curl -s "http://169.254.169.254/latest/user-data")
IFS=':' read -ra UDATA <<< "$USER"

# Find the instance ID from the meta data api
ID=$(curl -s "http://169.254.169.254/latest/meta-data/instance-id")
CERTNAME=${UDATA[1]}.$ID.aws

echo "Running Puppet for certname: " $CERTNAME
puppet agent -t --certname=$CERTNAME 

이것은 'webserver.i-hfg453.aws'와 같은 certname을 가진 puppet을 호출합니다. 그런 다음 'webserver'라는 노드 매니페스트를 생성 할 수 있으며 '퍼지 노드 일치'는 모든 웹 서버를 프로비저닝하는 데 사용됨을 의미합니다.

이 예에서는 퍼펫이 설치된 기본 이미지를 기반으로 빌드한다고 가정합니다.

혜택:

1) 자격 증명을 통과 할 필요가 없습니다.

2) 역할 구성으로 원하는대로 세분화 할 수 있습니다.


3

기존 답변 중 일부보다 더 간단하고 깔끔하며 AWS CLI 만 사용하고 추가 도구는 사용하지 않는 다음 항목을 모았습니다.

이 코드 예제는 현재 EC2 인스턴스의 'myTag'태그 값을 가져 오는 방법을 보여줍니다.

사용 설명-태그 :

export AWS_DEFAULT_REGION=us-east-1
instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
aws ec2 describe-tags \
  --filters "Name=resource-id,Values=$instance_id" 'Name=key,Values=myTag' \
  --query 'Tags[].Value' --output text

또는, describe-instances 사용 :

aws ec2 describe-instances --instance-id $instance_id \
  --query 'Reservations[].Instances[].Tags[?Key==`myTag`].Value' --output text

2

위의 답변 중 일부에 대한 변형이지만 이것이 인스턴스의 사용자 데이터 스크립트에서 특정 태그의 값을 얻은 방법입니다.

REGION=$(curl http://instance-data/latest/meta-data/placement/availability-zone | sed 's/.$//')

INSTANCE_ID=$(curl -s http://instance-data/latest/meta-data/instance-id)

TAG_VALUE=$(aws ec2 describe-tags --region $REGION --filters "Name=resource-id,Values=$INSTANCE_ID" "Name=key,Values='<TAG_NAME_HERE>'" | jq -r '.Tags[].Value')

1

AWS CLI를 설치합니다.

curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
sudo apt-get install unzip
unzip awscli-bundle.zip
sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws

현재 인스턴스에 대한 태그를 가져옵니다.

aws ec2 describe-tags --filters "Name=resource-id,Values=`ec2metadata --instance-id`"

출력 :

{
    "Tags": [
        {
            "ResourceType": "instance", 
            "ResourceId": "i-6a7e559d", 
            "Value": "Webserver", 
            "Key": "Name"
        }
    ]
}

약간의 펄을 사용하여 태그를 추출하십시오.

aws ec2 describe-tags --filters \
"Name=resource-id,Values=`ec2metadata --instance-id`" | \
perl -ne 'print "$1\n" if /\"Value\": \"(.*?)\"/'

보고:

Webserver

ec2metadataaws-cli에는 없지만 curl --silent http://169.254.169.254/latest/meta-data/instance-id. 또한 jqjson을 더 쉽게 구문 분석 할 수 있거나 다른 출력 형식이 훨씬 더 쉽습니다.
tedder42

작동하지만 다음을 추가해야합니다. sudo apt-get -y install python그리고export AWS_DEFAULT_REGION=us-west-1
Eugene

작동하지 않습니다 ... 1. ec2metadata는 잘못된 명령입니다. 2. ec2-metadata --instance-id가 반환됩니다.instance-id: i-07f59f3564618f148
Daniel Hornik


1

Jq + ec2metadata는 조금 더 멋지게 만듭니다. 저는 cf를 사용하고 있으며 지역에 액세스 할 수 있습니다. 그렇지 않으면 bash에서 가져올 수 있습니다.

aws ec2 describe-tags --region $REGION \
--filters "Name=resource-id,Values=`ec2metadata --instance-id`" | jq --raw-output \
'.Tags[] | select(.Key=="TAG_NAME") | .Value'

0

EC2에서 Fish shell을 사용하기에 충분히 미친 사람들을 위해 여기에 /home/ec2-user/.config/fish/config.fish에 대한 편리한 스 니펫이 있습니다. 이제 hostdata 명령은 공용 IP 및 호스트 이름뿐만 아니라 모든 태그를 나열합니다.

set -x INSTANCE_ID (wget -qO- http://instance-data/latest/meta-data/instance-id)
set -x REGION (wget -qO- http://instance-data/latest/meta-data/placement/availability-zone | sed 's/.$//')

function hostdata
    aws ec2 describe-tags --region $REGION --filter "Name=resource-id,Values=$INSTANCE_ID" --output=text | sed -r 's/TAGS\t(.*)\t.*\t.*\t(.*)/\1="\2"/'
    ec2-metadata | grep public-hostname
    ec2-metadata | grep public-ipv4
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.