EMR 노트북에서 pyspark를 실행하는데 암/복호화를 위해 secret manager에 암호화 키를 저장하고 조회해야하는 니즈가 있었습니다. 이를 해결하기 위해 secret manager를 사용하였고 어떤 방식으로 진행했는지 알아보겠습니다.
암호화 키를 코드에 직접 hard coding하는 방식은 보안에 매우 취약합니다. AWS를 사용하는 이상 AWS관련 컴포넌트를 활용하여 비밀 키/값을 관리하고 이를 EMR notebook에서 활용하는 방법을 알아보겠습니다.
관련 AWS 컴포넌트
- EMR
- EMR notebook
- AMI
- secret manager
EMR 생성시 EC2 인스턴스 프로파일 설정
EMR notebook은 서버리스 주피터/주피터랩입니다. EMR notebook에서 pyspark, python 등의 코드를 실행할 수 있는데요. 실행하는 주체는 EMR클러스터입니다. 즉, EMR클러스터의 인스턴스의 역할을 따라갑니다.
EMR클러스터를 띄우면 인스턴스 역할을 부여하게 되는데요. 이는 EMR 클러스터를 생성할 때 기본적으로 설정됩니다.(고급 설정으로 변경할 수도 있습니다.)
EMR이 EMR_EC2_DefaultRole로 설정된 것을 확인하였습니다. 이제 secret manager에 사용자 정의 비밀 키/값 을 등록하겠습니다.
Secret manager 비밀 키/값 등록
secret manager를 사용하여 사용자 정의 키/값을 등록할 수 있습니다. 보안 암호를 일정 주기마다 변경할수도있고 삭제할수도 있습니다.
사용자 정의 비밀 키/값을 저장하기 위해 '다른 유형의 보안 암호'를 선택하였고 암호 키/값에 사용자 정의 key/value를 입력하였습니다. 이 값은 계속해서 추가 할 수 있습니다. 그리고 암호화 키는 사용자정의 마스터키를 사용해도 되지만 기본 KMS(DefaultEncryptionKey)를 사용하도록 하겠습니다.
신규 보안 암호가 생성완료되었습니다. 이제 EMR notebook에서 예제코드로 실행해보겠습니다.
EMR notebook에서 테스트
EMR notebook에서 secret manager의 비밀 키/값을 가져오려면 boto3라이브러리가 필요합니다. boto3라이브러리를 EMR클러스터에 설치하는 방법은 아래 링크에서 확인할 수 있습니다. https://blog.voidmainvoid.net/364
EMR notebook을 실행해서 secret key를 가져오는 예제코드를 실행해 보겠습니다.
import boto3
import base64
from botocore.exceptions import ClientError
secret_name = "myProjectSecret"
region_name = "ap-northeast-2"
# Create a Secrets Manager client
session = boto3.session.Session()
client = session.client(
service_name='secretsmanager',
region_name=region_name
)
get_secret_value_response = client.get_secret_value(
SecretId=secret_name
)
# Decrypts secret using the associated KMS CMK.
# Depending on whether the secret is a string or binary, one of these fields will be populated.
if 'SecretString' in get_secret_value_response:
secret = get_secret_value_response['SecretString']
print(secret)
else:
decoded_binary_secret = base64.b64decode(get_secret_value_response['SecretBinary'])
print(decoded_binary_secret)
secret_name은 secret manager에서 생성한 보안 암호 이름을 넣고, region_name은 암호 키/값을 생성한 region으로 설정합니다. 위와 같이 코드를 짜고 실행하면 아래와 같은 결과가 나옵니다.
위 에러를 잘 읽어보면 EMR_EC2_DefaultRole로 지정된 User가 secretmanager에 GetSecretValue를 호출했지만 권한이 없어서 AccessDeniedException이 발생한 것을 알 수 있습니다. EMR_EC2_DefaultRole은 아까전에 EMR클러스터를 생성할때 사용한 EC2 인스턴스프로파일인데요. 이 AMI에 권한을 추가해야 secretmanager에 접근가능하다는 것을 알려주는 것입니다. EMR_EC2_DefaultRole에 secretmanager접근이 가능하도록 권한을 추가하겠습니다.
AMI에 secretmanager권한 추가
위 정책을 보면 현재 AmazonElasticMapReduceforEC2Role 정책만 추가된 것을 알 수 있습니다. 여기에 추가 정책을 넣어 secret manager에 접근가능하도록 변경하겠습니다. 중간에 '정책 연결'을 클릭합니다.
정책 연결을 통해 SecretManagerReadWrite에 대한 권한이 추가된 것을 확인할 수 있습니다. EMR_EC2_DefaultRole로 생성된 EMR 클러스터의 인스턴스에서 secret manager를 호출할 수 있습니다. 다시 EMR notebook에서 코드를 실행합니다.
정상적으로 secret manager에서 암호 키/값을 가져오는 것을 확인할 수 있습니다!
'개발이야기 > AWS' 카테고리의 다른 글
가용영역별 지원 EC2인스턴스 확인하는 방법 (0) | 2020.11.10 |
---|---|
EC2 에 있는 파일 로컬로 다운로드 받기 (0) | 2020.10.27 |
openjdk의 cacert 확인 (0) | 2020.09.16 |
AWS EMR사용시 사용자 지정 파이썬 라이브러리 설치 및 pyspark 사용 (0) | 2020.07.29 |
AWS VPC지정을 위한 CIDR 형식 주소값 계산 방법 (0) | 2020.07.28 |
AWS EMR클러스터에서 사용할 수있는 주피터 생성하기(EMR 노트북) (1) | 2020.07.09 |