본문 바로가기

개발이야기/AWS

EMR 노트북에서 secret manager의 비밀키 조회하기

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 클러스터를 생성할 때 기본적으로 설정됩니다.(고급 설정으로 변경할 수도 있습니다.)

기본설정에는 EC2 인스턴스 프로파일이 EMR_EC2_DefaultRole로 설정됨

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

 

AWS EMR사용시 사용자 지정 파이썬 라이브러리 설치 및 pyspark 사용

AWS EMR은 하둡관련 패키지를 AWS를 통해 설치하고 프로비져닝하는 도구입니다. 이 도구를 활용하면 매우 빠르게 hadoop, spark 등의 빅데이터 클러스터를 구축할 수 있는데요. 오늘은 이렇게 만든 EMR

blog.voidmainvoid.net

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으로 설정합니다. 위와 같이 코드를 짜고 실행하면 아래와 같은 결과가 나옵니다.

python 실행 에러

위 에러를 잘 읽어보면 EMR_EC2_DefaultRole로 지정된 User가 secretmanager에 GetSecretValue를 호출했지만 권한이 없어서 AccessDeniedException이 발생한 것을 알 수 있습니다. EMR_EC2_DefaultRole은 아까전에 EMR클러스터를 생성할때 사용한 EC2 인스턴스프로파일인데요. 이 AMI에 권한을 추가해야 secretmanager에 접근가능하다는 것을 알려주는 것입니다. EMR_EC2_DefaultRole에 secretmanager접근이 가능하도록 권한을 추가하겠습니다.

AMI에 secretmanager권한 추가

EMR_EC2_DefaultRole AMI 확인

위 정책을 보면 현재 AmazonElasticMapReduceforEC2Role 정책만 추가된 것을 알 수 있습니다. 여기에 추가 정책을 넣어 secret manager에 접근가능하도록 변경하겠습니다. 중간에 '정책 연결'을 클릭합니다.

SecretManagerReadWrite 권한 추가
정책이 추가됨

정책 연결을 통해 SecretManagerReadWrite에 대한 권한이 추가된 것을 확인할 수 있습니다. EMR_EC2_DefaultRole로 생성된 EMR 클러스터의 인스턴스에서 secret manager를 호출할 수 있습니다. 다시 EMR notebook에서 코드를 실행합니다.

secret manager에서 설정한 암호 키/값 가져오기 완료

정상적으로 secret manager에서 암호 키/값을 가져오는 것을 확인할 수 있습니다!

반응형