AWS

AWS CLI로 인증 정보 (Access Key ID, Secret Access Key) 관리하기

Amazon Web Services(AWS)에 접근을 하기위해서는 필수적으로 인증 절차를 필요로 합니다. 사람이 직접 터미널 상에서 AWS CLI를 통해서 접근하든, 어플리케이션이 AWS SDK를 통해서 접근하든지, 적절한 방법을 통해 인증을 받지 않으면 AWS로 부터 정상적인 응답을 얻을 수 없습니다. 본 포스트에서는 AWS CLI를 통해서 간단하게 AWS 인증 정보를 설정하는 방법에 대해서 알아보도록 하겠습니다.

인증 정보 개념

AWS도 기본적으로 일반적인 웹사이트처럼 아이디와 비밀번호와 같은 인증 정보를 사용자로 부터 받아 검증하는 방식으로 인증을 처리합니다. 단지 차이는 AWS에서는 이 인증 정보를 다소 생소한 용어로 부르고 있기 때문에 이를 숙지해 놓으면 도움이 됩니다.

  • Access Key ID: 일반 웹사이트의 아이디에 해당. 줄여서 Aceess Key(접근키)라고 부르기도 함.
  • Secret Access Key: 일반 웹사이트의 비밀번호에 해당. 줄여서 Secret Key(보안키)라고 부르기도 함.

하나의 AWS 계정은 여러 개의 Access Key ID와 Secret Access Key 쌍을 생성해서 사용할 수 있습니다. AWS에서는 보안을 위해서 IAM 사용자에 대한 Access Key ID와 Secret Access Key를 생성하여 쓰도록 가이드하고 있습니다. IAM이 생소하시고 당장 IAM을 공부할 시간이 없으신 분들은 관련 개발자 가이드를 참조하셔서 루트 사용자에 대한 Access Key ID와 Secret Access Key를 생성하신 후 다음 섹션을 따라오시기 바랍니다.

인증 정보 설정

매번 AWS을 호출할 때 마다 위에서 생성한 Access Key ID와 Secret Access Key를 보내려면 클라이언트 측에서 설정이 필요합니다. AWS CLI은 간편하게 인증 정보 설정이 가능하도록 aws configure 커맨드를 제공해주고 있습니다. 예를 들어, 다음 커맨드는 Access Key ID는 ABCDEF로 Secret Access Key는 GHIJKL로 설정해줍니다. (실제값은 이보다 훨씬 깁니다.)

1
2
3
4
5
$ aws configure
AWS Access Key ID [None]: ABCDEF
AWS Secret Access Key [None]: GHIJKL
Default region name [None]: ap-northeast-2
Default output format [None]: json

아래 두 개의 항목(디폴트 으 리전 및 출력 포멧)은 인증과 직접적인 관계는 없으며 편의상 제공되는 옵션이라고 생각하시면 됩니다. AWS CLI의 모든 커맨드는 --region--output 옵션을 가지고 있는데, 생략했을 경우, aws configure 커맨드로 설정해준 값이 사용됩니다.

인증 정보 확인

설정한 인증 정보를 확인하기 위해서는 aws configure list 커맨드를 사용하시면 됩니다. 아래와 같이 테이블 형태로 결과가 출력이 돠는데, 보안을 위해서 인증 정보 설정값들은 뒷에 4자리만 보여줍니다. 그 밖에 profile 항목을 포함한 다른 결과값들은 다음 섹션에서 차례대로 다루도록 하겠습니다.

1
2
3
4
5
6
7
$ aws configure list
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key ****************CDEF shared-credentials-file
secret_key ****************IJKL shared-credentials-file
region ap-northeast-2 config-file ~/.aws/config

추가로 aws configure get 커맨드를 사용하면 마스킹되지 않은 인증 정보도 확인할 수 있습니다.

1
2
3
4
$ aws configure get aws_access_key_id
ABCDEF
$ aws configure get aws_secret_access_key
GHIJKL

반대로 aws configure set 커맨드를 사용하면 개별 항목 별로 설정이 가능한데, Access Key ID를 바꾸면서 Secret Access Key는 안 바꾸는 경우는 거의 없으므로 이 커맨드는 그리 많이 쓸 일은 없는 것 같습니다.

인증 프로파일 설정

