AWS 커맨드라인 인터페이스(awscli) 기초

들어가며

AWS 커맨드 라인 인터페이스AWS Command Line Interface, awscli는 커맨드 라인에서 아마존 웹 서비스Amazon Web Service의 API를 직접 호출할 수 있게 도와주는 명령어입니다.

44BITS 소식과 클라우드 뉴스를 전해드립니다. 지금 5,000명 이상의 구독자와 함께 하고 있습니다 📮

설치

AWS CLI는 파이썬Python으로 만들어진 커맨드 라인 명령어입니다. 깃허브GitHub aws/aws-cli에서 개발중이며, 최신 버전은 릴리즈 페이지에서 확인할 수 있습니다. 각 운영체제 별 설치방법은 아래에서 다룹니다.

맥OSMacOS

홈브루Homebrew를 사용하는 경우 다음 명령어로 설치할 수 있습니다.

$ brew install awscli

설치 후에는 which로 설치 경로를 확인하고, 실행이 되는 지 확인해봅니다.

$ which aws
/usr/local/bin/aws

$ aws --version
aws-cli/1.14.50 Python/3.6.4 Darwin/17.3.0 botocore/1.9.3

실행 파일의 경로가 제대로 잡혀있지 않다면 홈브류의 link 명령어를 사용해 재설정합니다.

$ brew link awscli

다음 명령어로 최신 버전으로 업그레이드 할 수 있습니다.

$ brew upgrade awscli

우분투Ubuntu

우분투Ubuntu에서 AWS CLI를 사용하기 위해서는 먼저 파이썬Python을 설치해야합니다. 우분투의 패키지 관리자인 apt-get으로 python3 패키지를 설치합니다. 이어서 파이썬의 패키지 관리자 pip를 설치합니다.

$ apt-get install python3
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python3 get-pip.py

pip를 사용해 awscli 패키지를 설치합니다.

$ pip install awscli --upgrade

which로 설치 경로를 확인하고 실제로 사용 가능한지 실행해봅니다.

$ which aws
/usr/local/bin/aws

$ aws --version
aws-cli/1.15.14 Python/3.5.2 Linux/4.9.87-linuxkit-aufs botocore/1.10.14

아마존 리눅스Amazon Linux

AWS에서 제공하는 아마존 리눅스의 경우 awscli가 미리 설치되어있습니다.

그 외의 환경

어떤 환경이라도 AWS CLI 설치 방법의 큰 틀은 비슷합니다. 사용하는 운영체제에 등록된 공식 패키지가 있는 경우 이를 사용하는 방법이 가장 쉽습니다. 공식 패키지가 없는 경우 파이썬을 설치하고* 파이썬 패키지 awscli를 설치하면 됩니다. 설치 후 실행 파일의 PATH가 제대로 잡혀있는지 확인해야합니다. 좀 더 자세한 방법은 AWS에서 제공하는 공식 문서를 참고해주시기 바랍니다.

* AWS CLI는 파이썬 2.x도 지원하지만, 파이썬 3.x를 사용할 것을 권장합니다. 또한 파이썬 패키지 관리자인 pip도 최신 버전을 사용하는 것이 좋습니다.

인증 설정

AWS CLI를 실제로 사용하기 위해선 AWS 계정이 필요합니다. AWS 루트 계정이나 루트 계정으로 생성된 사용자User 계정의 액세스 키와 시크릿 액세스 키를 등록해야합니다. 액세스 키를 발급하는 방법에 대해서는 AWS IAM 사용자의 액세스 키 발급 및 관리를 참고해주세요. 여기서는 액세스 키를 이미 발급 받았다고 가정합니다.

configure 명령어

로컬에 액세스 키를 등록하는 가장 쉬운 방법은 configure 명령어를 사용하는 방법입니다. aws configure를 실행하면 4개의 값을 즉석에서 지정할 수 있습니다.

$ aws configure
AWS Access Key ID [None]: AKIAJEXHUYCTEHM2D3S2A
AWS Secret Access Key [None]: 3BqwEFsOBd3vx11+TOHhI9LVi2
Default region name [None]:ap-northeast-2
Default output format [None]:

각 필드의 의미는 다음과 같습니다.

