Skip to content

Bash-based automation tool that generates Kubernetes manifests, deploys services to AWS EKS, and configures ALB path-based routing.

Notifications You must be signed in to change notification settings

jiu-jung/bash-eks-autodeploy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

2 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸš€ AWS EKS Autodeploy

Docker Hub 이미지λ₯Ό 기반으둜:

  1. ECR둜 이미지 μ—…λ‘œλ“œ
  2. Kubernetes Deployment / Service / Ingress YAML μžλ™ 생성
  3. kubectl apply둜 EKS에 배포
  4. AWS Load Balancer Controller둜 ALB + Path-based Routing(/a, /b, /c) ꡬ성

κΉŒμ§€λ₯Ό 원클릭 슀크립트둜 μžλ™ν™”ν•œ 데λͺ¨ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.

β€œDocker pull β†’ ECR push β†’ Kubernetes manifest μžλ™ 생성 β†’ kubectl apply β†’ ALB λΌμš°νŒ…β€
E2E μ›Œν¬ν”Œλ‘œμš°λ₯Ό ν•œ λ²ˆμ— μž¬ν˜„ν•  수 μžˆλ„λ‘ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.



🧱 Tech Stack

Cloud / Network

  • AWS EKS, ECR, IAM, ALB (Application Load Balancer)
  • AWS Load Balancer Controller (Ingress ↔ ALB 연동)

Kubernetes

  • Deployment, Service (ClusterIP), Ingress (path-based routing)
  • Ingress Class: alb, TargetType: ip

Tools & Automation

  • eksctl, kubectl, helm, aws-cli, docker
  • Bash Shell Script


πŸ“ Repository Structure

eks-ecr-k8s-autodeploy-demo/
β”œβ”€β”€ README.md
β”œβ”€β”€ config/
β”‚   └── env.sh                 # 곡톡 AWS/EKS ν™˜κ²½ λ³€μˆ˜
β”œβ”€β”€ infra/
β”‚   └── infra-create.sh        # EKS ν΄λŸ¬μŠ€ν„° + ALB Controller μžλ™ 생성 슀크립트
β”œβ”€β”€ scripts/
β”‚   β”œβ”€β”€ 00-common-env.sh       # 곡톡 env + μ„œλΉ„μŠ€/ECR μ„€μ •
β”‚   β”œβ”€β”€ 01-build-and-push.sh   # Docker Hub β†’ ECR 이미지 μ—…λ‘œλ“œ μžλ™ν™”
β”‚   β”œβ”€β”€ 02-generate-manifests.sh # K8s Deployment/Service/Ingress YAML μžλ™ 생성
β”‚   β”œβ”€β”€ 03-deploy.sh           # kubectl apply 전체 배포
β”‚   └── deploy-all.sh          # μœ„ 3개 슀크립트λ₯Ό 순차 μ‹€ν–‰ν•˜λŠ” 원클릭 슀크립트
└── manifests/
    β”œβ”€β”€ README.md              # 이 폴더 μ„€λͺ… (auto-generated 파일 μ•ˆλ‚΄)
    └── .gitkeep               # μ‹€μ œ YAML은 슀크립트 μ‹€ν–‰ μ‹œ 생성

μ‹€μ œ service-a.yaml, service-b.yaml, service-c.yaml, ingress.yaml은 02-generate-manifests.sh μ‹€ν–‰ μ‹œ manifests/ μ•„λž˜μ— μƒμ„±λ©λ‹ˆλ‹€.



🧩 Architecture

EKS + ECR + ALB Path-based Routing ꡬ쑰λ₯Ό λ‹¨μˆœν™”ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • ECR: service-a, service-b, service-c용 프라이빗 이미지 μ €μž₯μ†Œ
  • EKS: 3개의 Deployment(Pod) + 3개의 ClusterIP Service
  • Ingress: /a, /b, /c κ²½λ‘œμ— 따라 각 Service둜 λΌμš°νŒ…
  • AWS Load Balancer Controller: Ingress λ¦¬μ†ŒμŠ€λ₯Ό 감지 β†’ ALB 생성 및 μ„€μ • μžλ™ν™”


βš™οΈ Prerequisites

λ‹€μŒ 도ꡬ듀이 둜컬 ν™˜κ²½μ— μ„€μΉ˜λ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

  • aws-cli
  • eksctl
  • kubectl
  • helm
  • docker
  • AWS 계정 및 IAM κΆŒν•œ
    • EKS, ECR, IAM Policy, ALB 등을 생성할 수 μžˆλŠ” κΆŒν•œ ν•„μš”


