Linux 명령어/AWS CLI
AWS CLI - Query 옵션 활용하기
Camouflage129
2020. 10. 19. 16:19
Jenkins Pipeline에서와 같이 배포할 때, 특정 값을 가져와서 입력해야 하는 경우가 많다.
이럴때 CLI를 통해 가져온 후, 그 값을 바로 넣으면 편한데 --query라는 옵션을 통해 정말 원하는 조건에 해당하는 값을 가져올 수 있다.
아래의 문법을 따르기 때문에 직접 독스를 읽어보는것도 좋다.
Multi Account에서 아래와 같은 예시로 EC2 정보들을 가져오는 예시를 작성해봤다.
1. AutoSchedule Tag가 True인 Instance ID들을 가져오기
#!/bin/bash
ids=( profile1 profile2 profile3 )
for id in ${ids[@]}
do
aws ec2 describe-instances --query "Reservations[?(Instances[?(Tags[?Key == 'AutoSchedule' && Value == 'True'])])].Instances[].{"InstanceId":InstanceId}" --region ap-northeast-2 --profile $id
done
2. Env Tag가 PRD인 EC2 Private Ip 가져오기
aws ec2 describe-instances --query "Reservations[?(Instances[?(Tags[?Key == 'Env' && Value == 'PRD'])])].Instances[].PrivateIpAddress" --region ap-northeast-2 --profile profile1
위의 두개의 경우와 같이 특정값이 어떤 값인지로 쿼리할 수 있으나 시작점이 무엇인지로 쿼리하는 방법도 있다.
3. CloudFront에서 Comment가 TEST로 시작하는 내역 가져오기
aws cloudfront list-distributions --query "DistributionList.Items[?starts_with(Comment,'TEST')].{"Comment":Comment,"DomainName":DomainName,"Aliases":Aliases}" --profile profile1
4. Boto3와 CLI를 같이 활용하기
EC2 List를 가져올 때, 해당 값이 너무 많은 경우 CLI를 통해 정보를 가져오고 파이썬을 통해 아래와 같이 리스트를 뽑아낼 수 도 있다.
#!/bin/bash
aws ec2 describe-instances --query "Reservations[].Instances[].{"Ip" : PrivateIpAddress, "Type" : InstanceType, "Name" : Tags[?Key == 'Name'].Value, "Env" : Tags[?Key == 'Env'].Value}" --region ap-northeast-2 --profile profile1 --output json > records.txt
cat << EOF > ec2_list.py
#!/usr/bin/python
import os
import json
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill, Color
def deco_cell(ws, cell, bold, horizon, color):
box = Border(left=Side(border_style="thin", color='FF000000'),
right=Side(border_style="thin", color='FF000000'),
top=Side(border_style="thin", color='FF000000'),
bottom=Side(border_style="thin", color='FF000000'),
diagonal=Side(border_style="thin", color='FF000000'),
diagonal_direction=0, outline=Side(border_style="thin", color='FF000000'),
vertical=Side(border_style="thin", color='FF000000'),
horizontal=Side(border_style="thin", color='FF000000'))
ws[cell].font = Font(name="맑은 고딕", size=10, bold=bold)
ws[cell].alignment = Alignment(horizontal=horizon, vertical="center")
if color != '':
ws[cell].fill = PatternFill(patternType='solid', fgColor=Color(color))
ws[cell].border = box
def deco_excel(save_path):
wb = load_workbook(filename=save_path, read_only=False, data_only=False)
ws = wb["EC2 List"]
# ALL
for each_row in ws.rows:
for each_row_cell in each_row:
cell = str(each_row_cell)[6:-1].split('.')[-1]
if 'A' in cell or 'E' in cell:
deco_cell(ws, cell, False, 'center', '')
else:
deco_cell(ws, cell, False, 'left', '')
# Header
for i in range(ord('A'), ord('F')):
deco_cell(ws, chr(i) + str(1), True, 'center', 'c6e0b4')
# ALL Width
ws.column_dimensions['A'].width = 8
ws.column_dimensions['B'].width = 30
ws.column_dimensions['C'].width = 9
ws.column_dimensions['D'].width = 12
ws.column_dimensions['E'].width = 7.5
wb.save(save_path)
file_path = './records.txt'
save_path = './ec2_list.xlsx'
if os.path.isfile(save_path):
os.remove(save_path)
json_data = open(file_path).read()
records = json.loads(json_data)
Name = []
Type = []
IP = []
Env = []
for record in records:
if not record['Env']:
env = 'TEMP'
else:
env = str(record['Env'][0])
Name.append(str(record['Name'][0]))
Type.append(str(record['Type']))
IP.append(str(record['Ip']))
Env.append(env)
df = pd.DataFrame({'Name': Name, 'Type': Type, 'IP': IP, 'Env': Env})
df = df.sort_values(['Env', 'Type'], ascending=[True, True])
df = df.reset_index(drop=True)
df.to_excel(save_path,sheet_name='EC2 List')
deco_excel(save_path)
EOF
chmod 755 ec2_list.py
python3.6 ./ec2_list.py
rm -rf ./ec2_list.py
rm -rf ./records.txt
echo "Success Create ec2_list.xlsx"
다양한 방법으로 CLI를 활용하여 원하는 텍스트를 뽑아서 사용할 수 있다.