Amazon은 최근에 많은 수의 VM을 좀 더 쉽게 관리 할 수 있도록 키-값 쌍으로 EC2 인스턴스에 태그를 지정하는 멋진 기능을 추가했습니다.
다른 사용자 설정 데이터와 동일한 방식으로 이러한 태그를 쿼리하는 방법이 있습니까? 예를 들면 :
$ curl http://169.254.169.254/latest/meta-data/placement/availability-zone
us-east-1d
태그를 쿼리하는 유사한 방법이 있습니까?
답변
AWS 메타 데이터 도구 (인스턴스 ID 검색)와 새 Tag API 의 조합을 사용 하여 현재 인스턴스의 태그를 검색 할 수 있습니다.
답변
다음 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": ["*"]
}
]
}
답변
일단 설치 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
.
답변
이 스크립트를 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의 답변을 기반으로합니다.
답변
기본 가용 영역에 있지 않은 경우 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
답변
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)
답변
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 권한이 있지만 인스턴스 프로필 정책에 설명 태그가없는 경우 유용 할 수 있습니다.