AWS

[boto3] 설치 및 자격 증명 구성

비번변경 2022. 1. 15. 19:43

boto3

Python용 AWS SDK

EC2, S3와 같은 AWS 서비스 개체를 생성 및 관리할 수 있다.

SDK
소프트웨어 개발 키트 (Software Development Kit)
소프트웨어 기술자가 사용하여 특정한 소프트웨어 꾸러미, 소프트웨어 프레임워크, 하드웨어 플랫폼, 컴퓨터 시스템, 게임기, 운영 체제 등을 위한 응용 프로그램 등을 만들 수 있게 해주는 개발 도구의 집합

 

이 글에서는 리눅스 환경에서 boto3을 설치하고 자격 증명을 구성하는 방법에 대해 정리한다.

 

설치

요구 조건 : Python 3.6 이상

Python 3.5 이하는 지원이 중단되었다.

Python 3.6

pip를 통해 설치할 수 있으며, ==, >=, <= 연산자를 통해 설치 버전을 제어할 수 있다. 개발 버전은 https://github.com/boto/boto3에서 찾을 수 있다.

pip3 install boto3

# 버전 제한
pip3 install boto3==1.0.0
pip3 install boto3>=1.15.0
pip3 install boto3<=1.15.3

boto3 버전 확인

 

권한 설정 (자격 증명 구성)

AWS 리소스에 접근하기 위해서는 AWS IAM으로부터 접근 권한을 취득해야 한다. boto3 또한 인증 과정이 필요하며, aws_access_key_id, aws_secret_access_key 같은 자격 증명 데이터(credentials)와 region과 같은 비자격 증명 데이터(non- credentials)를 이용하여 인증 과정을 진행한다.

 

boto3가 AWS 자격증명을 확인하는 순서

boto3는 AWS 접근 권한을 취득하기 위해 아래와 같은 순서로 설정을 확인한다.

  1. boto3.client, boto3.resource boto3.session 함수에 매개변수로 전달된 값
  2. 환경 변수
  3. 자격 증명 파일 (~/.aws/credentials)
  4. AWS 구성 파일 (~/.aws/config)
  5. AssumeRole (~/.aws/config)
  6. Boto2 구성 파일 (/etc/boto.cfg 또는 ~/.boto)
  7. IAM 역할이 구성된 Amazon EC2 인스턴스의 인스턴스 메타 데이터 서비스

이 글에서는 굵게 표시한 부분에 대해서만 테스트하려고 한다.

 

테스트

요구 조건 : 적절한 권한을 가진 IAM 액세스 키와 액세스 비밀 키

IAM 액세스 키 생성 방법은 생략한다.

 

테스트할 코드는 아래의 AWS CLI와 동일한 동작을 수행하는 코드로, ec2의 정보를 조회하여 publicDnsName을 출력하는 코드이다.

참고로 CLI 응답은 기본적으로 JSON 형식으로 출력된다.

aws ec2 describe-instances --query Reservations[*].Instances[*].PublicDnsName --output text

aws ec2 describe-instances --query Reservations[*].Instances[*].PublicDnsName --output text

 

테스트 코드 내용

import boto3

# aws ec2 describe-instances --query Reservations[*].Instances[*].PublicDnsName --output text
def get_Ec2_publicDnsName(response):
    for reservations in response["Reservations"]:
        for instances in reservations["Instances"]:
            return instances["PublicDnsName"]

# 자격 증명 획득 - 생략

# 획득한 자격 증명 사용
response = client.describe_instances()
print(get_Ec2_publicDnsName(response))

 

실행 결과

코드 테스트 결과

 

1. boto3.client, boto3.resource boto3.session 함수에 매개변수로 전달

가장 간단한 방법으로, 자격 증명 획득 코드는 아래와 같다. 자격 증명 사용 코드는 생략한다.

import boto3

AWS_ACCESS_KEY_ID = "KEY"
AWS_SECRET_ACCESS_KEY = "SECRET_KEY"
REGION_NAME = "REGION"

