๐Ÿ› ๏ธ GitHub Actions ๊ธฐ๋ฐ˜ CD ์‹ค์ „ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…: EC2, ECR, ElastiCache

euphonyยท2025๋…„ 3์›” 29์ผ

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

์šฐ์„  CI/CD ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • EC2: Ubuntu 22.04, Docker ์„ค์น˜
  • ECR: Spring Boot ์•ฑ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜์—ฌ push
  • RDS: MySQL DB ์‚ฌ์šฉ
  • ๋ฐฐํฌ ๋ฐฉ์‹: GitHub Actions๋ฅผ ํ†ตํ•œ CI/CD ์ž๋™ํ™” + appleboy/ssh-action

EC2 ๋ฐฐํฌ ์‹œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

command not found ์—๋Ÿฌ

docker: command not found ์—๋Ÿฌ๋Š” EC2 ์„œ๋ฒ„์— Docker๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋‹ค. GitHub Actions์—์„œ EC2๋กœ SSH ์ ‘์†์€ ์„ฑ๊ณตํ–ˆ์ง€๋งŒ, EC2 ์•ˆ์— docker ๋ช…๋ น์–ด ์ž์ฒด๊ฐ€ ์—†์–ด์„œ ์ „๋ถ€ ์‹คํŒจํ•œ ์ƒํ™ฉ์ด๋‹ค.

EC2์— SSH ์ ‘์† ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด ์‹คํ–‰ํ•ด Docker๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

sudo apt update
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker

์œ„์™€ ๋น„์Šทํ•˜๊ฒŒ aws: command not found ์—๋Ÿฌ๋„ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด ์—๋Ÿฌ๋Š” EC2 ์„œ๋ฒ„์— awscli๊ฐ€ ์•„์˜ˆ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋กœ ์—ญ์‹œ awscli๋ฅผ ํ•œ ๋ฒˆ ์„ค์น˜ํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

EC2์— SSH ์ ‘์† ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด ์‹คํ–‰ํ•œ๋‹ค. apt install awscli ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์„ค์น˜๋ฅผ ํ•˜๋ ค ํ–ˆ์ง€๋งŒ, Ubuntu 24.04๋ถ€ํ„ฐ๋Š” AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ณต์‹ zip์œผ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

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

๋งŒ์•ฝ unzip๋„ ์„ค์น˜๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋จผ์ € ์„ค์น˜ํ•ด์ค€๋‹ค.

sudo apt update
sudo apt install -y unzip

์„ค์น˜ ํ›„, ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

aws --version

๐Ÿค” GitHub Actions์—์„œ๋Š” ์™œ aws ๋ช…๋ น์–ด๊ฐ€ ๋˜๋Š”๋ฐ?
GitHub Actions์—์„œ aws ๋ช…๋ น์–ด๊ฐ€ ๋™์ž‘ํ•˜๋Š” ์ด์œ ๋Š”, GitHub์˜ ๋ฆฌ๋ˆ…์Šค ๋Ÿฌ๋„ˆ์— AWS CLI๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐ˜๋ฉด EC2๋Š” ์ง์ ‘ ์„ค์ •ํ•˜๋Š” ๊ฐ€์ƒ ์„œ๋ฒ„์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•„์š”ํ•œ ๋„๊ตฌ๋Š” ๋ชจ๋‘ ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

AWS IAM ๊ถŒํ•œ ์—ฐ๊ฒฐ ๋ฌธ์ œ

์ด์ œ aws ๋ช…๋ น์–ด ์‹คํ–‰์€ ์ž˜ ๋˜์ง€๋งŒ, Unable to locate credentials. You can configure credentials by running "aws configure". ์ด๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด ์—๋Ÿฌ๋Š” EC2์—์„œ AWS ์ธ์ฆ์ •๋ณด(Access Key, Secret Key)๊ฐ€ ์•„์˜ˆ ์—†๋Š” ์ƒํƒœ์—ฌ์„œ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค.

์ž์„ธํ•œ ์›์ธ์„ ์‚ดํŽด๋ณด๋‹ˆ...

  • EC2์—์„œ aws ecr get-login-password๋ฅผ ์“ฐ๋ ค๋ฉด AWS IAM ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • EC2 ์•ˆ์— ~/.aws/credentials ํŒŒ์ผ์ด ์—†์–ด์„œ ๋ฐœ์ƒํ–ˆ๋‹ค.
  • ์ฆ‰, EC2๊ฐ€ ECR์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์—†๋‹ค๋Š” ๋œป์ด๋‹ค.

๋”ฐ๋ผ์„œ EC2์— IAM Role์„ ์—ฐ๊ฒฐํ•ด ํ•ด๊ฒฐํ–ˆ๋‹ค. EC2 ์ธ์Šคํ„ด์Šค ์„ธ๋ถ€์ •๋ณด๋ฅผ ๋ณด๋‹ˆ, IAM Role์ด ๋น„์–ด์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ IAM ์—ญํ• ์„ EC2๋กœ ํ•ด์„œ ์ƒˆ๋กœ ๋งŒ๋“  ํ›„, AmazonEC2ContainerRegistryFullAccess ๊ถŒํ•œ์„ ํ—ˆ์šฉํ–ˆ๋‹ค. ECR์€ Private Registry๋ผ์„œ IAM ๊ถŒํ•œ์ด ์—†์œผ๋ฉด pull์— ์‹คํŒจํ•œ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด์•ผ EC2๊ฐ€ ECR์—์„œ pull/push ํฌํ•จ ํ’€ ๊ถŒํ•œ์„ ๊ฐ€์ง„๋‹ค.

docker pull ์‹คํŒจ

๋ฐฐํฌ ํ…Œ์ŠคํŠธ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ถ„์„ํ•ด๋ณด๋‹ˆ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

1. docker login ๊ด€๋ จ ์—๋Ÿฌ

Your authorization token has expired.

์ด ๋ฉ”์‹œ์ง€๋Š” ECR ์ธ์ฆ ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค. AWS ECR์€ ๋ณด์•ˆ์„ ์œ„ํ•ด ๋กœ๊ทธ์ธ ํ† ํฐ์ด 12์‹œ๊ฐ„ ๋™์•ˆ๋งŒ ์œ ํšจํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค.

๋‚˜๋Š” EC2 ์ธ์Šคํ„ด์Šค์— ์ด๋ฏธ AmazonEC2ContainerRegistryFullAccess IAM ์—ญํ• ์„ ๋ถ€์—ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ„๋„๋กœ ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์•„๋„ ๋  ์ค„ ์•Œ์•˜๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•˜๋‹ค.

โœ”๏ธ ์ •๋ฆฌํ•˜์ž๋ฉด...
EC2๊ฐ€ ECR์— ์ ‘๊ทผํ•  ๊ถŒํ•œ(IAM Role)์€ ์žˆ์ง€๋งŒ, Docker๋Š” AWS IAM์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ๋กœ๊ทธ์ธ ์ ˆ์ฐจ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋”ฐ๋ผ์„œ AWS CLI๋ฅผ ํ†ตํ•ด ์ธ์ฆ ํ† ํฐ์„ ๋ฐ›์•„์„œ Docker์— ์ „๋‹ฌํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ Deploy on EC2 ๋‹จ๊ณ„์— ์ถ”๊ฐ€ํ•˜์ž docker pull์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ–ˆ๋‹ค.

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin $ECR_URI

โœ”๏ธ IAM ๊ถŒํ•œ๊ณผ Docker ์ธ์ฆ์€ ๋ณ„๊ฐœ!

  • IAM Role์€ โ€œ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€โ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ถŒํ•œ์ด๋‹ค.
  • ํ•˜์ง€๋งŒ Docker๋Š” AWS์˜ ๊ถŒํ•œ ์ฒด๊ณ„๋ฅผ ๋ชจ๋ฆ„ โ†’ AWS CLI๋กœ ํ† ํฐ์„ ๋ฐ›์•„์„œ docker login์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์ธ์ฆํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๋˜ํ•œ, ECR ์ธ์ฆ ํ† ํฐ์€ ๋‹จ๊ธฐ(12์‹œ๊ฐ„ ์œ ํšจ) ํ† ํฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ฃผ๊ธฐ์ ์œผ๋กœ ์žฌ๋กœ๊ทธ์ธํ•˜๋Š” ๋กœ์ง์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.

