without haste but without rest

AWS Secret Manager Tutorial 본문

Cloud

AWS Secret Manager Tutorial

JinungKim 2022. 3. 9. 21:34

Goal

aws 시크릿 매니저 사용 방법을 빠르게 파악한다.

aws 키 주입과 IAM에 대한 사전 지식이 존재한다고 가정한다.

 

자습서: 보안 암호 생성 및 검색 - AWS Secrets Manager

자습서: 보안 암호 생성 및 검색 이 자습서에서는 보안 암호를 AWS Secrets Manager에서 생성하여 저장합니다. 콘솔 또는 AWS CLI를 사용할 수 있습니다. 보안 암호에는 키-값 페어로 저장된 단일 암호가

docs.aws.amazon.com


1. 새 보안 암호 생성

https://console.aws.amazon.com/secretsmanager/

시크릿 매니저 콘솔로 접근해서 새 보안 암호를 생성한다.

컨테이너 MySQL로 테스트할 목적이므로 기타 데이터베이스로 선택을 했다.

사용할 유저 네임, 패스워드, 데이터베이스, 주소 등을 입력한다.

2. 보안 암호 이름 및 설명

보안 암호를 식별하는 이름과 설명을 달아준다.

빠르게 파악하기 위해 기타 선택 사항은 모두 제거했다.

(키를 요청하는 유저의 권한은 PowerUser로 미리 설정 해두었다.)

3. 보안 암호 교체

자동 교체 구성도 보안을 위해 존재하지만 여기서는 생략한다.

4. 샘플 코드

생성 후 스크롤을 내리면 각 언어 별 샘플 코드를 제공 해준다.

나는 dev/App/MySQL로 이름을 설정하고 리전을 서울로 해두었는데, 이에 맞춰서 샘플 코드가 생성 되었다.

샘플 코드는 키 생성 후에도 해당 보안 암호 세부 정보에서 확인 할 수 있다.

5. AWS credential 설정

pip install awscli

터미널에서 pip를 이용해서 awscli 라이브러리를 설치한다.

 

aws configure

aws configure 명령어로 aws accces key, secret key를 설정한다. 

미리 설정이 되어 있다면 다시 주입할 필요는 없다.

 

6. 샘플 코드

# Use this code snippet in your app.
# If you need more information about configurations or implementing the sample code, visit the AWS docs:
# https://aws.amazon.com/developers/getting-started/python/

import boto3
import base64
from botocore.exceptions import ClientError


def get_secret():
    secret_name = "arn:aws:secretsmanager:ap-northeast-2:<Your-AWS-Account:secret:dev/App/MySQL"
    region_name = "ap-northeast-2"

    # Create a Secrets Manager client
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )

    # In this sample we only handle the specific exceptions for the 'GetSecretValue' API.
    # See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
    # We rethrow the exception by default.

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
        if e.response['Error']['Code'] == 'DecryptionFailureException':
            # Secrets Manager can't decrypt the protected secret text using the provided KMS key.
            # Deal with the exception here, and/or rethrow at your discretion.
            raise e
        elif e.response['Error']['Code'] == 'InternalServiceErrorException':
            # An error occurred on the server side.
            # Deal with the exception here, and/or rethrow at your discretion.
            raise e
        elif e.response['Error']['Code'] == 'InvalidParameterException':
            # You provided an invalid value for a parameter.
            # Deal with the exception here, and/or rethrow at your discretion.
            raise e
        elif e.response['Error']['Code'] == 'InvalidRequestException':
            # You provided a parameter value that is not valid for the current state of the resource.
            # Deal with the exception here, and/or rethrow at your discretion.
            raise e
        elif e.response['Error']['Code'] == 'ResourceNotFoundException':
            # We can't find the resource that you asked for.
            # Deal with the exception here, and/or rethrow at your discretion.
            raise e
    else:
        # Decrypts secret using the associated KMS key.
        # Depending on whether the secret is a string or binary, one of these fields will be populated.
        if 'SecretString' in get_secret_value_response:
            return get_secret_value_response['SecretString']
        else:
            return base64.b64decode(get_secret_value_response['SecretBinary'])

    # Your code goes here.


key = get_secret()
print(key)

샘플 코드를 사용하면 json 형태로 보안 암호를 반환한다.

복잡한 코드가 아니므로 슥 훑으면 금방 파악할 수 있다.

 

코드는 boto3 라이브러리를 사용한다.

해당 라이브러리로 클라이언트 세션을 연결하고, 시크릿 매니저 네임을 엔드포인트로 보안 암호를 요청한다.

이때 aws credential 정보를 이용한다. 따라서 사전에 aws configure 설정이 완료되어 있어야 한다.

 

 

위 코드는 기본 샘플 코드에서 esle 구문에서

return secret

return decoded_binary_secret 

두 줄만 추가했다.

 

결과는 다음과 같다.


 

'Cloud' 카테고리의 다른 글

aws kinesis firehose - 데이터가 한 줄로 저장되는 문제  (0) 2022.04.05
Kinesis, MSK, Kafka  (0) 2022.02.25
HDFS vs S3  (0) 2022.02.13
LocalStack 컨테이너 볼륨 이슈  (0) 2022.02.04
LocalStack S3를 python boto3로 접근하기  (0) 2022.01.04
Comments