๐ŸŽฏ AWS CLI๋ฅผ ํ™œ์šฉํ•ด ์ด๋ฏธ์ง€ ๋ฐฐํฌ๋ถ€ํ„ฐ ์ธ์ฆ๊นŒ์ง€ ์‹ค์Šตํ•˜๋ฉฐ ์ž๋™ํ™” ๊ธฐ๋ฐ˜ ๋ฐฐํฌ ํ๋ฆ„์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“— Today I Learned

AWS (Amazon Web Services)

Services

  • EC2 (Elastic Compute Cloud) ์›น์„œ๋ฒ„, DB, Minikube ํด๋Ÿฌ์Šคํ„ฐ ๋“ฑ ์‹คํ–‰ํ™˜๊ฒฝ ๊ตฌ์„ฑ (t3.medium)
    โ†’ Nginx reverse proxy, MariaDB ์„ค์น˜
  • AMI (Amazon Machine Image) ๋™์ผํ•œ ๊ตฌ์„ฑ์˜ EC2๋ฅผ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ฏธ๋ฆฌ ๊ตฌ์„ฑ๋œ ์ด๋ฏธ์ง€
    โ†’ Minikube, Nginx, DB ์„ค์ • ํฌํ•จ
  • ECR (Elastic Container Registry) ํ”„๋ก ํŠธ์—”๋“œ & ๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ Push/Pull
    โ†’ ๋ฐฐํฌ ์‹œ ํ™œ์šฉ
  • S3 (Simple Storage Service) Terraform ์ƒํƒœ ํŒŒ์ผ ์ €์žฅ์šฉ (์ธํ”„๋ผ ์ž๋™ํ™” ๊ด€๋ฆฌ์šฉ)
    โ†’ ์ถ”ํ›„ ์ด๋ฏธ์ง€/๋ฌธ์„œ ๋“ฑ ํŒŒ์ผ ์ €์žฅ๋„ ๊ฐ€๋Šฅ

ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ ์ด์šฉ

  • ์žฅ์ 

    • ์œ ์—ฐํ•œ ์ด์šฉ, ์•ˆ์ •์  ์„œ๋น„์Šค, ๋‹ค์ค‘ํ™”์™€ ์Šค์ผ€์ผ๋ง

    • Pay-as-you-go, TCO (total cost of ownership) ์ ˆ๊ฐ

    • ๋‹ค์–‘ํ•œ ๋„๊ตฌ ์ œ๊ณต, ํ’๋ถ€ํ•œ ๋ฌธ์„œ ๋ฐ ์ฐธ๊ณ  ์ž๋ฃŒ

  • ๋‹จ์ 

    • ์ƒ๊ฐ๋ณด๋‹ค ๋น„์šฉ์ด ๋งŒ๋งŒํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

    • ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•ด๋„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ด์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉด ๊ณผ๊ธˆ

    • ์ต์ˆ™ํ•ด์ง€์ง€ ์•Š์œผ๋ฉด ๋‹ค์†Œ ๋ณต์žกํ•˜๊ณ  ์ƒ์†Œํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Œ




์‹ค์Šต

AWS ์ฝ˜์†” ๋กœ๊ทธ์ธ


EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐ ๋„คํŠธ์›Œํฌ ์„ค์ •

  • ์ธ์Šคํ„ด์Šค ํƒ€์ž…: t3.medium

  • ์Šคํ† ๋ฆฌ์ง€: 16GiB gp2

  • ๋ณด์•ˆ ๊ทธ๋ฃน: ์šด์˜์ง„์ด ์ง€์ •ํ•œ security group ์‚ฌ์šฉ
    โ†’ ํฌํŠธ ์—ด๋ฆผ: 22(SSH), 80/443(HTTP/HTTPS), 3306(MySQL), 8443(Minikube)

  • Elastic IP: ๋„๋ฉ”์ธ๊ณผ ์—ฐ๊ฒฐ๋œ ๊ณ ์ • IP ์ œ๊ณต๋จ


Key Pair ์ƒ์„ฑ ๋ฐ SSH ์ ‘์†

  • ํ˜•์‹: .pem

  • ์•”ํ˜ธํ™” ๋ฐฉ์‹: RSA

โš ๏ธ ์ƒ์„ฑํ•œ key๋Š” ๊ผญ ๋ณด๊ด€, ๋…ธ์ถœ ์‹œ ์œ„ํ—˜

  • SSH ์ ‘์† ๋ช…๋ น์–ด
ssh -i your-key.pem ubuntu@your-domain-name

Minikube ํ™œ์„ฑํ™” ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ค€๋น„

  • Minikube๋Š” ๋ฏธ๋ฆฌ ์„ค์ •๋˜์ง€ ์•Š์Œ โ†’ IP๊ฐ€ ๊ณ ์ •๋œ ํ›„์— ์ง์ ‘ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•จ

  • ๋ช…๋ น์–ด

sudo systemctl enable minikube
sudo reboot
  • ์žฌ๋ถ€ํŒ… ํ›„ ์ƒํƒœ ํ™•์ธ: "active (exited)" ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ

ํด๋Ÿฌ์Šคํ„ฐ ์ ‘๊ทผ ์„ค์ • (์›๊ฒฉ์ง€์—์„œ kubectl ์‚ฌ์šฉ)

  • ํ•„์š” ํŒŒ์ผ๋“ค (์„œ๋ฒ„์—์„œ ๋กœ์ปฌ๋กœ ๋ณต์‚ฌ):

    • ~/.minikube/ca.crt

    • ~/.minikube/profiles/minikube/client.crt

    • ~/.minikube/profiles/minikube/client.key

  • kubeconfig ์„ค์ •

clusters:
  - name: <ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„>
    cluster:
      certificate-authority: ./ca.crt
      server: https://<Elastic IP>:8443

users:
  - name: <์‚ฌ์šฉ์ž ์ด๋ฆ„>
    user:
      client-certificate: ./client.crt
      client-key: ./client.key

contexts:
  - name: <์ปจํ…์ŠคํŠธ ์ด๋ฆ„>
    context:
      cluster: <ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„>
      user: <์‚ฌ์šฉ์ž ์ด๋ฆ„>
  • ์ปจํ…์ŠคํŠธ ์ „ํ™˜
kubectl config use-context <์ปจํ…์ŠคํŠธ ์ด๋ฆ„>



๋ฐฐํฌ ๋„๊ตฌ ์„ค์ •

ECR (Elastic Container Registry)

ํ”„๋ก ํŠธ์—”๋“œ/๋ฐฑ์—”๋“œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋„์ปค ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ


๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ

  • AWS Console โ†’ ECR โ†’ Create Repository

AWS CLI ์„ค์น˜


์•ก์„ธ์Šค ํ‚ค ๋ฐœ๊ธ‰

IAM โ†’ Users โ†’ ๋ณธ์ธ ๊ณ„์ • โ†’ Security credentials ํƒญ
โ†’ "Access key" ์ƒ์„ฑ (CLI ์šฉ๋„ ์„ ํƒ)

โš ๏ธ ํ•œ ๋ฒˆ๋งŒ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋ณต์‚ฌ/๋ณด๊ด€


#### CLI ์ž๊ฒฉ ์ฆ๋ช… ์„ค์ • ```bash aws configure # ์ž…๋ ฅ: access key, secret key, region, output format ```

๋„์ปค ๋กœ๊ทธ์ธ

aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com

๋กœ์ปฌ ์ด๋ฏธ์ง€ ์ค€๋น„

docker pull nginx  # ์˜ˆ์‹œ

ํƒœ๊น… ํ›„ ํ‘ธ์‹œ

docker tag nginx:latest <repository-uri>:latest
docker push <repository-uri>:latest

๋กœ์ปฌ ์ด๋ฏธ์ง€ ์‚ญ์ œ ํ›„ ECR์—์„œ pull ํ™•์ธ

docker rmi <repository-uri>:latest
docker pull <repository-uri>:latest



Amazon S3 (Simple Storage Service)

Terraform ์ƒํƒœ ๋ฐ์ดํ„ฐ ์ €์žฅ, ์ •์  ํŒŒ์ผ ์—…๋กœ๋“œ์šฉ ๋ฒ„ํ‚ท ์ œ๊ณต


๋ฒ„ํ‚ท ์ƒ์„ฑ

  • AWS Console โ†’ S3 โ†’ Create Bucket

์›น์—์„œ ํŒŒ์ผ ์—…๋กœ๋“œ

  • S3 ์ฝ˜์†”์—์„œ ์ง์ ‘ ์—…๋กœ๋“œ ๊ฐ€๋Šฅ

CLI๋กœ ํŒŒ์ผ ํ™•์ธ

aws s3 ls s3://<your-bucket-name>/
aws s3 cp localfile.txt s3://<your-bucket-name>/



๋ฐฐํฌ ํ™˜๊ฒฝ ํ…Œ์ŠคํŠธ

Minikube ํด๋Ÿฌ์Šคํ„ฐ์— ์‹œํ—˜ ๋ฐฐํฌ

  • ๋ฐฐํฌ ๋Œ€์ƒ: EC2 ๋‚ด Minikube ํด๋Ÿฌ์Šคํ„ฐ

  • ์ด๋ฏธ์ง€: ๊ธฐ์กด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ ์„ค์ •๋งŒ ์กฐ์ •ํ•ด ํ…Œ์ŠคํŠธ

  • ๋ชฉํ‘œ: ์‹ค ์„œ๋น„์Šค์— ์ค€ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ์˜ ๋ฐฐํฌ ๊ฒ€์ฆ


ECR ์ด๋ฏธ์ง€๋กœ ์ „ํ™˜ ๋ฐ ์ธ์ฆ ์„ค์ •

Private ์ด๋ฏธ์ง€ Pull์„ ์œ„ํ•œ ์ธ์ฆ ํ•„์š”

  • ECR์€ Private ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์ด๋ฏ€๋กœ ์ธ์ฆ ํ•„์ˆ˜

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Kubernetes์˜ imagePullSecrets ์‚ฌ์šฉ

์ธ์ฆ ๋ฐฉ์‹

  • AWS ๋กœ๊ทธ์ธ ์ •๋ณด ๊ธฐ๋ฐ˜์œผ๋กœ Secret ์ƒ์„ฑ
aws ecr get-login-password | docker login ...
  • Kubernetes Secret ์ƒ์„ฑ
kubectl create secret docker-registry aws-ecr-cred \
  --docker-server=180993267331.dkr.ecr.ap-northeast-2.amazonaws.com \
  --docker-username=AWS \
  --docker-password=$(aws ecr get-login-password) \
  --docker-email=your@email.com
  • Deployment Manifest์— ์ ์šฉ
imagePullSecrets:
  - name: aws-ecr-cred

BE / FE ํ™˜๊ฒฝ ์„ค์ • (K8s Config & Manifest)

  • Backend ์„ค์ • ์˜ˆ์‹œ (notes-be.yaml)
apiVersion: v1
kind: ConfigMap
metadata:
  name: notes-be-config
  namespace: prgms-notes
data:
  DB_HOST: notes-000.prgms-fullcycle.com
  DB_USER: prgms
  DB_PASSWD: prgms
  DB_NAME: prgms_notes
  CORS_ALLOWED_ORIGIN: https://notes-000.prgms-fullcycle.com
---
spec:
  containers:
  - name: notes-backend
    image: 180993267331.dkr.ecr.ap-northeast-2.amazonaws.com/notes-be:dpy-test
    imagePullPolicy: Always
    envFrom:
    - configMapRef:
        name: notes-be-config
    imagePullSecrets:
    - name: aws-ecr-cred
  • Frontend ์„ค์ • ์˜ˆ์‹œ (notes-fe.yaml)
spec:
  containers:
  - name: notes-frontend
    image: 180993267331.dkr.ecr.ap-northeast-2.amazonaws.com/notes-fe:dpy-test
    imagePullPolicy: Always
    ports:
    - containerPort: 3000
    env:
    - name: REACT_APP_API_BASE_URL
      value: https://notes-000.prgms-fullcycle.com/api
    imagePullSecrets:
    - name: aws-ecr-cred

Makefile์„ ์ด์šฉํ•œ ์ด๋ฏธ์ง€ ๋นŒ๋“œ/ํ‘ธ์‹œ ์ž๋™ํ™”

ARCH=amd64
IMG_REGISTRY=180993267331.dkr.ecr.ap-northeast-2.amazonaws.com
IMG_NAME=notes-fe
IMG_TAG=${IMG_REGISTRY}/${IMG_NAME}:dpy-test

image: Dockerfile
	docker build --platform=linux/${ARCH} --tag ${IMG_TAG} .

push: image
	aws ecr get-login-password | docker login --username AWS --password-stdin ${IMG_REGISTRY}
	docker push ${IMG_TAG}



โœ๏ธ ํšŒ๊ณ 

ECR ์ด๋ฏธ์ง€ ํ‘ธ์‹œ, S3 ์ ‘๊ทผ, Kubernetes์—์„œ secret ์ƒ์„ฑ๊นŒ์ง€ ๊ฑฐ์˜ ๋ชจ๋“  ์ž๋™ํ™”๋‚˜ ์ธ์ฆ ๊ณผ์ •์— AWS CLI๊ฐ€ ๊ด€์—ฌํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด ๋†€๋ผ์› ๋‹ค.

profile
๐ŸŒฑ๊ฐœ๋ฐœ ๊ธฐ๋ก์žฅ

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