AWS 액세스 키 IDAWS Access Key ID
액세스 키의 ID 값을 지정합니다.
AWS 시크릿 액세스 키AWS Secret Access Key
액세스 키의 ID 값애 대응하는 시크릿 키를 지정합니다. 시크릿 키는 오직 발급하는 시점에만 확인할 수 있습니다.
기본 리전Default region name
aws 명령어를 사용할 때 API를 호출할 기본 리전을 지정합니다. ap-northeast-2는 서울 리전입니다. 이 값은 명령어를 실행할 때 --region <REGION> 옵션으로 덮어쓸 수 있습니다.
기본 출력 포맷Default output format
API 호출한 결과를 출력할 포맷을 지정합니다. text, json, table 중에 하나를 사용할 수 있습니다. 이 값은 명령어를 실행할 때 --output <FORMAT> 옵션으로 덮어쓸 수 있습니다.

여기서 가장 중요한 값은 AWS 액세스 키 ID와 AWS 시크릿 액세스 키입니다. 이 값이 제대로 설정되어야만 API 호출이 성공적으로 이루어집니다.

인증 정보가 저장된 설정 파일

configure 명령어로 저장한 내용은 ~/.aws/config~/.aws/credentials로 나눠서 저장됩니다. credentials에는 인증과 관련된 값들이 저장되고, 그 외의 설정은 config 파일에 저장됩니다.

~/.aws/config의 내용입니다.

[default]
region = ap-northeast-2

~/.aws/credentials의 내용입니다.

[default]
aws_secret_access_key = AKIAJEXHUYCTEHM2D3S2A
aws_access_key_id = 3BqwEFsOBd3vx11+TOHhI9LVi2

configure 명령어를 사용하지 않고, 이 파일들을 직접 만들어도 똑같이 인증이 가능합니다. configure 명령어는 단지 이 파일들을 생성합니다.

다중 계정 설정

앞에서 살펴보았듯이 aws configure 명령어를 사용하는 경우 [default] 섹션에 지정한 값들이 저장됩니다. AWS CLI에서는 설정 파일의 섹션을 지정하는 방식으로 다수의 계정(프로필)을 지원합니다. aws configure 명령어를 사용하는 경우, --profile <PROFILE NAME> 옵션을 지정해 다른 계정이나 사용자의 액세스 키를 등록할 수 있습니다.

$ aws configure --profile another_user
AWS Access Key ID [None]: AKIAJEXHUYCTEHM2D3S2B
AWS Secret Access Key [None]: 3BqwEFsOBd3vx11+TOHhI9LVi3
Default region name [None]: us-west-2
Default output format [None]: json

이제 설정 파일들을 출력해봅니다.

$ cat ~/.aws/credentials
[default]
aws_secret_access_key = 3BqwEFsOBd3vx11+TOHhI9LVi2
aws_access_key_id = AKIAJEXHUYCTEHM2D3S2A
[another_user]
aws_secret_access_key = 3BqwEFsOBd3vx11+TOHhI9LVi3
aws_access_key_id = AKIAJEXHUYCTEHM2D3S2B

$ cat ~/.aws/config
[default]
region = ap-northeast-2
[profile another_user]
region = us-west-2
output = json

직접 파일을 설정 파일을 작성하는 경우 두 파일의 프로필 지정 방식이 약간 차이가 있다는 점에 주의가 필요합니다. 로컬에 다수의 프로필이 등록 되어 있는 경우 aws 명령어를 실행할 때 --profile <PROFILE_NAME> 옵션을 지정해 특정 프로필을 사용할 수 있습니다. 프로필 옵션을 지정하지 않은 경우 [default] 섹션의 값이 사용 됩니다.

기본적으로 사용되는 프로필을 변경하고자 하는 경우 AWS_PROFILE 환경 변수를 지정합니다.

환경변수

환경변수를 사용하면 설정 파일을 사용하지 않고 인증 키를 임시로 사용할 수 있습니다. 다음 두 개의 환경변수에 액세스 키 ID와 시크릿 액세스 키를 지정합니다.

기본 리전이나 기본 출력 형식은 다음 환경 변수로 지정할 수 있습니다.

export 명령어로 실행중인 셸에 환경변수를 등록할 수 있습니다.

$ export AWS_ACCESS_KEY_ID=AKIAJEXHUYCTEHM2D3S2A
$ export AWS_SECRET_ACCESS_KEY=3BqwEFsOBd3vx11+TOHhI9LVi2

env 명령어로 환경변수 목록을 확인할 수 있습니다.

$ env | grep AWS
AWS_SECRET_ACCESS_KEY=3BqwEFsOBd3vx11+TOHhI9LVi2
AWS_ACCESS_KEY_ID=AKIAJEXHUYCTEHM2D3S2A

