개발자와 DevOps를 위한 AWS CLI 환경 구성

글쓴이 상배 윤 날짜

리눅스 환경에서 CLI를 다루어 본 적이 있다면 그 강력함을 알고 있을 것이다. GUI는 미리 정의된 어떤 작업을 “사람이 수행하도록 인터페이스를 제공”하는게 목적이다. 애초에 기계가 잘 수행 할 수 있는 “자동화”를 목적으로 만든 툴이 아니다. 소프트웨어 개발자나 시스템 관리자는 어떤 작업을 기계가 잘 수행하도록 하는걸 목적으로 한다. 순차적인 작업, 특정 시간/특정 조건에 수행해야 하는 작업 들을 가능한 자동화 하려 한다. 이런 환경에서는 결국 CLI를 이용해야 한다.

만약 AWS 환경에서 개발이나 운영을 해야 한다면, CLI는 옵션이 아닌 필수다. 반드시 익혀서 사용해야만 한다.

운영체제 선택

개인적인 선입견이 들어 갔음을 우선 밝힌다. 선입견은 개인이 살아온 환경에 의해서 만들어지는 바, 내 환경을 먼저 설명해야 겠다.

  1. 프론트엔드 개발은 한적이 없다. HTML, CSS, Javascrit는 코드 볼 수 있는 정도다. 굳이 필요하면 프로토타이핑에 써먹기는 한다. 왜냐하면
  2. 안드로이드, iOS와 애플리케이션 같은 걸 만들어 본적이 없고 만들 생각도 없다. 이런 와중에 그럴싸하게 프로토타이핑을 하려면 HTML로 UI는 붙여줘야 하기 때문이다.
  3. 그러니까 백엔드 서버 개발자인 거다.
  4. LAMP(Linux, Apache, Mysql, PHP) 부터 시작했으니, 그냥 리눅스 서버 기반의 서버 개발자다.
  5. 언어는 지금은 주력이 Go 이고, Python, Ruby 등은 필요할 때 써먹는 정도다. C/C++은 기억도 안난다.
  6. 에디터는 VIM
  7. 2011년도 쯤에 AWS 환경에서 개발한 이래로 뭔가 DevOps 느낌의 개발자가 됐다.
  8. AWS 환경에서 개발을 한다고 하면, 뭐 윈도우즈 솔류션이 있기도 하지만 그냥 리눅스 환경이라고 생각하는게 속이 편하다.

이 글을 읽고 있다면 AWS에서 뭔가 해보겠다는 계획을 가지고 있을 건데, 그냥 리눅스 쓰자. 요즘 개발자는 노트북에 기본 16G 메모리는 달고 있는데, 이 정도면 노트북에 (테스트용도의) 리눅스 클러스터도 만들 수 있다.

이런 이유로 이 문서는 리눅스 정확히는 우분투 리눅스 18.04 를 기준으로 작성이 됐다.

AWS CLI 설치

Python pip로 설치한다. 우분투 리눅스에 설치된 python과 충돌나면 골치 아프니 python3 가상환경(virtualenv)을 만들기로 했다.

$ sudo apt-get install python-virtualenv
$ virtualenv -p python3 awscli
$ source awscli/bin/activate
$ python --version
Python 3.6.7

pip를 이용해서 awscli를 설치한다.

$ pip install awscli --upgrade 

aws cli 설치를 테스트해보자.

$ aws --version
aws-cli/1.16.81 Python/3.6.7 Linux/4.15.0-43-generic botocore/1.12.71

테스트용 IAM 만들기

aws cli는 AWS의 서비스를 제어 할 수 있는 도구다. 인스턴스, VPC, RDS, SQS, SNS.. 모든 서비스를 만들고 모니터링하고, 중지하고 삭제할 수 있는 편리하고 강력한도구다. 그러므로 aws cli는 유저와 애플리케이션의 역할 별로 권한을 제한 할 수 있어야 한다.

지금 설치한 aws cli를 이용해서 의미있는 작업을 하기 위해서는 AWS IAM을 이용해서 권한을 받아야 한다. aws cli 테스트를 위해서 S3 접근 권한을 가지는 IAM을 만들도록 하겠다.

AWS 웹 콘설에 접근 IAM 서비스를 찾는다.

IAM 대시보드에서 users > Add user를 선택해서 유저를 만들 수 있다.

User name 은 awsclitest로 했다. Programmatic access와 AWS Management Console access 두 개의 Access type이 있다.

  • Programmatic access : AWS 자원에 접근하려는 애플리케이션을 위한 타입
  • AWS Management Console access : AWS 웹 콘솔을 통해서 AWS 자원에 접근하려는 유저를 위한 타입

aws cli 툴은 애플리케이션이므로 Programmatic access를 선택했다.

