Dev./Cloud

[Cloud]배포 AWS: Secrets Manager

Ivan'show 2023. 8. 17.
728x90
반응형

NCP 에서는 지원하지 않는 기능!

AWS 에서는 시크릿 키를 관리할 수 있는 기능을 제공해준다.

사용자의 이름, 암호 주소, 데이터베이스 이름, 포트 등을 설정하게 끔 되어 있는데 이 부분에는 사용하는 DB 에 대한 정보를 넣어준다.

Region : ap-northeast-2 ← 아시아 / 서울

생성후 python3 로 바꿔서 샘플코드 복사 붙여넣기

common → aws.py

# 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/developer/language/python/>

import boto3
from botocore.exceptions import ClientError

def get_secret():

    secret_name = "like/lion/lecture"
    region_name = "us-east-1"

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

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
        # For a list of exceptions thrown, see
        # <https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html>
        raise e

    # Decrypts secret using the associated KMS key.
    secret = get_secret_value_response['SecretString']

    # Your code goes here.

boto3 설치

pip install boto3
python3 freeze | grep boto3 >> requirements.txt

이제 데이터베이스에 접근할 때 AWS 에서 인증키를 보유하고 있는 사람인지에 대한 검증이 들어간다.

settings.py

from common.aws import get_secret

AWS_SECRET_NAME= os.getenv("AWS_SECRET_NAME", "like/lion/lecture")

secret = get_secret(AWS_SECRET_NAME)

...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': secret.get('dbname', 'postgres'),
        'USER': secret.get('username', 'postgres'),
        'PASSWORD': secret.get('password', 'postgres'),
        'HOST': secret.get('host', 'db'),
        'OPTIONS' : {
            'options': '-c search_path=likelion,public'  
        },
    }
}

...

aws.py

# 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/developer/language/python/>
import json

import boto3
from botocore.exceptions import ClientError

# secret_name 을 str 형태로 받아버리면 ?
def get_secret(secret_name:str) -> dict:

    # secret_name = "like/lion/lecture"
    region_name = "us-east-1"

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

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
        # For a list of exceptions thrown, see
        # <https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html>
        raise e

    # Decrypts secret using the associated KMS key.
    secret = get_secret_value_response['SecretString']

    # Your code goes here.
    return json.loads(secret)

 

서버에서 사용해보기

서버에서도 AWS CLI 를 설치하고 access Key 를 등록해야한다.

curl "<https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip>" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version

#
$ aws --version
aws-cli/2.13.7 Python/3.11.4 Linux/5.4.0-99-generic exe/x86_64.ubuntu.20 prompt/off

AWS 인증

aws configure

#
AWS Access Key ID 
AWS Secret Access Key 
Default region name 
Default output format 

새 암호키 생성

settings.py 에서 똑같이 적용 시키되 주소를 /prod 로 !

docker-compose -f ../docker-compose.prod.yml up --build -d
docker-compose logs
lion-app-dc | Connecting to database...
lion-app-dc | PostgreSQL is available
lion-app-dc | secret:  {"username":"lion","password":"postgres123!@#","engine":"postgres","host":"175.45.205.103","port":"5432","dbname":"lionforum"}
lion-app-dc | type of secret:  <class 'str'>
lion-app-dc | secret:  {'username': 'lion', 'password': 'postgres123!@#', 'engine': 'postgres', 'host': '175.45.205.103', 'port': '5432', 'dbname': 'lionforum'}
lion-app-dc | type of secret:  <class 'dict'>

로그를 보면 제대로 주고 받고 있는지 확인이 기능

 

 

 

 

 

 

 

 

728x90
반응형

댓글