환경변수에 등록된 인증키는 파일로 설정한 인증키보다 우선적으로 사용됩니다. 이 외에도 인증이나 설정값을 지정하는 방법이 몇 가지가 더 있습니다. 각 방법은 적용되는 우선 순위가 다릅니다. 자세한 내용은 공식 문서의 환경 변수우선 순위를 참고해주세요.

사용법

AWS CLI를 사용하면 거의 모든 AWS 상의 API를 사용하는 것이 가능합니다. 여기서는 EC2와 S3에 대해서 실행가능한 명령어 몇 개를 살펴봅니다. 모든 명령어는 공식 레퍼런스와 각 서비스에 대한 공식 문서들에서 확인할 수 있습니다.

도움말

help를 사용해 각 명령어들의 사용법을 커맨드 라인에서 바로 확인할 수 있습니다.

$ aws help
$ aws <COMMAND> help
$ aws <COMMAND> <SUBCOMMAND> help

예를 들어 ec2 명령어의 사용법은 다음과 같이 확인할 수 있습니다.

$ aws ec2 help

ec2 명령어의 하위 명령어인 describe-images의 사용법은 다음과 같이 확인할 수 있습니다.

$ aws ec2 describe-images help

ECS 명령어로 배우는 awscli

이 절에서는 AWS CLI를 사용해 살펴보기 위해 ECS와 관련된 명령어를 몇 가지 실행해보겠습니다. ECS 명령어를 호출하는 기본적인 구조는 다음과 같습니다.

$ aws ecs <SUBCOMMAND>

프로필을 변경하는 경우 aws 명령어 바로 다음에 --profile옵션을 지정해줍니다.

$ aws --profile=<PROFILE_NAME> ecs <SUBCOMMAND>

리전이나 출력 형식을 변경하는 경우에도 마찬가지 입니다.

$ aws --region=<REGION> --output=<FORMAT> ecs <SUBCOMMAND>

AWS CLI를 사용하기 위한 인증 파일 생성에 대해서는 앞서 인증 설정 절에서 설명했습니다. 여기서는 인증 설정이 되어있다고 가정합니다.

먼저 여기서는 ECS 클러스터를 하나 생성해보겠습니다. ECS 클러스터를 생성은 create-cluster서브 명령어를 사용합니다. create-cluster를 호출할 때 필수적으로 지정해야 옵션은 클러스터 이름을 지정하는 --cluster-name입니다. 서브 명령어의 옵션은 전체 명령어 맨 뒤에 붙여줍니다. 여기서는 클러스터의 이름을 awesome-ecs-cluster으로 지정해주었습니다.

$ aws ecs create-cluster --cluster-name awesome-ecs-cluster
{
    "cluster": {
        "runningTasksCount": 0,
        "registeredContainerInstancesCount": 0,
        "clusterName": "awesome-ecs-cluster",
        "pendingTasksCount": 0,
        "clusterArn": "arn:aws:ecs:ap-northeast-2::cluster/awesome-ecs-cluster",
        "activeServicesCount": 0,
        "status": "ACTIVE"
    }
}

성공적으로 클러스터가 만들어진 것으로 보입니다. ECS 웹 콘솔에서 클러스터가 생성된 것을 확인할 수 있습니다.

새로 생성한 awesome-ecs-cluster 클러스트를 확인할 수 있습니다
새로 생성한 awesome-ecs-cluster 클러스트를 확인할 수 있습니다

이번에는 AWS CLI를 사용해 list-clusters 서브 명령어로 클러스터 목록을 출력해보겠습니다.

$ aws ecs list-clusters
{
    "clusterArns": [
        "arn:aws:ecs:ap-northeast-2::cluster/awesome-ecs-cluster"
    ]
}

앞에서 만든 awesome-ecs-cluster이 목록에 출력되면 정상입니다. 앞선 두 명령어의 값이 JSON으로 반환된 것을 알 수 있습니다. 다른 포맷이 어떻게 출력되는지도 확인해보겠습니다.

text 형식의 출력 결과입니다.

$ aws ecs --output=text list-clusters
CLUSTERARNS     arn:aws:ecs:ap-northeast-2::cluster/awesome-ecs-cluster

table 형식의 출력 결과입니다.