''' client(service_name, region_name=None, 
           api_version=None, use_ssl=True, 
           verify=None, endpoint_url=None, 
           aws_access_key_id=None, aws_secret_access_key=None, 
           aws_session_token=None, config=None) '''
client = boto3.client('ec2', region_name=REGION_NAME, aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY)


''' resource(service_name, region_name=None, 
             api_version=None, use_ssl=True, 
             verify=None, endpoint_url=None, 
             aws_access_key_id=None, aws_secret_access_key=None, 
             aws_session_token=None, config=None) '''
resource = boto3.resource('ec2', region_name=REGION_NAME, aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY)


''' Session(aws_access_key_id=None, aws_secret_access_key=None, 
            aws_session_token=None, region_name=None, 
            botocore_session=None, profile_name=None) '''
session = boto3.Session(aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
# 이후 client 함수 호출 필요
client = boto3.client('ec2', region_name=REGION_NAME)

실행 결과

boto3.client&#44; boto3.resource boto3.session 함수에 매개변수로 전달

client, resource 함수에서 service_name은 생략이 불가능하다.

이 방법은 간단하지만 민감정보가 코드에 노출되기 때문에 보안 상 권장하지 않는다.

 

 

 

2. 환경 변수

boto3는 아래 목록의 환경변수가 존재하는지 확인하고, 존재하면 사용한다.

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_SESSION_TOKEN : 세션 키, 임시 자격 증명 사용 시 필요
  • AWS_DEFAULT_REGION

 

환경 변수 설정 명령어

export AWS_ACCESS_KEY_ID="KEY" 
export AWS_SECRET_ACCESS_KEY="SECRET_KEY"
export AWS_DEFAULT_REGION="REGION"

 

테스트

1번의 코드에서 매개변수로 전달하던 aws_access_key_id, aws_secret_access_key 만 삭제하여 테스트해보았다.

import boto3

# aws ec2 describe-instances --query Reservations[*].Instances[*].PublicDnsName --output text
def get_Ec2_publicDnsName(response):
    for reservations in response["Reservations"]:
        for instances in reservations["Instances"]:
            return instances["PublicDnsName"]
            
# client
client = boto3.client('ec2')
response = client.describe_instances()
print("client: ", get_Ec2_publicDnsName(response))

# resource
resource = boto3.resource('ec2')
response = client.describe_instances()
print("resource: ", get_Ec2_publicDnsName(response))

# session
session = boto3.Session()
client = boto3.client('ec2')
response = client.describe_instances()
print("session: ", get_Ec2_publicDnsName(response))

환경 변수

환경 변수를 사용하면 코드에 민감정보를 노출하지 않을 수 있다.

 

 

 

3. 자격 증명 파일 (~/.aws/credentials)

참고 : 2021.08.26 - [AWS cli] 사용할 계정(profile) 등록/지정

 

설정 명령어 

aws configure
aws configure --profile <PROFILE_NAME>

 

계정에 자격 증명을 설정한 후, 2번의 코드를 그대로 이용해 테스트해보았다. 2번에서 설정했던 환경 변수들은 모두 해제해두었다.

 

실행 결과

aws configure

 

다른 프로파일 사용 시

Session 초기화 시 profile_name 값을 전달해준다.

import boto3

# session
session = boto3.Session(profile_name="PROFILE_NAME")
client = session.client('ec2')

client나 resource 함수는 지원하지 않는 것 같다.

 

 


참고 문서

https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

https://tech.cloud.nongshim.co.kr/2021/03/12/boto3%EA%B0%80-aws%EC%9D%98-%EC%9E%90%EA%B2%A9%EC%A6%9D%EB%AA%85credentials%EC%9D%84-%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94-%EC%88%9C%EC%84%9C-from-python/

 

[매뉴얼] Boto3가 AWS의 자격증명(Credentials)을 확인하는 순서 .from Python

  I.   개요 이번 포스팅은 'Boto3가 AWS의 자격증명(Credentials)을 확인하는 순서' 인 Credentials — Boto3 Docs 1.17.21 documentation > Configuring credentials

tech.cloud.nongshim.co.kr