나의 이야기

AWS

AWS 민감한 정보 호출 Lambda함수, Secrets Manager 사용 (+ 환경변수 )

필자는 SpringBoot를 이용하여 application.properties에 들어가야할 민감한 정보인 API키, 데이터베이스 자격 증명, 등 해당 데이터를 AWS Secrets manager에 저장하여 lambda를 이용하여 데이터를 호출 하였다.

 

1. Secrets Manager에서 시크릿 생성

 

2. 다른 유형의 보안 암호를 클릭하여 키/값 구조인 JSON형태로 원하는 데이터를 저장

- 이후 임의로 보안 암호 이름을 입력해주고 다음을 누른다

- 교체는 건드리지 않고 다음을 누르고 검토부분에서 샘플코드를 복사한 후 저장 한다(이후에 해도 무관)

- 이 코드는 이후 람다 함수 코드에 사용할 예정이다.

- ARN을 복사해놓는다

 

3. AWS Lambda에서 함수를 생성한다

- 임의로 함수 이름을 설정하고 런타임에 자신이 사용할 언어를 선택하여 생성 버튼을 누른다

- 런타임에서 파이썬을 선택하면 aws 코드 소스에서 테스트가 가능하다

 

4. Secret Manager의 데이터를 람다 함수를 통해 호출

- Secrets Manager데이터를 불러오려면 읽기위한 권한을 설정해줘야 한다

- lambda함수의 구성 => 권한을 선택 후 역할 이름을 클릭하여 IAM으로 들어간다

- 권한추가를 눌러 인라인 정책 생성을 클릭한다

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "arn:aws:secretsmanager:region:account-id:secret:prod/dbCredentials"
        }
    ]
}

- JSON을 클릭후 위의 코드를 복사하여 아래와 같이 붙혀넣기 후 아까 secret manager에서 복사한 ARN을 Resource부분에 넣어준다

- 임의로 정책이름을 정하고 정책 생성을 눌러준다

 

5. lambda함수로 secret manager 데이터 호출하기

 

- lambda_function.py에 있던 코드는 지우고 아까 람다 함수에서 사용한다고 했던 secret manager의 코드를 붙혀넣는다

- 필자는 아래의 코드와 같이 로그 및 오류 처리를 한 코드로 커스텀 하여 사용하였다( 이 코드를 복사 붙혀넣기해도 무관)

import boto3
import json
import logging
from botocore.exceptions import ClientError

# 로깅 설정
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def get_secret(event, context):
    secret_name = "AWS_SpringBoot_key"
    region_name = "ap-northeast-2"

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

    try:
        # Secrets Manager에서 시크릿 가져오기
        logger.info("Retrieving secret from Secrets Manager")
        get_secret_value_response = client.get_secret_value(SecretId=secret_name)
        secret = get_secret_value_response['SecretString']

        # 시크릿 값을 JSON 형식으로 반환
        logger.info("Secret retrieved successfully")
        return {
            'statusCode': 200,
            'body': json.loads(secret)
        }
    except Exception as e:
        # 오류 처리
        logger.error(f"Error retrieving secret: {e}")
        return {
            'statusCode': 500,
            'body': str(e)
        }

- 이후  Test의 드롭박스를 클릭하여 configure 이벤트를 클릭하고 아래와 같이 임의로 이벤트 이름을 입력해주고 저장한다

- 마지막으로 런타임 설정에서 편집을 눌러 핸들러의 함수 이름을 바꿔준다

- 핸들러는 {파일명.함수이름} 으로 수정하여야지 코드가 제대로 실행이 된다

- deploy를 실행 하고 test를 할시에 아까 넣었던 secret manager의 값을 받아올 수 있게 된다

 

 

 

※ 환경 변수로 직접 데이터 설정하기

필자는 accessKey와 secretKey를 EC2 콘솔에 연결하여 환경변수로 직접 지정해주었다.

 

- Linux/MacOS

export 환경변수 키값=환경변수 벨류값
export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY

 

- window

setx AWS_ACCESS_KEY_ID "YOUR_ACCESS_KEY"
setx AWS_SECRET_ACCESS_KEY "YOUR_SECRET_KEY"