Amazon Web Services 한국 블로그

DevOps를 위한 AWS CLI 활용팁

AWS 클라우드를 사용하는 개발자 및 운영자라면 웹 기반 관리 콘솔 사용에 익숙하실 것입니다. 하지만, 좀 더 다양한 기능을 수행하거나 반복 작업 그리고 프로그래밍 언어를 통한 체계적인 관리가 필요하다면 AWS 명령줄 인터페이스(Command-line Interface, CLI)를 사용하는 것이 필요합니다.

AWS CLI 를 이용하면 다양한 AWS 서비스를 스크립트로 작성을 해서 여러 작업을 한번에 동작 시킬 수 있으며, 각종 관리 자동화를 수행하는데 유리합니다. AWS의 모든 서비스 기능은 API를 호출함으로서 가능하며, CLI 역시 간단한 명령줄을 통해 이러한 광범위한 API 기능을 수행할 수 있습니다. 이번 글에서는 여러분이 알아두시면 좋은 편리한 몇 가지 CLI 팁을 설명 드리겠습니다.

AWS CLI를 설치하고 나서 처음 해야 할 일은 Access Key 및 Secret Access Key 그리고 기본 리전 및 출력 결과를 설정하는 것입니다. (이 때, 접근 키들은 Root 권한의 키가 아니라, IAM(Identity & Access Management)을 통해 개별 서비스 권한 사용자를 생성하고 만든 키를 사용하는 것이 안전합니다. 더 자세한 사항은 IAM 사용자 가이드를 참고하세요.)

$ aws configure
AWS Access Key ID [****************YOJQ]: 
AWS Secret Access Key [****************5Mhd]:   
Default region name [ap-northeast-1]:
Default output format [json]:

Tip 1. AWS CLI 지원 도구를 활용하라.
AWS CLI의 대부분의 명령어는 $ aws help를 실행해보시면 알아보실 수 있습니다. 하지만, 매번 명령어를 기억하기는 쉽지 않습니다. 손쉽게 각 CLI 명령어를 자동 완성을 통해 실행하고자 한다면 aws shell를 설치해서 사용하시는 것을 권장합니다.

본 기능은 Donne Martin이 만든 SAWS라는 CLI 지원용 오픈소스 도구를 AWS CLI팀과 함께 통합한 것으로 다양한 상위 커맨드와 하위 커맨드를 자동 완성을 지원 합니다.

손쉽게 명령어를 입력 중에도 인라인 명령어 도움말을 바로 보실 수도 있습니다.

명령어 입력 중 AWS 리소스 자원, 예를 들어 Amazon EC2 instance IDs, Amazon SQS queue URL, Amazon SNS 토픽명) 등을 자동 완성 할 수도 있습니다.

그밖에 명령어 실행 기록 및 내보내기, 각종 기능의 도구바 지원 명령어 추천 기능 지원 등 다양한 기능도 제공합니다. 더 자세한 것은 aws-shell 기본 사용법Super-Charge Your AWS Command-Line Experience with aws-shell 블로그 글을 참고하시기 바랍니다.

Tip 2. aws configure 서브 명령어를 사용하라.
AWS CLI 설정을 위한 여러 서브 명령어가 존재합니다. 다음은 설정과 관련된 서브 명령어 입니다.

    $ aws configure
    list – 설정 관련 소스들을 보여준다.
    get – 하나의 설정 변수 값을 가져온다.
    set – 하나의 설정 변수 값을 저장한다.

예를 들어, 리전을 설정하는 것은 다음과 같이 하면 됩니다.

$ aws configure set profile.prod.region us-west-2

좀 더 자세히 살펴봐야 하는 것은, 설정 파일은 두개의 파일로 구성됩니다.

위치 기능
~/.aws/credentials 모든 AWS SDK에서 지원. 오직 인증 정보만 담고 있다.
~/.aws/config CLI에서만 사용되는 정보. 인증 정보를 담을 수도 있다.

설정 파일이 나뉜 것은 위와 같이 각기 수행하는 기능의 목적이 다르기 때문입니다. 구체적으로 명령 예를 들면 다음과 같습니다.

Access Key 아이디 설정

$ aws configure set profile.prod.aws_access_key_id foo
~/.aws/credentials ~/.aws/config
[prod]
aws_access_key_id = foo
 

Secret Access Key 아이디 설정

$ aws configure set profile.prod.aws_secret_access_key bar
~/.aws/credentials ~/.aws/config
[prod]
aws_access_key_id = foo
aws_secret_access_key = bar
 

