AWS EC2 환경변수 설정 문제 해결(CodeDeploy 환경변수)

금은체리·2024년 5월 14일
0

AWS EC2 인스턴스에 배포된 Spring Boot 애플리케이션에서 AWS Systems Manager Parameter Store를 사용하여 환경변수를 관리하던 중 환경변수를 불러오지 못하는 상황이 생겼습니다.


문제 상황

AWS EC2 인스턴스에서 Spring Boot를 실행시킬 때, AWS Systems Manager Parameter Store에서 환경변수 값을 불러오지 못하는 문제가 발생했습니다. 이로 인해 데이터베이스 연결 정보와 JWT 시크릿키 등 시크릿값들을 사용할 수 없었습니다.


가능한 원인 분석

  1. AWS CLI 미설치: EC2 인스턴스에 AWS CLI가 설치되지 않아 Parameter Store에 접근할 수 없었습니다.
  2. IAM 역할 및 정책 설정: EC2 인스턴스에 할당된 IAM 역할에 필요한 권한이 부여되지 않았을 가능성이 있습니다.
  3. 환경변수 추출 스크립트 오류: 환경변수 값을 추출하는 스크립트에 오류가 있거나 실행되지 않았을 가능성이 있습니다.

해결 과정

  1. AWS CLI 설치: EC2 인스턴스에 AWS CLI를 설치하여 AWS 서비스에 접근할 수 있도록 하였습니다.
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
  1. IAM 역할 및 정책 검토: EC2 인스턴스에 할당된 IAM 역할에 Parameter Store 접근을 위한 권한이 포함되어 있는지 확인하고 필요한 정책을 추가하였습니다.

  2. 환경변수 추출 스크립트 수정: 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
  1. 테스트 및 확인: 수정된 설정과 스크립트를 테스트하여 모든 환경변수가 올바르게 불러와지고 애플리케이션이 정상적으로 구동되는 것을 확인하였습니다.

해결책

AWS CLI를 설치하고 IAM 정책을 조정한 후, 환경변수 값을 추출하는 스크립트를 수정하여 문제를 해결하였습니다. 이를 통해 EC2 인스턴스에서 Spring Boot 을 성공적으로 실행시킬 수 있었습니다.


결론

이번 트러블슈팅을 통해 AWS 클라우드 서비스와 Spring Boot의 통합 관리에 대한 이해가 되었습니다.
특히, CodeDeploy는 .bashrc에 있는 환경변수를 읽어들이지 못한다는 사실을 새롭게 알게 되었습니다.
성능과 보안 요구 사항을 충족하기 위해 Docker를 사용하여 애플리케이션을 컨테이너화하고, 실행 시점에 환경 변수를 주입하는 방식을 고려했으나,
지속적인 서비스의 스케일링과 자동화된 환경 관리를 위한 복잡한 오케스트레이션 필요성 때문에 AWS Systems Manager Parameter Store를 사용하기로 결정했습니다.

profile
전 체리 알러지가 있어요!

0개의 댓글