AWS 인스턴스에 Python Flask 애플리케이션을 배포하면서 .env 파일을 어떻게 할까. .env 파일은 OPENAI_API_KEY와 같은 민감한 정보를 코드에 직접 노출하지 않고 환경 변수로 관리하기 위해 로컬 개발 환경에서 주로 사용됩니다.
AWS 인스턴스에 .env 파일을 올리는 방법과 더 나아가 프로덕션 환경에서 환경 변수를 안전하게 관리하는 모범 사례를 함께 설명합니다.
1. .env 파일 직접 업로드 (간단한 방법)
가장 간단한 방법은 .env 파일을 AWS 인스턴스에 직접 업로드하는 것입니다. scp (Secure Copy Protocol) 명령어를 사용하거나 SFTP 클라이언트를 이용할 수 있습니다.
a) scp 명령어 사용 (터미널/명령 프롬프트)
scp는 SSH를 통해 파일을 안전하게 복사하는 명령어입니다.
scp -i /path/to/your/key.pem /path/to/your/.env ubuntu@your-ec2-public-ip:/home/ubuntu/your-app-directory/
- -i /path/to/your/key.pem: AWS EC2 인스턴스에 접속할 때 사용하는 .pem 키 파일의 경로를 지정합니다.
- /path/to/your/.env: 로컬 컴퓨터에 있는 .env 파일의 전체 경로입니다.
- ubuntu@your-ec2-public-ip:
- ubuntu: EC2 인스턴스의 사용자 이름입니다. (Amazon Linux 2는 ec2-user, Ubuntu는 ubuntu가 일반적입니다.)
- your-ec2-public-ip: AWS EC2 인스턴스의 퍼블릭 IP 주소 또는 퍼블릭 DNS 이름입니다.
- /home/ubuntu/your-app-directory/: .env 파일을 업로드할 EC2 인스턴스 내의 경로입니다. Python 스크립트(chapter5-1_2_from_3-8_3_from_3-7.py)와 같은 디렉토리에 두는 것이 일반적입니다.
예시:
scp -i ~/Downloads/my-aws-key.pem ./my_flask_app/.env ubuntu@ec2-13-125-XXX-XXX.ap-northeast-2.compute.amazonaws.com:/home/ubuntu/my_flask_app/
b) SFTP 클라이언트 사용 (FileZilla, WinSCP 등)
FileZilla (모든 OS) 또는 WinSCP (Windows)와 같은 SFTP 클라이언트를 사용하여 파일을 GUI 방식으로 업로드할 수 있습니다.
- SFTP 클라이언트를 엽니다.
- 호스트: EC2 인스턴스의 퍼블릭 IP 주소 또는 DNS 이름
- 사용자 이름: ubuntu (또는 ec2-user)
- 인증 방식: 키 파일 (.pem 파일)
- 연결 후, 로컬 컴퓨터에서 .env 파일을 찾아 EC2 인스턴스 내의 원하는 디렉토리로 드래그 앤 드롭하여 업로드합니다.
.env 파일 업로드 후:
.env 파일이 Python 스크립트와 같은 디렉토리에 있다면, load_dotenv() 함수가 자동으로 해당 파일을 찾아 환경 변수를 로드할 것입니다.
2. AWS에서 환경 변수를 안전하게 관리하는 모범 사례 (권장)
프로덕션 환경에서는 .env 파일을 직접 서버에 올리는 것보다 AWS의 서비스를 활용하여 환경 변수를 더 안전하고 효율적으로 관리하는 것이 좋습니다. 특히 OPENAI_API_KEY와 같은 민감한 정보는 더욱 그렇습니다.
a) AWS Systems Manager Parameter Store 사용
AWS Systems Manager Parameter Store는 구성 데이터 및 비밀 정보를 안전하게 저장하고 관리할 수 있는 서비스입니다.
장점:
- 보안: 암호화되어 저장되며, IAM을 통해 접근 권한을 세밀하게 제어할 수 있습니다.
- 중앙 집중식 관리: 여러 인스턴스나 애플리케이션에서 동일한 파라미터를 사용할 수 있습니다.
- 버전 관리: 파라미터 변경 이력을 추적할 수 있습니다.
사용 방법:
- Parameter Store에 API 키 저장:
- AWS Management Console에 로그인하여 "Systems Manager" 검색 후 "Parameter Store"로 이동합니다.
- "파라미터 생성"을 클릭합니다.
- 이름: /my-app/openai-api-key (관례적으로 슬래시로 구분된 경로 사용)
- 계층: 표준
- 유형: SecureString (암호화된 문자열)
- 값: 실제 OPENAI_API_KEY 값을 입력합니다.
- "파라미터 생성"을 클릭합니다.
- EC2 인스턴스에 IAM 역할 부여: (상세방법은 아래 === 참조)
- EC2 인스턴스가 Parameter Store에 접근할 수 있도록 IAM 역할을 부여해야 합니다.
- IAM 콘솔에서 새 역할을 생성하거나 기존 역할에 AmazonSSMReadOnlyAccess 정책 또는 ssm:GetParameter 권한만 있는 사용자 지정 정책을 연결합니다.
- 이 역할을 EC2 인스턴스에 연결합니다.
- Python 코드 수정: dotenv 대신 boto3 라이브러리를 사용하여 Parameter Store에서 값을 가져오도록 코드를 수정합니다.
import os import boto3 # boto3 라이브러리 설치 필요: pip install boto3 # AWS Systems Manager 클라이언트 생성 ssm_client = boto3.client('ssm', region_name='ap-northeast-2') # 인스턴스가 위치한 리전으로 변경 def get_parameter(name, decrypt=True): try: response = ssm_client.get_parameter( Name=name, WithDecryption=decrypt ) return response['Parameter']['Value'] except Exception as e: print(f"Error getting parameter {name}: {e}") return None # OPENAI_API_KEY 가져오기 openai_api_key = get_parameter('/my-app/openai-api-key') if not openai_api_key: raise ValueError("OPENAI_API_KEY 환경 변수가 Parameter Store에 설정되지 않았습니다.") # 나머지 Flask 앱 코드 # ...
- region_name: EC2 인스턴스가 위치한 AWS 리전으로 설정해야 합니다. (예: ap-northeast-2 for Seoul)
- 이 방식은 .env 파일을 서버에 올릴 필요가 없어 보안상 훨씬 유리합니다.
b) AWS Secrets Manager (더 복잡한 비밀 관리에 적합)
Secrets Manager는 데이터베이스 자격 증명, API 키 등 애플리케이션 비밀을 저장하고 관리하는 전용 서비스입니다. Parameter Store보다 더 강력한 기능(자동 순환 등)을 제공하지만, 단일 API 키 관리에는 Parameter Store가 더 간단할 수 있습니다. 사용법은 Parameter Store와 유사하게 Secrets Manager에 비밀을 저장하고, boto3로 가져와 사용합니다.
결론:
- 빠른 테스트/개발 단계: scp 또는 SFTP 클라이언트를 사용하여 .env 파일을 직접 업로드하는 방법이 가장 간단합니다.
- 프로덕션 환경 또는 보안 강화: AWS Systems Manager Parameter Store를 사용하여 OPENAI_API_KEY를 관리하고, EC2 인스턴스에 적절한 IAM 역할을 부여하는 것을 강력히 권장합니다.
어떤 방법을 선택하시든, .env 파일이나 민감한 정보가 포함된 코드가 실수로 Git 저장소에 커밋되지 않도록 .gitignore 파일에 해당 파일/경로를 추가하는 것을 잊지 마세요.
============= EC2 인스턴스에 IAM 역할 부여 상세 방법 ================
선택하신 "EC2 인스턴스에 IAM 역할 부여" 섹션에 대한 상세한 방법을 정리합니다. AWS Systems Manager Parameter Store에 EC2 인스턴스가 접근할 수 있도록 IAM 역할을 부여하는 과정은 다음과 같습니다.
EC2 인스턴스에 IAM 역할 부여 상세 방법
이 과정은 크게 세 단계로 나뉩니다:
- IAM 역할 생성: EC2 인스턴스가 맡을 역할을 정의합니다.
- 권한 정책 연결: 생성된 역할에 Parameter Store에 접근할 수 있는 권한을 부여합니다.
- EC2 인스턴스에 역할 연결: 생성된 역할을 EC2 인스턴스에 적용합니다.
1단계: IAM 역할 생성
- AWS Management Console 로그인: AWS 계정으로 로그인합니다.
- IAM 서비스로 이동: 검색창에 "IAM"을 입력하거나, 서비스 목록에서 "IAM"을 찾아 클릭합니다.
- 역할(Roles) 생성 시작:
- 왼쪽 탐색 창에서 "역할(Roles)"을 클릭합니다.
- "역할 생성(Create role)" 버튼을 클릭합니다.
- 신뢰할 수 있는 엔티티 선택:
- "신뢰할 수 있는 엔티티 유형 선택"에서 "AWS 서비스(AWS service)"를 선택합니다.
- "사용 사례(Use case)" 드롭다운 메뉴에서 "EC2"를 선택합니다. (EC2 인스턴스가 이 역할을 맡을 것이기 때문입니다.)
- "다음(Next)"을 클릭합니다.
2단계: 권한 정책 연결
이제 생성할 역할에 Parameter Store에 접근할 수 있는 권한을 부여합니다.
- 권한 정책 검색 및 연결:
- "권한 추가(Add permissions)" 페이지에서 검색창에 AmazonSSMReadOnlyAccess를 입력합니다.
- 검색 결과에서 AmazonSSMReadOnlyAccess 정책을 찾아 선택합니다. 이 정책은 Systems Manager의 모든 읽기 권한을 부여합니다.
- (선택 사항: 최소 권한 원칙 적용) 만약 더 엄격한 보안을 원한다면, AmazonSSMReadOnlyAccess 대신 ssm:GetParameter 권한만 포함된 사용자 지정 정책을 생성하여 연결할 수 있습니다.
- "정책 생성(Create policy)"을 클릭하여 새 탭에서 정책을 생성합니다.
- JSON 탭에서 다음 내용을 붙여넣습니다:
- <your-region>: EC2 인스턴스와 Parameter Store가 있는 AWS 리전 (예: ap-northeast-2)
- <your-account-id>: 당신의 AWS 계정 ID
- <your-parameter-path>*: Parameter Store에 저장한 파라미터의 경로 (예: /my-app/openai-api-key). 뒤에 *를 붙여 해당 경로 아래의 모든 파라미터에 접근할 수 있도록 합니다.
-
JSON
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameter" ], "Resource": "arn:aws:ssm:<your-region>:<your-account-id>:parameter/<your-parameter-path>*" } ] }
- 정책 생성 후, 다시 역할 생성 페이지로 돌아와 생성한 사용자 지정 정책을 검색하여 선택합니다.
- "다음(Next)"을 클릭합니다.
- 역할 이름 및 검토:
- "역할 이름(Role name)"을 입력합니다. (예: EC2-SSM-ParameterStore-Access-Role)
- "설명(Description)"을 입력합니다.
- 모든 설정을 검토하고 "역할 생성(Create role)"을 클릭합니다.
3단계: EC2 인스턴스에 역할 연결
생성된 IAM 역할을 EC2 인스턴스에 연결하는 방법은 두 가지입니다.
a) 새 EC2 인스턴스 생성 시 연결 (권장)
EC2 인스턴스를 처음 생성할 때부터 IAM 역할을 연결하는 것이 가장 간단하고 일반적인 방법입니다.
- EC2 인스턴스 생성 마법사에서 "인스턴스 세부 정보 구성(Configure Instance Details)" 단계로 이동합니다.
- "IAM 역할(IAM role)" 드롭다운 메뉴에서 방금 생성한 역할(예: EC2-SSM-ParameterStore-Access-Role)을 선택합니다.
- 나머지 인스턴스 생성 과정을 완료합니다.
b) 기존 EC2 인스턴스에 연결
이미 실행 중인 EC2 인스턴스에도 IAM 역할을 연결할 수 있습니다.
- EC2 대시보드로 이동: AWS Management Console에서 "EC2" 서비스로 이동합니다.
- 인스턴스 선택: 왼쪽 탐색 창에서 "인스턴스(Instances)"를 클릭하고, 역할을 연결할 EC2 인스턴스를 선택합니다.
- 역할 연결:
- 상단 메뉴에서 "작업(Actions)"을 클릭합니다.
- "보안(Security)" > "IAM 역할 수정(Modify IAM role)"을 선택합니다.
- "IAM 역할(IAM role)" 드롭다운 메뉴에서 방금 생성한 역할(예: EC2-SSM-ParameterStore-Access-Role)을 선택합니다.
- "IAM 역할 업데이트(Update IAM role)"를 클릭합니다.
이 단계를 모두 완료하면, EC2 인스턴스는 부여된 IAM 역할을 통해 AWS Systems Manager Parameter Store에 안전하게 접근하여 OPENAI_API_KEY와 같은 비밀 정보를 가져올 수 있게 됩니다. Python 코드에서는 boto3 라이브러리를 사용하여 이 값을 읽어오도록 설정하면 됩니다.
'AI, 클라우드, 협업, 교육, 문서, 업무자동화' 카테고리의 다른 글
도커(docker)에 Qdrant 벡터 데이터베이스 실행하기(로컬 & 클라우드) (0) | 2025.07.12 |
---|---|
마인드맵으로 아이디어 정리와 실시간 협업 소프트웨어로 업무 성과 창출 (0) | 2024.12.13 |