리전 및 아웃풋 형식 설정

$ aws configure set profile.prod.region ap-northeast-1
$ aws configure set profile.prod.output text
~/.aws/credentials ~/.aws/config
[prod]
aws_access_key_id = foo
aws_secret_access_key = bar
[profile prod]
region = ap-northeast-1
output = text

이런 설정 정보를 알고 싶으면 list 서브 명령어를 사용해서 정보를 가져오면 됩니다.

$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                             None    None
access_key     ****************YOJQ shared-credentials-file    
secret_key     ****************5Mhd shared-credentials-file    
    region           ap-northeast-1      config-file    

Tip 3. waiter를 적극 활용하라.
AWS CLI를 활용하면 쉘스크립트를 통해 프로그래밍 방식으로 여러 명령어를 하나로 처리할 수 있습니다. 예를 들어, EC2와 관련된 작업을 하는 경우, 대상이 되는 EC2가 동작하게 되고 나서 다른 동작을 처리해야 하는 경우가 생깁니다. 아래 그림은 일반적인 EC2 라이프 사이클입니다.

인스턴스가 새롭게 생성될 때 까지 기다렸다가 그 다음 동작을 해야 한다면, AWS CLI를 이용하여 아래와 같은 스크립트를 작성할 수 있을 것입니다. (예시 코드이며, 리눅스 쉘 스크립트를 기본으로 했습니다. 윈도우 사용자라면 파워셀 등을 이용하셔서 작성하시면 됩니다)

#!/bin/bash
instance_id=$(aws ec2 run-instances --image-id ami-12345 \
        --query Instances[].InstanceId \
        --output text)
instance_state=$(aws ec2 describe-instances --instance-ids $instance_id \
        --query 'Reservations[].Instances[].State.Name')
while [ "$instance_state" != "running" ]
do
    sleep 1
    instance_state=$(aws ec2 describe-instances --instance-ids $instance_id \
        --query 'Reservations[].Instances[].State.Name')
done

위의 코드는 단순 합니다. 이미지 아이디를 통해서 인스턴스 아이디와 인스턴스 상태 정보를 가져옵니다. 그리고 인스턴스 상태가 아직 “running”이 아니면, 무한 반복을 하면서 1초마다 확인해서 반복 루프를 도는 것입니다.

그런데, 이렇게 작성을 하게 되면 타임아웃 설정이 없어서, 대상 인스턴스가 뜨지 않은 경우 무한 반복을 하게 되고, 실패처리 로직이 없다는 문제가 발생합니다. 또한, 매우 코드가 길어지게 되는 단점이 있습니다. 이러한 문제를 해결하기 위해 존재하는 것이 “waiter”입니다. 이것을 활용한 명령어는 다음과 같이 됩니다.

...
instance_id=$(aws ec2 run-instances --image-id ami-12345 \
        --query Instances[].InstanceId \
        --output text)
instance_state=$(aws ec2 wait instance-running --instance-ids $instance_id \
...

EC2에 대해 wait 서브 명령어 다음에 나오는 것은 “대기 이름(waiter name)”입니다. 여기서는 instance-running이 됩니다. 위 명령으로 해당 인스턴스가 “러닝”상태가 될 때 까지 기다립니다.

사용 가능한 “대기 이름”은 help 명령어를 통해서 확인 할 수 있습니다. 또한, 이러한 wait 명령어는 EC2만이 아니라, 다른 서비스에도 적용할 수 있으며, 아래 코드는 Amazon DynamoDB 사례입니다.

$ aws dynamodb wait table-exists
$ aws dynamodb wait table-not-exists

AWS CLI는 AWS 서비스를 손쉽게 조작하는데 있어서 매우 중요한 도구입니다. 명령어 기반의 인터페이스로서 콘솔에서 하기 어려운 조작을 쉽고 편리하게 처리할 수 있습니다. AWS CLI를 사용해서 보다 강력한 AWS 서비스를 사용할 수 있으며, 다양한 활용 팁을 AWS CLI 영문 블로그 혹은 아래 한국팀에서 만든 AWS CLI 활용 사례 예제 코드도 한번 익혀보시기 바랍니다.

본 글은 아마존웹서비스 코리아의 솔루션즈 아키텍트가 국내 고객을 위해 전해 드리는 AWS 활용 기술 팁을 보내드리는 코너로서, 이번 글은 박선용 솔루션즈 아키텍트께서 작성해주셨습니다.