โš™๏ธ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ECS, Fargate, EKS ๋“ฑ์˜ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์„œ๋น„์Šค๊ฐ€ ECR ์ธ์ฆ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ docker login์ด ํ•„์š” ์—†๋‹ค.

2. ํฌํŠธ ์ถฉ๋Œ ์—๋Ÿฌ
์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ค‘ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ์—ˆ๋‹ค.

Bind for 0.0.0.0:8080 failed: port is already allocated.

์ด๋Š” EC2 ๋‚ด์—์„œ ํฌํŠธ 8080์„ ์ด๋ฏธ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ผ๋Š” ๋œป์ด๋‹ค. ๋Œ€๋ถ€๋ถ„ ์ด์ „์— ์‹คํ–‰๋œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋‹ค.

๋”ฐ๋ผ์„œ docker run์„ ํ•˜๊ธฐ ์ „์— ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •๋ฆฌํ•ด์ฃผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

docker ps -q --filter ancestor=$ECR_URI | xargs -r docker stop
docker ps -aq --filter ancestor=$ECR_URI | xargs -r docker rm

๐Ÿ’ก$ECR_URI๋Š” ECR ์ด๋ฏธ์ง€ ์ฃผ์†Œ๋‹ค. ํ•˜์ง€๋งŒ ์ด์ „๊ณผ ๋‹ค๋ฅธ ํƒœ๊ทธ๊ฐ€ ๋ถ™์€ ์ด๋ฏธ์ง€๊ฑฐ๋‚˜ ์ด๋ฆ„์ด ๋ฐ”๋€Œ์—ˆ๋‹ค๋ฉด ํ•ด๋‹น ํ•„ํ„ฐ์— ์•ˆ ์žกํž ์ˆ˜ ์žˆ๋‹ค.

๋” ์•ˆ์ „ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ๋ช…์‹œํ•ด์„œ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.

docker stop my-app-container || true
docker rm my-app-container || true

์ •์ƒ์ ์œผ๋กœ ํฌํŠธ๊ฐ€ ๋น„์›Œ์กŒ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

sudo lsof -i :8080

health check ์‹คํŒจ

๋ฐฐํฌ๋Š” ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์ง€๋งŒ, health check๋Š” ๊ณ„์†ํ•ด์„œ ์‹คํŒจํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์„ ์ฒดํฌํ•ด๋ณด๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

1๋‹จ๊ณ„: Docker ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ

๋‹ค์Œ ๋ช…๋ น์–ด๋“ค์„ ํ†ตํ•ด ์‹คํ–‰ ์ƒํƒœ ๋ฐ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ์‹คํ–‰๋˜์ž๋งˆ์ž ๊บผ์ง€๋Š” ๊ฒฝ์šฐ์—” ๋กœ๊ทธ์—์„œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

docker ps                   # ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก
docker ps -a                # ์‹คํ–‰ ์ด๋ ฅ์ด ์žˆ๋Š” ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ
docker logs <์ปจํ…Œ์ด๋„ˆ ID>  # ์ฃฝ์€ ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ๊ทธ๊นŒ์ง€ ํ™•์ธ

2๋‹จ๊ณ„: Spring Actuator ์„ค์ • ํ™•์ธ

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”๋ฐ๋„ health check๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค๋ฉด,build.gradle์— Spring Actuator ์˜์กด์„ฑ์ด ์ œ๋Œ€๋กœ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

implementation 'org.springframework.boot:spring-boot-starter-actuator'

๋˜ํ•œ ๋ฐฐํฌ ์‹œ ์‚ฌ์šฉ๋˜๋Š” application-prod.yml์— ๋‹ค์Œ ์„ค์ •์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

management:
  endpoints:
    web:
      exposure:
        include: health,info

3๋‹จ๊ณ„: Spring Profile ํ™œ์„ฑํ™” ํ™•์ธ

์œ„ ์„ค์ •๋“ค์ด application-prod.yml์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ํ”„๋กœํŒŒ์ผ์ด ์‹ค์ œ๋กœ ํ™œ์„ฑํ™”๋˜๊ณ  ์žˆ๋Š”์ง€๋„ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. Spring Boot ์•ฑ์„ ์‹คํ–‰ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด prod ํ”„๋กœํŒŒ์ผ์ด ํ™œ์„ฑํ™”๋˜์–ด์•ผ ์„ค์ •์ด ์ ์šฉ๋œ๋‹ค.

-Dspring.profiles.active=prod

๊ธฐ์กด์—๋Š” docker run ๋ช…๋ น์–ด์—์„œ ์ง์ ‘ ์ „๋‹ฌํ–ˆ์ง€๋งŒ, Dockerfile ๋‚ด ENTRYPOINT๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด ๊ณ ์ •ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„ ํ–ˆ๋‹ค.

ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-jar", "app.jar"]

4๋‹จ๊ณ„: actuator ์ ‘๊ทผ ๊ถŒํ•œ ํ™•์ธ

์„ค์ •์ด ์ž˜ ๋˜์–ด ์žˆ๋Š”๋ฐ๋„ ์—ฌ์ „ํžˆ health check๊ฐ€ ์‹คํŒจํ•œ๋‹ค๋ฉด, ๋ณด์•ˆ ์„ค์ •(SecurityConfig)์„ ์ ๊ฒ€ํ•ด์•ผ ํ•œ๋‹ค. EC2์— SSH ์ ‘์†ํ•ด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด ํ™•์ธํ•ด๋ดค๋‹ค.

curl http://localhost:8080/actuator/health

ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ 403 Forbidden ์‘๋‹ต์ด ์˜ค๋ฉด, actuator endpoint๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜ ์ ‘๊ทผ ๊ถŒํ•œ์ด ๋ง‰ํ˜€ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

๋˜, SecurityConfig ํด๋ž˜์Šค์—์„œ actuator ๊ฒฝ๋กœ๋„ ํ—ˆ์šฉํ•ด์•ผ ํ•œ๋‹ค.

5๋‹จ๊ณ„: ์™ธ๋ถ€ ์ ‘์† ํ…Œ์ŠคํŠธ ๋ฐ ๋ณด์•ˆ ๊ทธ๋ฃน ์„ค์ •

EC2 ๋‚ด๋ถ€์—์„œ๋Š” health ์‘๋‹ต์ด ์ž˜ ์˜ค๋Š”๋ฐ๋„ ์™ธ๋ถ€ health check๊ฐ€ ์‹คํŒจํ•œ๋‹ค๋ฉด, EC2 ๋ณด์•ˆ ๊ทธ๋ฃน ์„ค์ •์„ ์ ๊ฒ€ํ•ด์•ผ ํ•œ๋‹ค. AWS๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํŠนํžˆ๋‚˜ ๋ณด์•ˆ ๊ทธ๋ฃน ์„ค์ • ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋‹ˆ ์ž˜ ํ™•์ธํ•ด๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํฌํŠธ 8080์ด ํผ๋ธ”๋ฆญ์œผ๋กœ ์—ด๋ ค ์žˆ์–ด์•ผ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

EC2์—์„œ ๋‹ค์‹œ ํ™•์ธํ•ด๋ณด๋‹ˆ ์ •์ƒ์ ์œผ๋กœ HTTP/1.1 200 OK ์‘๋‹ต์ด ์˜จ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, http://<EC2 ํผ๋ธ”๋ฆญ IPv4 ์ฃผ์†Œ>:8080/actuator/health ์™€ ๊ฐ™์ด ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ๋‚˜๋Š” EC2์— ํƒ„๋ ฅ์  IP๋ฅผ ํ• ๋‹นํ•˜์—ฌ ๊ณ ์ •๋œ ์ฃผ์†Œ๋กœ ํ•ญ์ƒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์—ฐ๊ฒฐํ–ˆ๋‹ค.