$ aws ecs --output=table list-clusters
---------------------------------------------------------------------------
|                              ListClusters                               |
+-------------------------------------------------------------------------+
||                              clusterArns                              ||
|+-----------------------------------------------------------------------+|
||  arn:aws:ecs:ap-northeast-2::cluster/awesome-ecs-cluster              ||
|+-----------------------------------------------------------------------+|

이번에는 클러스터를 삭제해보겠습니다. 클러스터를 삭제할 때는 delete-cluster 서브 명령어를 사용합니다. 클러스터 이름은 --cluster 옵션로 지정합니다. create-cluster와 옵션 이름이 다릅니다.

$ aws ecs delete-cluster --cluster awesome-ecs-cluster
{
    "cluster": {
        "runningTasksCount": 0,
        "registeredContainerInstancesCount": 0,
        "pendingTasksCount": 0,
        "status": "INACTIVE",
        "clusterName": "awesome-ecs-cluster",
        "activeServicesCount": 0,
        "clusterArn": "arn:aws:ecs:ap-northeast-2::cluster/awesome-ecs-cluster"
    }
}

list-clusters 명령어로 정상적으로 삭제되었는지 확인해봅니다.

$ aws ecs list-clusters
{
    "clusterArns": []
}

정상적으로 삭제된 것을 확인할 수 있습니다. ECS와 관련된 모든 명령어는 공식 레퍼런스에서 확인할 수 있습니다.

같이 보면 좋은 자료들

44BITS 로고

아마존 웹 서비스(AWS, Amazon Web Serivce)란?

🏷️ 키워드, 2020-01-20 - 아마존 웹 서비스는 아마존의 자회사로 같은 이름으로 퍼블릭 클라우드 컴퓨팅 서비스를 제공하고 있습니다. 대표적인 서비스로는 컴퓨팅 자원을 제공하는 EC2, 오브젝트 스토리지 S3, 프라이빗 클라우드 VPC, 권한 제어 IAM, 컨테이너 오케스트레이션 ECS, EKS 등이 있습니다.
44BITS 로고

커맨드라인 인터페이스, 셸, 터미널이란?

🏷️ 키워드, 2021-01-22 - 커맨드라인 인터페이스는 사용자가 텍스트로 명령어를 입력하고 다시 텍스트로 결과를 화면에 출력해주는 인터페이스를 가진 컴퓨팅 인터페이스를 의미합니다. 이 글에서는 커맨드라인 인터페이스를 소개하고 셸과과 터미널에 대해서 알아봅니다.
도움이 되셨나요?
RSS 리더 피들리에서 최신 글을 구독할 수 있습니다.
트위터, 페이스북으로 44BITS의 새소식을 전해드립니다.
✔ 44BITS의 다른 활동도 확인해보세요. 다양한 채널에서 만나볼 수 있습니다.
✔ 따뜻한 댓글 하나와 피드백은 큰 힘이 됩니다.

direnv를 사용한 디렉토리(프로젝트) 별 개발환경 구축: 루비, 파이썬, 노드 개발 환경 구축

🗒 기사, 2018-08-13 - direnv는 디렉터리 별로 셸 환경을 구축할 수 있게 해주는 도구입니다. 디렉터리 별 환경 변수 설정 법, 루비(Ruby), 파이썬(Python), 노드(Node) 등 프로그래밍 언어 프로젝트를 셋업하는 법을 소개합니다.
'좋은 기술 블로그를 만들어 나가기 위한 8가지 제언' 대표 이미지

좋은 기술 블로그를 만들어 나가기 위한 8가지 제언

🗒 기사, 2019-01-17 - 좋은 블로그를 정의하는 것은 간단하지 않습니다. 그럼에도 불구하고 분명히 좋은 블로그가 존재하고 다른 블로그와는 다른 무언가가 있습니다. 이 글에서는 기술 블로그를 중심으로, 좋은 블로그를 만들어나가기 위한 8가지 방법을 제언합니다.

깃헙(GitHub) 새로운 가격 정책 및 엔터프라이즈 플랜 발표 - 무료 플랜도 비공개 저장소를 무제한 사용 가능

🗞 새소식, 2019-01-09 - 깃헙(GitHub)에서 새해를 맞이해 달라지는 변경사항을 공지했습니다. 이제 무료 플랜에서도 비공개 저장소를 무제한으로 생성할 수 있습니다. 단, 협업은 3명까지만 가능합니다. 기존의 서비스형과 설치형으로 나누어져있던 엔터프라이즈 서비스가 통합되었습니다.