AWS

Boto3를 위한 AWS Credentials 구성하기

vcxz 2023. 6. 5. 18:30

 

Boto3(AWS SDK for Python)로 AWS 서비스에 접속할 때 Credentials(자격 증명)가 필요합니다.

자격 증명은 Access Key(액세스 키)와 Secret Access Key(비밀 액세스 키)를 말합니다. 쉽게 말하면 ID와 비밀번호라 할 수 있습니다. (임시 자격 증명을 할 때는 Session Token을 씁니다.)

AWS 콘솔에서 서비스를 쓸 때는 이 키들이 딱히 필요 없지만, 프로그래밍 방식으로 AWS 서비스를 사용할 때는 필수적입니다. 콘솔은 애초에 로그인을 하는 과정이 있기 때문입니다. (프로그래밍 방식은 Boto3처럼 코드를 통해 서비스를 사용하는 것을 말합니다.)

다만 액세스 키는 한번 설정하면 기본적으로 변경이 거의 없기 때문에, 보안적으로 좋지 않은 것을 유의해야 합니다.

이 키들을 발급받고 Boto3에서 사용해보겠습니다.

 

 

액세스 키 발급

우선 계정 보안상 root 계정에서는 액세스 키를 만들지 않는 게 좋다고 합니다. 나아가 보안을 위해서는 가급적 root 계정에서 직접 서비스를 사용하지 않는 게 좋은 것 같습니다.

따라서 AWS IAM에서 사용자를 만든 후 필요한 권한을 주어 그 사용자로 작업하는 게 좋습니다.

 

IAM에서 서비스에서 접근할 사용자를 선택하고 '보안 자격 증명' 탭에 들어가면 액세스 키 박스가 있습니다. '액세스 키 만들기' 버튼을 통해 액세스 키를 만들 수 있습니다.

 

AWS에서는 보안상 액세스 키를 사용하지 않는 걸 권장하기 때문에 자격 증명을 위한 다른 예시를 제시합니다. 다만 무시하고 진행할 수 있습니다. 별다른 설정이 없기 때문에 액세스 키가 바로 만들어집니다.

해당 창을 나가기 전에 액세스 키와 비밀 액세스 키를 저장해 놓아야 합니다.

 

 

액세스 키 사용

Boto3의 자격 증명 문서입니다.

Boto3에서 client()session()으로 AWS 서비스 접근 객체를 생성할 때 자격 증명을 인자로 적을 수 있습니다. 다만 이 방식은 기본적으로 하드 코딩을 하는 것이기 때문에 보안적으로 상당히 좋지 않습니다.

저는 하드 코딩한 파일을 실수로 Github에 올렸더니, AWS에서 연락이 와 이를 삭제하고 확인 메일을 보내야 했던 적이 있습니다. 덕분에 어뷰징 당하는 일은 없었습니다.

 

따라서 코드가 아닌 외부 파일에 저장하고 코드가 이에 접근할 수 있도록 만드는 게 좋습니다. 공유 자격 증명 파일이나 설정 파일을 만드는 게 일반적인 듯합니다.

공유 자격 증명 파일은

~/.aws/credentials

디렉토리로 만들어야 합니다. 루트 디렉토리에 '.aws' 디렉토리를 만들고 'credentials'라는 파일을 만들어야 합니다.

 

파일의 형식은 다음과 같습니다.

[프로필명]
aws_access_key_id=액세스 키
aws_secret_access_key=비밀 액세스 키

- 프로필명: 해당 자격 증명의 프로필 이름입니다. Boto3에서 session 객체를 생성할 때 사용합니다.  자격 증명을 하나만 두거나, 기본적으로 사용할 자격 증명이라면 프로필명을 'default'로 해두면 됩니다. 그러면 session을 생성할 때 따로 프로필명을 기재하지 않으면 'default' 자격 증명을 사용합니다.

 

설정 파일은

~/.aws/config

디렉토리로 만듭니다. 파일의 형식은 공유 자격 증명 파일과 마찬가지입니다. 다만 설정 파일에서는 자격 증명뿐만 아니라 리전 등 다른 값도 넣을 수 있습니다. Boto3의 설정 파일 문서입니다.

참고로 Serverless 프레임워크는 설정 파일에서 액세스 키를 얻지 못합니다.

 

이렇게 파일을 만들어서 저장해 놓으면, Boto3에서 서비스 접근 객체를 생성할 때 자격 증명 관련 인자를 입력하지 않으면 알아서 해당 파일에 접근하여 값을 얻어냅니다.

 

 

액세스 키 접근 우선 순위

Boto3에서 쓸 액세스 키를 지정하는 방법이 여러가지 있기 때문에 어느 것을 먼저 확인하는지 우선 순위가 있습니다. (1번이 제일 우선입니다.)

 

  1. client()의 인자
  2. 세션 객체를 생성할 때 인자
  3. OS 환경 변수
  4. 공유 자격 증명 파일 (~/.aws/credentials)
  5. 설정 파일 (~/.aws/config)
  6. Assume Role provider (임시 증명 용도)
  7. Boto 설정 파일
  8. 코드가 EC2에서 실행되는 경우 EC2의 IAM 확인

(세션 객체를 생성할 때 프로필명을 적는 경우는 인자로 적는 것이기 때문에 2번에 해당할 것으로 추정합니다.)

예를 들어, 공유 자격 증명 파일로 자격 증명을 할 것이라면 'AWS_ACCESS_KEY_ID' 같은 환경 변수나 client() 등에 인자를 입력해서는 안 됩니다.