AWS EC2 인스턴스에 배포된 Spring Boot 애플리케이션에서 AWS Systems Manager Parameter Store를 사용하여 환경변수를 관리하던 중 환경변수를 불러오지 못하는 상황이 생겼습니다.
AWS EC2 인스턴스에서 Spring Boot를 실행시킬 때, AWS Systems Manager Parameter Store에서 환경변수 값을 불러오지 못하는 문제가 발생했습니다. 이로 인해 데이터베이스 연결 정보와 JWT 시크릿키 등 시크릿값들을 사용할 수 없었습니다.
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
IAM 역할 및 정책 검토: EC2 인스턴스에 할당된 IAM 역할에 Parameter Store 접근을 위한 권한이 포함되어 있는지 확인하고 필요한 정책을 추가하였습니다.
환경변수 추출 스크립트 수정: start.sh 스크립트에서 환경변수 값을 제대로 불러오지 못하는 부분을 수정하였습니다. Parameter Store에서 값을 제대로 불러올 수 있도록 쿼리 및 출력 형식을 조정하였습니다.
#!/bin/bash
PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/kims-spaghetti.jar"
APP_LOG="$PROJECT_ROOT/application.log"
ERROR_LOG="$PROJECT_ROOT/error.log"
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"
# AWS CLI를 사용하여 AWS Systems Manager Parameter Store에서 파라미터 값을 불러옵니다
export PROD_DB_URL=$(aws ssm get-parameter --name "/prod/spaghetti-app/db/url" --with-decryption --query "Parameter.Value" --output text)
export PROD_DB_USER=$(aws ssm get-parameter --name "/prod/spaghetti-app/db/user" --with-decryption --query "Parameter.Value" --output text)
export PROD_DB_PASSWORD=$(aws ssm get-parameter --name "/prod/spaghetti-app/db/password" --with-decryption --query "Parameter.Value" --output text)
export JWT_SECRET_KEY=$(aws ssm get-parameter --name "/prod/spaghetti-app/jwt/secret" --with-decryption --query "Parameter.Value" --output text)
TIME_NOW=$(date +%c)
# build 파일 복사
echo "$TIME_NOW > $JAR_FILE 파일 복사" >> $DEPLOY_LOG
cp $PROJECT_ROOT/build/libs/*.jar $JAR_FILE
# jar 파일 실행
echo "$TIME_NOW > $JAR_FILE 파일 실행" >> $DEPLOY_LOG
nohup java -jar $JAR_FILE > $APP_LOG 2> $ERROR_LOG &
# 현재 실행중인 프로세스 ID 출력
CURRENT_PID=$(pgrep -f $JAR_FILE)
echo "$TIME_NOW > 실행된 프로세스 아이디 $CURRENT_PID 입니다." >> $DEPLOY_LOG
AWS CLI를 설치하고 IAM 정책을 조정한 후, 환경변수 값을 추출하는 스크립트를 수정하여 문제를 해결하였습니다. 이를 통해 EC2 인스턴스에서 Spring Boot 을 성공적으로 실행시킬 수 있었습니다.
이번 트러블슈팅을 통해 AWS 클라우드 서비스와 Spring Boot의 통합 관리에 대한 이해가 되었습니다.
특히, CodeDeploy는 .bashrc에 있는 환경변수를 읽어들이지 못한다는 사실을 새롭게 알게 되었습니다.
성능과 보안 요구 사항을 충족하기 위해 Docker를 사용하여 애플리케이션을 컨테이너화하고, 실행 시점에 환경 변수를 주입하는 방식을 고려했으나,
지속적인 서비스의 스케일링과 자동화된 환경 관리를 위한 복잡한 오케스트레이션 필요성 때문에 AWS Systems Manager Parameter Store를 사용하기로 결정했습니다.