Redis ์—ฐ๊ฒฐ ์‹คํŒจ - ElastiCache ์„ค์ •

๋ฐฐํฌ ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋๋‚ฌ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ์ดํ›„ ํ…Œ์ŠคํŠธ ์ค‘ Redis ์—ฐ๊ฒฐ ๊ด€๋ จ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

๋กœ๊ทธ๋ฅผ ์ž์„ธํžˆ ๋ณด๋ฉด Redis ๊ด€๋ จ ์˜ค๋ฅ˜๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Caused by: io. lettuce. core. RedisConnectionException: Unable to connect to
eightyage-cache. 2i7efi.ng. 0001.apn2. cache. amazonaws. com/<unresolved>: 6379

Redis ์„ค์ • ์ ๊ฒ€

application-prod.yml์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด Redis ์„ค์ •์„ ํ•ด๋‘์—ˆ๋‹ค.

data:
  redis:
    host: ${REDIS_HOST}
    port: 6379

๊ทธ๋ฆฌ๊ณ  REDIS_HOST ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” GitHub Repository Secrets์— ์ •์ƒ์ ์œผ๋กœ ๋“ฑ๋กํ–ˆ๋‹ค. ์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—๋Š” ElastiCache Redis ์ธ์Šคํ„ด์Šค์˜ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

EC2์—์„œ ์ง์ ‘ ์ ‘์† ํ™•์ธ

EC2์—์„œ telnet์œผ๋กœ Redis์— ์ ‘์†์„ ์‹œ๋„ํ•ด๋ดค๋‹ค.

telnet <REDIS_HOST> 6379

ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š์•˜๋‹ค.

์›์ธ ๋ถ„์„: ๋ณด์•ˆ ๊ทธ๋ฃน ์ธ๋ฐ”์šด๋“œ ๋ฏธ์„ค์ •

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ElastiCache Redis ์ธ์Šคํ„ด์Šค์˜ ๋ณด์•ˆ ๊ทธ๋ฃน์ด EC2์˜ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด์—ˆ๋‹ค. Redis๊ฐ€ ํผ๋ธ”๋ฆญํ•˜๊ฒŒ ์—ด๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, EC2์ฒ˜๋Ÿผ ๋‚ด๋ถ€ ํ†ต์‹ ์„ ํ•˜๋ ค๋ฉด ๋ณด์•ˆ ๊ทธ๋ฃน ๊ฐ„ ์ธ๋ฐ”์šด๋“œ ํ—ˆ์šฉ ์„ค์ •์ด ํ•„์ˆ˜๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™์— EC2 ์ธ์Šคํ„ด์Šค์˜ ๋ณด์•ˆ ๊ทธ๋ฃน์„ ์†Œ์Šค๋กœ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

๐Ÿ“Œ ๋ณด์•ˆ ๊ทธ๋ฃน ๊ฐ„ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ : EC2 ์ธ์Šคํ„ด์Šค์˜ IP๋Š” ๋ณ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ณ ์ •๋œ IP๊ฐ€ ์•„๋‹Œ EC2๊ฐ€ ์†ํ•œ ๋ณด์•ˆ ๊ทธ๋ฃน ์ž์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์ด ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•˜๋‹ค.

Redis ์—ฐ๊ฒฐ ์„ฑ๊ณต

์„ค์ • ๋ณ€๊ฒฝ ํ›„ ๋‹ค์‹œ ์ ‘์†์„ ์‹œ๋„ํ•ด๋ณด๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ์ด ๋˜์—ˆ๋‹ค.

Spring Boot Actuator์—์„œ๋„ Redis ๊ด€๋ จ ํ•ญ๋ชฉ์ด ํฌํ•จ๋œ health ์ •๋ณด๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€