πŸ”§ 1. 곡톡 ν™˜κ²½ λ³€μˆ˜ μ„€μ • (config/env.sh)

config/env.shλŠ” infra + app λ°°ν¬μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” ν™˜κ²½ νŒŒμΌμž…λ‹ˆλ‹€.

#!/bin/bash

#########################################
# 곡톡 AWS / EKS ν™˜κ²½ λ³€μˆ˜
#########################################

export AWS_REGION="ap-northeast-2"
export AWS_ACCOUNT_ID="<YOUR_AWS_ACCOUNT_ID>"

export EKS_CLUSTER_NAME="eks-demo"
export NODE_GROUP_NAME="demo-node-group"
export VPC_ID="<YOUR_VPC_ID>"

echo "[config/env.sh] 곡톡 ν™˜κ²½ λ³€μˆ˜ λ‘œλ“œ μ™„λ£Œ"
  • AWS_ACCOUNT_ID와 VPC_IDλŠ” λ°˜λ“œμ‹œ 본인 계정에 맞게 μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • 이 파일만 μˆ˜μ •ν•˜λ©΄ infra-create.sh와 00-common-env.sh λͺ¨λ‘μ— λ°˜μ˜λ©λ‹ˆλ‹€.


πŸ—οΈ 2. EKS ν΄λŸ¬μŠ€ν„° & ALB Controller 생성 (infra/infra-create.sh)

cd infra
chmod +x infra-create.sh
./infra-create.sh

이 μŠ€ν¬λ¦½νŠΈλŠ” λ‹€μŒμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  1. eksctl create cluster둜 EKS ν΄λŸ¬μŠ€ν„° 생성

    • Managed Node Group, OIDC, Node 수, νƒ€μž… λ“± μ„€μ •
  2. AWS Load Balancer Controller용 IAM Policy λ‹€μš΄λ‘œλ“œ & 생성

  3. eksctl create iamserviceaccount둜 IRSA(ServiceAccount + IAM Role) 생성

  4. Helm 차트둜 AWS Load Balancer Controller μ„€μΉ˜

성곡 μ‹œ λ‹€μŒ λͺ…λ ΉμœΌλ‘œ μƒνƒœλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

kubectl get nodes
kubectl get deployment -n kube-system aws-load-balancer-controller


πŸ“¦ 3. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν™˜κ²½ λ³€μˆ˜ μ„€μ • (scripts/00-common-env.sh)

#!/bin/bash

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_ENV="${SCRIPT_DIR}/../config/env.sh"

if [ -f "$CONFIG_ENV" ]; then
  source "$CONFIG_ENV"
else
  echo "ERROR: config/env.sh λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€: $CONFIG_ENV"
  exit 1
fi

#########################################
# μ„œλΉ„μŠ€λ³„ ECR Repo / Image μ„€μ •
#########################################

export SERVICE_A_REPO="service-a"
export SERVICE_B_REPO="service-b"
export SERVICE_C_REPO="service-c"

export SERVICE_A_URI="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${SERVICE_A_REPO}"
export SERVICE_B_URI="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${SERVICE_B_REPO}"
export SERVICE_C_URI="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${SERVICE_C_REPO}"

export SRC_IMAGE_A="nginxdemos/hello:latest"
export SRC_IMAGE_B="hashicorp/http-echo:latest"
export SRC_IMAGE_C="hashicorp/http-echo:latest"

echo "=== 00-common-env.sh μ„€μ • μ™„λ£Œ ==="
echo "AWS_ACCOUNT_ID    = $AWS_ACCOUNT_ID"
echo "EKS_CLUSTER_NAME  = $EKS_CLUSTER_NAME"
echo "SERVICE_A_URI     = $SERVICE_A_URI"
echo "SERVICE_B_URI     = $SERVICE_B_URI"
echo "SERVICE_C_URI     = $SERVICE_C_URI"

μ—¬κΈ°μ„œλŠ” **μ„œλΉ„μŠ€(ECR Repo 이름, Docker Hub Source 이미지)**λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. ν•„μš”ν•˜λ©΄ service-d 등을 μΆ”κ°€ν•΄ μ‰½κ²Œ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.



πŸš€ 4. One-click Application Deploy (scripts/deploy-all.sh)

4-1. κΆŒν•œ μ„€μ •

