AWS 커맨드라인 인터페이스(awscli) 기초
들어가며
AWS 커맨드 라인 인터페이스AWS Command Line Interface, awscli는 커맨드 라인에서 아마존 웹 서비스Amazon Web Service의 API를 직접 호출할 수 있게 도와주는 명령어입니다.
설치
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와 시크릿 액세스 키를 지정합니다.
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
기본 리전이나 기본 출력 형식은 다음 환경 변수로 지정할 수 있습니다.
AWS_DEFAULT_REGION
AWS_DEFAULT_OUTPUT
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 웹 콘솔에서 클러스터가 생성된 것을 확인할 수 있습니다.
이번에는 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와 관련된 모든 명령어는 공식 레퍼런스에서 확인할 수 있습니다.
같이 보면 좋은 자료들
- 공식 문서 - aws — AWS CLI 명령어 레퍼런스
- 공식 문서 - AWS 커맨드 라인 인터페이스 사용 설명서
- awslabs/aws-shell - AWS CLI 통합 셸