만약 한 쌍 이상의 인증 정보를 설정하고 싶을 때는 어떻게 할까요? 인증 정보가 외우기 쉬운 형태도 아니고 매번 aws configure 커맨드를 통해서 바꾸기는 번거롭습니다. 다행히 AWS에서는 프로파일 기능을 지원하기 때문에 우리는 여러 쌍의 인증 정보를 설정해놓고 전환하면서 사용할 수 있습니다. 사용 방법은 위에서 살펴본 aws configure 커맨드에 --profile 옵션만 추가해주면 됩니다. --profile 옵션을 생략한 경우는 디폴트 프로파일에 대한 커맨드였다고 보시면 됩니다.

예를 들어, 개인 AWS 계정에 대한 인증 정보는 디폴트 프로파일을 사용하고, 회사 AWS 계정에 대한 인증 정보는 다른 프로파일에 설정해서 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
$ aws configure --profile work
AWS Access Key ID [None]: WORK1234
AWS Secret Access Key [None]: WORK5678
Default region name [None]: us-east-1
Default output format [None]: table

$ aws configure list --profile work
Name Value Type Location
---- ----- ---- --------
profile work manual --profile
access_key ****************1234 shared-credentials-file
secret_key ****************5678 shared-credentials-file
region us-east-1 config-file ~/.aws/config

디폴트 프로파일 외에 다른 프로파일을 사용할 때는 AWS CLI 커맨드에 --profile 옵션을 붙여주기만 하시면 됩니다. 아래 예제는 동일한 aws ec2 describe-instances 커맨드를 디폴트 프로파일과 work 프로파일에 각각 실행시킨 모습입니다. 두 프로파일이 접근하는 AWS 계정이 다르기 때문에 결과값의 내용이 상이할 뿐만 아니라 결과 포멧 설정도 다르기 때문에 (json vs. table) 다른 스타일로 출력되게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
$ aws ec2 describe-instances
{
"Reservations": [(... 생략 ...)]
}

$ aws ec2 describe-instances --profile test
------------------------------------------------------------------------------
| DescribeInstances |
+----------------------------------------------------------------------------+
|| Reservations ||
|+-------------------------------------+------------------------------------+|
(... 생략 ...)

아무래도 더 자주 사용하는 AWS 계정을 디폴트 프로파일로 설정해놓는 것이 타이핑을 적게 할 수 있으므로 더욱 생산적일 것입니다.

인증 정보 파일

지금까지 aws configure 커맨드를 통해서 설정한 인증 정보들은 내 컴퓨터의 어느 곳에 저장되는 걸까요? 사용자 홈 디렉터리를 보시면 .aws라는 디렉토리에 credentials라는 파일을 찾으실 수 있을 겁니다. 이 파일을 열어보면 프로파일 별로 인증 정보가 저장되어 있음을 확인하실 수 있으실 겁니다. 사실 구지 aws configure 커맨드를 사용하지 않더라도 이 파일을 직접 수정하실 수도 있습니다. 당연히 부득이한 경우가 아니라면 권장되지는 않습니다.

1
2
3
4
5
6
7
$ cat ~/.aws/credentials
[default]
aws_access_key_id = ABCDEF
aws_secret_access_key = GHIJKL
[work]
aws_access_key_id = WORK1234
aws_secret_access_key = WORK5678

참고로 .aws 디렉토리에는 credentials 파일 말고도 config라는 파일도 있는데 이 곳에는 위에서 설정한 디폴트 기본 리전 및 출력 포멧 옵션들이 저장되어 있습니다.

마치면서

credentials 파일에 있는 설정되어 있는 인증 정보를 이용하는 것은 비단 AWS CLI뿐만이 아닙니다. 엄밀히 말하면 해당 머신에서 돌아가는 모든 앱들이 이 인증 정보를 이용하여 AWS SDK를 통해 AWS 서비스들과 연동할 수 있습니다. 환경 변수나 소스 코드 등의 명시적인 방법을 통해 인증 정보 설정해주지 않았다면 디폴트로 credentials 파일의 인증 정보가 사용되기 때문입니다.

특히, AWS 연동 기능을 가지고 있는 오픈 소스 소프트웨어들은 우선적으로 credentials 파일의 디폴트 프로파일에 설정된 인증 정보를 사용하는 경우가 대부분이기 때문에 아무 설정없이도 본인 AWS 계정으로 인증되어 작동되는 경우가 많습니다.

공유하기