cd scripts
chmod +x *.sh

4-2. 원클릭 배포

./deploy-all.sh

deploy-all.shλŠ” λ‚΄λΆ€μ μœΌλ‘œ λ‹€μŒ μ„Έ κ°€μ§€λ₯Ό μˆœμ„œλŒ€λ‘œ μ‹€ν–‰ν•©λ‹ˆλ‹€.

  1. 01-build-and-push.sh

    • Docker Hubμ—μ„œ 이미지 pull
    • ECR URI둜 tag
    • ECR에 push
  2. 02-generate-manifests.sh

    • manifests/service-a.yaml
    • manifests/service-b.yaml
    • manifests/service-c.yaml
    • manifests/ingress.yaml β†’ μœ„ νŒŒμΌλ“€μ„ μžλ™ 생성
  3. 03-deploy.sh

    • kubectl apply -f둜 μœ„ YAML듀을 ν΄λŸ¬μŠ€ν„°μ— 배포
    • kubectl get pods, kubectl get svc, kubectl get ingress둜 μƒνƒœ 좜λ ₯


πŸ“œ Scripts μ„€λͺ…

파일λͺ… μœ„μΉ˜ μ—­ν• 
config/env.sh config/ AWS 계정/리전, EKS ν΄λŸ¬μŠ€ν„°, VPC ID λ“± 곡톡 ν™˜κ²½ λ³€μˆ˜
infra-create.sh infra/ EKS ν΄λŸ¬μŠ€ν„° 생성 + ALB Controller μ„€μΉ˜ μžλ™ν™”
00-common-env.sh scripts/ config/env.shλ₯Ό 읽고 μ„œλΉ„μŠ€λ³„ ECR Repo / Source 이미지 μ„€μ •
01-build-and-push.sh scripts/ Docker Hub β†’ ECR: pull/tag/push 전체 μžλ™ν™”
02-generate-manifests.sh scripts/ Deployment/Service/Ingress YAML νŒŒμΌμ„ manifests/에 μžλ™ 생성
03-deploy.sh scripts/ kubectl apply둜 K8s λ¦¬μ†ŒμŠ€ 전체 배포 + μƒνƒœ 쑰회
deploy-all.sh scripts/ μœ„ 3개 슀크립트λ₯Ό 순차 μ‹€ν–‰ν•˜λŠ” 원클릭 νŒŒμ΄ν”„λΌμΈ


🌐 ALB & Path-based Routing ν…ŒμŠ€νŠΈ

1) Ingress 확인

kubectl get ingress

좜λ ₯ μ˜ˆμ‹œ:

NAME               CLASS   HOSTS   ADDRESS                                            PORTS   AGE
test-path-routing  alb     *       k8s-default-testpath-xxxx.ap-northeast-2.elb.amazonaws.com   80      1m

2) λΈŒλΌμš°μ € λ˜λŠ” curl둜 ν…ŒμŠ€νŠΈ

http://<ALB-DNS>/a
http://<ALB-DNS>/b
http://<ALB-DNS>/c
  • /a β†’ service-a (nginxdemos/hello)
  • /b β†’ service-b (hashicorp/http-echo with "Hello from Service B")
  • /c β†’ service-c (hashicorp/http-echo with "Hello from Service C")


🧹 Cleanup (λ¦¬μ†ŒμŠ€ 정리)

μ‹€μŠ΅μ΄ λλ‚œ ν›„ λΉ„μš© μ ˆκ°μ„ μœ„ν•΄ λ¦¬μ†ŒμŠ€λ₯Ό 정리해 μ£Όμ„Έμš”.

1) μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ¦¬μ†ŒμŠ€ μ‚­μ œ

kubectl delete -f manifests/ingress.yaml
kubectl delete -f manifests/service-a.yaml
kubectl delete -f manifests/service-b.yaml
kubectl delete -f manifests/service-c.yaml

2) EKS ν΄λŸ¬μŠ€ν„° μ‚­μ œ

eksctl delete cluster --name <EKS_CLUSTER_NAME> --region <AWS_REGION>

3) μΆ”κ°€ 정리

  • ν•„μš” μ‹œ ECR 리포지토리 및 IAM Policy/Role도 ν•¨κ»˜ μ‚­μ œν•΄ μ£Όμ„Έμš”.

About

Bash-based automation tool that generates Kubernetes manifests, deploys services to AWS EKS, and configures ALB path-based routing.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages