Linux 명령어/AWS CLI

AWS CLI - Query 옵션 활용하기

Camouflage129 2020. 10. 19. 16:19

Jenkins Pipeline에서와 같이 배포할 때, 특정 값을 가져와서 입력해야 하는 경우가 많다.

 

이럴때 CLI를 통해 가져온 후, 그 값을 바로 넣으면 편한데 --query라는 옵션을 통해 정말 원하는 조건에 해당하는 값을 가져올 수 있다.

 

아래의 문법을 따르기 때문에 직접 독스를 읽어보는것도 좋다.

 

jmespath.org/

 

JMESPath — JMESPath

Libraries in Multiple Languages Each JMESPath library passes a complete suite of compliance tests to ensure they work as intended. There are libraries in multiple languages including python, php, javascript and lua.

jmespath.org

 

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를 활용하여 원하는 텍스트를 뽑아서 사용할 수 있다.