boto3
Python용 AWS SDK
EC2, S3와 같은 AWS 서비스 개체를 생성 및 관리할 수 있다.
SDK
소프트웨어 개발 키트 (Software Development Kit)
소프트웨어 기술자가 사용하여 특정한 소프트웨어 꾸러미, 소프트웨어 프레임워크, 하드웨어 플랫폼, 컴퓨터 시스템, 게임기, 운영 체제 등을 위한 응용 프로그램 등을 만들 수 있게 해주는 개발 도구의 집합
이 글에서는 리눅스 환경에서 boto3을 설치하고 자격 증명을 구성하는 방법에 대해 정리한다.
설치
요구 조건 : Python 3.6 이상
Python 3.5 이하는 지원이 중단되었다.
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
권한 설정 (자격 증명 구성)
AWS 리소스에 접근하기 위해서는 AWS IAM으로부터 접근 권한을 취득해야 한다. boto3 또한 인증 과정이 필요하며, aws_access_key_id, aws_secret_access_key과 같은 자격 증명 데이터(credentials)와 region과 같은 비자격 증명 데이터(non- credentials)를 이용하여 인증 과정을 진행한다.
boto3가 AWS 자격증명을 확인하는 순서
boto3는 AWS 접근 권한을 취득하기 위해 아래와 같은 순서로 설정을 확인한다.
- boto3.client, boto3.resource boto3.session 함수에 매개변수로 전달된 값
- 환경 변수
- 자격 증명 파일 (~/.aws/credentials)
- AWS 구성 파일 (~/.aws/config)
- AssumeRole (~/.aws/config)
- Boto2 구성 파일 (/etc/boto.cfg 또는 ~/.boto)
- IAM 역할이 구성된 Amazon EC2 인스턴스의 인스턴스 메타 데이터 서비스
이 글에서는 굵게 표시한 부분에 대해서만 테스트하려고 한다.
테스트
요구 조건 : 적절한 권한을 가진 IAM 액세스 키와 액세스 비밀 키
IAM 액세스 키 생성 방법은 생략한다.
테스트할 코드는 아래의 AWS CLI와 동일한 동작을 수행하는 코드로, ec2의 정보를 조회하여 publicDnsName을 출력하는 코드이다.
참고로 CLI 응답은 기본적으로 JSON 형식으로 출력된다.
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)
실행 결과
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번에서 설정했던 환경 변수들은 모두 해제해두었다.
실행 결과
다른 프로파일 사용 시
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