다뤄야 할게 많은데, 자세한 것들은 다른 IAM 포스트를 통해서 살펴보도록 하겠다. 여기에서 유저 권한을 설정한다. Attach existing policies directly를 이용해서, AWS에 미리 설정된 기본 권한 정책(policy)를 가져다 쓰기로 했다. Filter policies 를 이용용해서 AmazonS3FullAccess 정책을 찾아서 붙였다.

유저가 만들어지면 Access Key ID와 Secret access key 가 만들어진다. AWS 자원에 접근하려는 애플리케이션들은 이 key들을 이용해서 권한을 획득 할 수 있다.

AWS CLI 실행 환경 설정

발급 받은 Access key ID와 Secret access key를 애플리케이션에서 사용 할 수 있도록 설정해야 한다. aws configure 명령으로 설정 할 수 있다.

$ aws configure
AWS Access Key ID [****************BOIQ]: AKIAJHDI25QJPN2VHCWQ
AWS Secret Access Key [****************e0oa]: 3sYL6gOAn4X3Rmxxxx....
Default region name [ap-northeast-2]: 
Default output format [json]: 

설정은 $HOME/.aws 디렉토리에 저장된다. config와 credentials 두 개의 파일이 만들어진다. 지금은 aws cli로 만들었지만 익숙해지면 직접 편집해도 된다.

$ cat config 
[default]
region = ap-northeast-2
output = json

애플리케이션이 작업을 요청할 리전(region)과 출력 포맷을 설정한다.

$ cat credentials 
[default]
aws_access_key_id = AKIAJHDI25QJPN2VHCWQ
aws_secret_access_key = 3sYL6gOAn4X3Rmsxxxxx....

[dbadmin]
aws_access_key_id = <aws_access_key_id>
aws_secret_access_key = <aws_secret_access_key>

access key와 secret access key를 설정한다. 하나 이상의 프로파일을 가질 수 있어서, 애플리케이션 목적에 따라서 선택해서 사용 할 수 있다.

AWS CLI 사용

  • –profile : 프로파일을 선택 할 수 있다. 사용하지 않을 경우 default 프로파일이 선택된다.
  • –region : AWS 명령을 전송할 AWS 리전을 선택할 수 있다. 설정하지 않을 경우 config 파일의 default에 있는 리전이 선택된다.
  • –output : 출력 형식을 설정 할 수 있다.
$ aws s3 ls storage.joinc.s3
                           PRE object/
2018-12-03 23:28:36        770 file.go

ec2에 대한 정보를 요청해봤다.

$ aws ec2 describe-instances

An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.

권한이 없어서 실패했다. 테스트를 위해서 IAM 권한에 AdministratorAccess 를 추가했다.

$ aws ec2 describe-instances --output table
---------------------------------------------------------------------------------
|                               DescribeInstances                               |
+-------------------------------------------------------------------------------+
||                                Reservations                                 ||
|+--------------------------------+--------------------------------------------+|
||  OwnerId                       |  5223730xxxxxx                              ||
||  ReservationId                 |  r-07c5d2b6e19458781                       ||
|+--------------------------------+--------------------------------------------+|
|||                                 Instances                                 |||
||+------------------------+--------------------------------------------------+||

AWS Shell

aws cli는 강력하지만 옵션들을 외워야 하기 때문에 사용하기가 쉽지 않다. aws-shell 을 이용하면 좀 더 쉽게 명령을 내릴 수 있다. pip로 설치하자.

$ pip install aws-shell

aws-shell 명령을 누르면 aws-shell 터미널로 진입할 수 있다.

$ aws-shell 
First run, creating autocomplete index...
Creating doc index in the background. It will be a few minutes before all documentation is available.
aws> 

 [F2] Fuzzy: ON  [F3] Keys: Emacs  [F4] Single Column  [F5] Help: ON  [F9] Focus: cli  [F10] Exit      

기능들

자동완성을 지원한다. 명령과 옵션을 쉽게 선택할 수 있다.

사용예제와 문서도 출력한다.

기타 아래 기능들을 지원한다.

  • Service Side Auto Completion : aws-shell 은 boto3를 사용하고 있다. 유저 명령에 따라서 ec2 인스턴스 목록, DynamoDB 테이블 이름, IAM 유저 이름등을 가져와서 보여준다.
  • Command History : ~/.aws/shell/history 파일에 명령어 목록을 저장한다. 사용자는 방향키를 이용해서 히스토리에서 명령을 선택 할 수 있다.
  • Inline Documentation : 해당 명령에 관련된 aws 문서를 출력한다. 한글 문서가 없는게 좀 아쉽다.

예제 : ec2 instance stop

stop-instance 명령을 이용해서 인스턴스를 종료 할 수 있다. 인스턴스를 종료하기 위해서는 instance id를 알고 있어야 하는데, aws-shell은 서버와 상호작용해서 instance id를 자동으로 출력해주기 때문에 작업할 인스턴스를 쉽게 선택 할 수 있다.


카테고리: AWS Cloud 기초

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

Bitnami