AWS Basic / Terraform & Ansible / Lambda, EKS

2026. 7. 5. 22:50·AWS

본 자료는 2025년 11월 AWS 관련 3일간 교육받았던 내용을 정리한 것이며,
노션에 정리된 자료를 옮겼음을 알려드립니다.

Day 1

AWS Basic

AWS 소개

IaaS , PaaS, SaaS

Infra / Platfrom / Software as a Service

각각 접근 가능한 범위가 다름. os / Data, application / data 일부

클라우드의 장점 : 비용 절감 / 확장성 및 유연성 / 고가용성(HA) 및 신뢰성

onPremise Cloud란..? 가상화 도구를 활용해서 Cloud 환경을 활용 ↔ public cloud

AWS 주요 서비스

  • 컴퓨팅 서비스 : EC2, Lambda
  • 스토리지 서비스 : S3, EBS
  • 데이터베이스 서비스 : RDS, DynomaDB
  • 네트워킹 서비스 : VPC, CloudFront
  • route53 : DNS 도메인과 서버를 연결해주는 서비스

⚠️ AWS가 어렵다고 느끼는 이유? 본 서비스를 몰라서.
ex) DataBase를 모르면 RDS가 어렵게 느껴짐. 서버리스를 모르면? Lambda가 어렵게 느껴짐

리전과 존의 이해

  • 리전 : AWS 서비스를 제공하는 물리적 위치 단위로 각 리전은 독립적임
  • 가용 영역(AZ) : 하나의 리전 내에서 물리적으로 분리된 데이터 센터 그룹
  • 엣지 로케이션 : 콘텐츠 배포를 위해 사용되는 위치 (CloudFront의 네트워크 엣지 캐시를 제공)

VPC → 서울1 → 서브넷4. 여기서 각각의 서브넷이 하나의 존(가용 영역)

클라우드 인프라의 배포 구성 단위

Region > Zone > Pod > Cluster > Host (Cloud Stack 기준)

비용 관리

  • AWS Cost Explorer : 비용을 시각적으로 모니터링
  • AWS Budgets : 예산을 설정하고 초과 시 알림 설정 가능

💯 항상 내가 어떤 리전과 서비스를 사용하고 있는지 인지하자!

EC2란?

Elastic Compute Cloud의 줄임말로, 가상 서버를 제공하는 AWS의 핵심 컴퓨팅 서비스. (IaaS 中 1)

  • 다양한 인스턴스 유형
  • Auto Scaling : 수요에 따라 인스턴스를 자동으로 추가/제거
    ELB와 연계하여 트래픽을 여러 인스턴스로 분산
  • 보안 그룹

인스턴스 유형

  • 범용 : 균형 잡힌 CPU와 메모리 (ex.t4g, m5)
  • 컴퓨팅 최적화 : 높은 성능의 CPU (ex.c5)
  • 메모리 최적화 : 메모리 집약적 워크로드에 적합 (ex.r5)
  • 스토리지 최적화 : 고속 로컬 스토리지 필요 시 (ex.i3)

❕비용 절감 위해 스팟 인스턴스(여유 자원) 또는 예약 인스턴스(장기 약정) 사용 가능

보안 및 네트워크 구성 옵션

  • 보안 그룹 설정 : Port 뚫기 ( ssh : 22 / https : 443)
  • 네트워크 ACL 구성
  • 키 페어 사용 : public/private key pair 생성
  • VPC 설정

!서울로 리전을 설정. EC2 DashBoard 접속

서울로 리전을 설정. EC2 DashBoard 접속

 

AMI (Amazon Machine Image) 이해하기

EC2 인스턴스를 생성하기 위한 템플릿 역할을 하는 이미지

운영체제, 애플리케이션, 설정등이 포함된 상태로 인스턴스 생성 가능

사용자 정의 AMI : 기존 인스턴스를 커스터마이징하여 새로운 AMI로 저장 가능 (복사 가능)

  1. AMI 선택 후 유형,키페어,보안 그룹 등 설정
  2. 시작 후 public ip 할당 및 접속 가능
  3. 인스턴스 사용 ~
  4. 중지 : 인스턴스를 종료하지만 데이터는 유지 (stopping → stopped 대기)
  5. 종료 : 인스턴스와 모든 데이터 삭제

모니터링과 로깅 (CloudWatch)

  • EC2 인스턴스의 상태, CPU 사용률, 네트워크 트래픽 등을 모니터링
  • CloudWatch Logs를 통해 로그 수집 및 분석 가능

EC2 인스턴스 생성해보기

  1. 이름 지정
  2. OS Image 설정 : Ubuntu 22.04 LTs
  3. Instance type 설정 : t.2small
  4. Key pair 설정 : window = ppk (putty) / mac-\ -pem (linux) 으로
  5. 네트워크 설정
  6. 보안 그룹 설정 : ssh 22 port 허용
  7. 스토리지 설정 : Root volume, EBS Volume type (20GB, gp3 사용)
  8. 인스턴스 시작

⚠️인스턴스 중시/시작 시 Public IP 변경됨

⚠️키 페어 파일은 분실 시 복구 불가

!하단부에서 detail, status, monitoring, security, networking, storage등 확인 가능.

ssh -i Downloads/mykey.pem ubuntu@13.209.8.80

# 맥에서는 chomd 600 Downloads/mykey.pem 필요 (권한 설정)

❕EC2에서는 AMI 에 따라 기본 사용자 계정 이름이 설정됨! (지금 계정명이 ubuntu인 이유)

쉘 접속 후 Monitoring에서도 그래프가 그려지는것을 확인 가능.

Security Groups에서 Inbound Rule 설정을 통해 접속 가능 IP 설정 가능

💡

만약 key pair 를 통한 로그인이 잘 안된 경우에는?

Connect 버튼을 통해 Web 기반을 통해 사용 가능.

아래 명령어로 key 저장 위치를 편한곳으로 이동하는걸 권장!

C:\Users\kitri>move Downloads\mykey.pem .ssh/id_rsa

⚠️ 환경에 따라 경로 작성 시 \ / 구분 잘할것!

ubuntu 서버에서의 .ssh/authorized_keys 의 공개키와

로컬의 .ssh/id_rsa 의 개인키 를 혼동하지 말자! (RSA 는 키 생성 암호화 알고리즘 기법)

SSH 접속용 공개키/개인키 쌍을 생성

ssh-keygen -t rsa

 

ubuntu@ip-172-31-38-103:~$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys
ubuntu@ip-172-31-38-103:~$ ssh 3.36.132.123
💡

짝궁이 내 계정에 접속 한다면?

  1. 짝궁에게 public ip 를 알려주고
  2. 짝궁의 public key 를 받아야 함.
  3. .ssh/authorized_keys에 등록
  4. 접속상황 파악

.ssh/의 id_rsa.pub 은 공개키. id_ras는 개인키.

이후 본인 서버 재접속 후 authorized_keys 수정 (상대의 키를 삭제)

이미 접속해 있는 유저를 쫓아내진 않음…

안 나가고 버틴다면..? 서버 재 부팅 → 접속 못함 ㅋㅅㅋ

cd (enter) : 홈 디렉터리로 이동 = ~ (TILDE, 틸더)

cat ~/.ssh/id_rsa.pub 가능.

리눅스에서 . 은 ? 숨김 파일 ! → .ssh

경로상의 . 은 현재 폴더

..은 상위 폴더

가장 앞의 . ? permission 없어도 실행

. ./../.a/a.sh

# chmod를 사용하지 않았으나 실행됨.

pwd 현재 경로 출력

Elastic IP address (EIP)

Allocate 후 IP 클릭. Actions → Associate Elastic IP address를 통해 EC2와 연동

 

⇒ 이제 껐다 켜도 IP 주소 바뀌지 않음.

단 인스턴스 꺼져 있으면 하루에 1.2$정도 과금.

⚠️ Public IP 는 고객이 접근하는 End Point 로 사용하자 !!

🎶 alt + 클릭 대신 ctrl+alt+방향표 로도 동시 커서 가능

 ctrl+f 로 검색후 alt + enter시 해당 위치들 다중 선택!! (*정규표현식도 지원)

IAM (Identity and Access Management)

AWS 리소스에 대한 접근을 제어하는 서비스로, 사용자의 권한을 관리

AWS 계정을 안전하게 보호하고, 최소 권한 원칙을 적용하여 보안 강화

사용자마다 필요에 맞는 권한을 설정

  1. IAM 콘솔 접속
  2. Add User
  3. Attach existing policies directly → AdministratorAccess, PowerUserAccess
    위 2개 설정시 거의 최고 권한. (하위 권한 모두 사용 가능)
  4. 생성된 USER → Security credentials → Create Access key →
    CLI 선택 → create access key → ID (Access key) , PW(Secret Key) 생성 (csv다운)
  • AWS STS(Security Token Service)를 통해 발급되는 IAM 인증 토큰을 통해 API 호출시 사용자 인증
  • 각 IAM 사용자에게 API 호출을 허용’제한하는 정책 설정

MFA 설정 및 보안 관리

멀티 팩터 인증(MFA)

  • AWS 계정에 대한 이중 보안 설정
  • 계정 접근 시 비밀번호 외에 추가 인증이 필요하여 보안성 강화

Terraform (인프라스트럭처 코드 관리 도구)

인프라 스트럭처를 코드로 관리할 수 있는 오픈 소스 도구

클라우드 환경의 리소스를 코드 기반으로 생성 수정 삭제 가능

IaC (Infrastructure as Code) 中 1 :시스템을 수동이 아닌 스크립트를 통해 인프라를 구성

주요 기능

  • 프로비저닝 : 클라우드 리소스를 자동으로 설정하고 배포
  • 상태 파일 관리 : 현재 인프라의 상태를 파일로 관리하여 추적 가능
💡

사내망에서 쓸때는 extension도 반입해야 하지만,

서버의 ~/.vscode도 반입 필요

버전도 맞아야 함.

💡

Ansible, Chef, Puppet, Saltstack과의 차이점?

위 도구들은 소프트웨어 설치 및 구성 자동화에 중점 (운영용)

ex) 특정 상태에서 Machine을 지정된 상태로 유지

반면, Terraform은 인프라 자체의 프로비저닝을 자동화.

🎶 ctrl + ` : terminal 열기

⚠️ Infra 관리는 그 파급효과가 크기에 부가가치가 크다.

과거 Hypervisor Cloud → SRE Cloud 로의 전환 (Terraform/ansible/jenkins..)

“죽지 않는 것이 중요!”

SRE : Site Reliability Engineering

소프트웨어 엔지니어링의 원리를 시스템 운영에 적용하는 것

테라폼 실습

Step1. AWS Instance를 생성합니다.

  • 단, 이미 인스턴스를 제공 받았을 경우 제공 받은 인스턴스를 사용하고 이하 모든 Step을 생략 합니다.
  • host명은 i1으로 합니다.
  • Zone은 상관없으며, Ubuntu 18.04이상 OS와 인스턴스 타입 t2.micro에서도 작동합니다. 단, 권장사항은 Ubuntu 22.04이며 인스턴스 타입이 t2.small 이며, Main Disk도 40G 입니다. private키 이름은 i1Key로 합니다.
  • Security Group Setting
    • Inbound : 22, 9411,8081

Step2. Repoitory Update

  • 필수 아님 : 단, http://mirrors.kernel.org/ubuntu/ 상태 이상할때(apt install명령이 잘 안될때) 실행
REPO_LINE="deb <http://mirror.kakao.com/ubuntu/> noble main universe"
if ! grep -Fxq "$REPO_LINE" /etc/apt/sources.list; then
  echo "$REPO_LINE" | sudo tee -a /etc/apt/sources.list
  echo "Repository line added successfully."
else
  echo "Repository line already exists."
fi
sudo apt-get update

Step3. Install Terraform And Ansible

  • 아래 스크립트를 실행합니다. python3.12가 아닐 경우임.
sudo -i bash -c 'curl <https://raw.githubusercontent.com/Finfra/aws/refs/heads/main/part1.AwsBasic/1.4.1.terraformInstall/installOnEc2.sh|bash>'
  • apt update가 python version을 3.12로 올린 경우 아래 스크립트 실행.
  • python3.12가 설치되어 있을때는 아래 스크립트를 실행합니다.
sudo -i bash -c 'curl <https://raw.githubusercontent.com/Finfra/aws/refs/heads/main/part1.AwsBasic/1.4.1.terraformInstall/installOnEc2_p3.12.sh> | bash'

Step4. 설치 확인

terraform -version
ansible --version

 

🎶 ssh i1으로 host명이 i1으로 보이도록 변경.


Day2

Putty 접속

putty를 통한 ssh 접속 → pem이 아닌 ppk가 필요함

PuTTYGen 실행해서 기존 pem을 ppk로 전환

ssh 세션 만들기 - auth :credential → ppk 추가. Data → ubuntu (host명) 추가. 후 저장.

💡 putty를 왜 쓰는가?  log setting이 가능

 

putty로 접속 완료한 화면

🎶motd: message of today demon 터미널창 위에 나오는 부분

 sudo rm/etc/update-motd.d/*로 안보이게 설정 가능

한명 한명 authorized_ 에 공개키를 저장하기엔 너무 오래 걸림

→ terraform 을 활용한 자동화

Kubernetes install with kubespray

su - ubuntu

echo '
export TF_VAR_AWS_ACCESS_KEY="AKIA5QBECZPHDHF5OKCI" 
export TF_VAR_AWS_SECRET_KEY="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"
export TF_VAR_AWS_REGION="ap-northeast-2"
'>> ~/.bashrc # 로그인 시 자동 실행되는 파일. bash run commands
. ~/.bashrc

🎶 Bash, OS Shell의 특징

+없이 문자열 더하기 가능!

숫자 더하기를 하고 싶다면

echo $((x+y))와 같이 !

cd 명령어 입력시 항상 홈으로

OS Key가 없다면, 생성

ssh-keygen -f ~/.ssh/id_rsa -N ''

Terrafrom으로 host 셋팅

cd
git clone https://github.com/Finfra/aws
cd ~/aws/part1.AwsBasic/1.4.2.HostProvisioning/
terraform init
terraform apply --auto-approve

 

자동으로 instance들이 생성된 모습

기존 EC2 서버에서 새롭게 만들어진 ec2에 ssh명령어로 접속해보면…?

접속 성공 !! 왜.. 될까..?

기존서버(i1)의 키를 등록해둬서! 각각의 서버에서 .ssh/authorized_keys를 확인해보면 동일한 값이 있는걸 확인해볼 수 있다.

apply 시 terraform.tfstate 파일 자동 생성됨 → 인프라의 현재 상태를 추적하는 JSON 파일

terraform show # 현재 상태 확인 
cat terraform.tstate # 동일

이전 terraform list 까지 모두 저장하려면? S3 버킷에 저장하는것을 권장.

이제 terraform 내부 코드를 살펴보자.

instance.tf

resource "aws_key_pair" "prj_key" {
  key_name   = "prj_key"
  public_key = file(var.PATH_TO_PUBLIC_KEY)
  lifecycle {
    ignore_changes = [tags]
  }
}

resource "aws_instance" "vm0" {
  count         = var.instance_count
  ami           = lookup(var.AMIS, var.AWS_REGION)
  instance_type = var.instance_type
  key_name      = aws_key_pair.prj_key.key_name
  vpc_security_group_ids = [aws_security_group.allow-ssh.id]
  root_block_device{
    volume_size   = 100
  }

  provisioner "file" {
    source      = "script.sh"
    destination = "/tmp/script.sh"
  }
  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/script.sh",
      "sudo /tmp/script.sh"
    ]
  }
  connection {
    host        = coalesce(self.public_ip, self.private_ip)
    user        = var.INSTANCE_USERNAME
    private_key = file(var.PATH_TO_PRIVATE_KEY)
  }

  tags = {
    Name = format("vm0%d", count.index + 1)
  }
}

vars.tf

variable "AWS_ACCESS_KEY" {}
variable "AWS_SECRET_KEY" {}
variable "AWS_REGION" {
  default = "ap-northeast-2"
}

variable "PATH_TO_PRIVATE_KEY" {
  default = "~/.ssh/id_rsa"
}
variable "PATH_TO_PUBLIC_KEY" {
  default = "~/.ssh/id_rsa.pub"
}
variable "INSTANCE_USERNAME" {
  default = "ubuntu"
}

variable "AMIS" {
  default = {
    eu-west-1      = "ami-0a422d70f727fe93e"
    ap-northeast-2 = "ami-042e76978adeb8c48"
    us-east-1      = "ami-005fc0f236362e99f"
  }
} 

variable "instance_count" {
  default = "3"
}

variable "instance_type" {
  default = "t2.small"
}

aws cli

terraform과 동일. 단, aws 전용!

output format은 txt, table, json 상관 없음

host 목록 확인하기

aws ec2 describe-instances \
  --query "Reservations[*].Instances[*].{ID:InstanceId, Name:Tags[?Key=='Name']|[0].Value, State:State.Name, PublicIP:PublicIpAddress}" \
  --output table

 

eip 리스트 보기

aws ec2 describe-addresses \
  --query "Addresses[*].{PublicIP:PublicIp, InstanceID:InstanceId, AllocationID:AllocationId, Domain:Domain}" \
  --output table

 

❔ aws cli 명령어가 헷갈려 검색하고 싶다면?

aws help → /ec2 enter → n으로 눌러가며 검색 가능

aws ec2 help와 같은 방식도 가능

cli가 대량작업면에서는 gui보다 좋음.. 보다 전문적인 느낌. 거부감을 줄이자!

폴더 1000개 gui로 만들거 아니자나..

doSetHost.sh

#!/bin/bash
cat /etc/hosts |grep -v vm0>~/.tmp
sudo cp ~/.tmp /etc/hosts

ec2IdsAndName=$(aws ec2 describe-instances     --filters Name=instance-state-name,Values=running     --query 'Reservations[*].Instances[].[InstanceId, Tags[?Key==`Name`]]' --output text|sed -z  "s/\\nName[[:blank:]]/,/g")
for i in $ec2IdsAndName; do
      ec2id=$(echo $i|awk 'BEGIN{FS=","}{printf $1}')
      ec2Name=$(echo $i|awk 'BEGIN{FS=","}{printf $2}')
    ip=$(aws ec2 describe-instances --instance-ids $ec2id --query 'Reservations[*].Instances[*].PublicIpAddress' --output text)
    echo  $ip  $ec2Name
sudo bash -c "echo  $ip  $ec2Name  >> /etc/hosts"
done

echo "/etc/hosts------------"
cat /etc/hosts
echo "----------------------"

hostname 셋팅

public/private ip / public/private/ DNS 잘 구분할것.

Ansible

🎶 json과 달리 yaml은 주석 가능 및 가독성 좋음. 다만 어디서 끝나는지 모른다는 단점이 있음.
→ yaml은 로컬 세팅용. json은 웹서비스 데이터용으로 주로 사용.

json 구문에서 json path로 원하는 값을 뽑아낼 수 있다.

aws ec2 describe-instance 에서 원하는 값을 찾아가기..

https://jsonpath.com/

cli에서 해당 path를 통해 접근 가능. (요즘은 gpt에게 물어봐서 경로 얻기도 가능..)

왜 Ansible 이야기 하다 말고 json 이야기만 하지..?

yaml파일을 잘 만들면 Ansible이 공짜다..!

  • Inventory : 어디에서 실행할 것인가
  • module : 무엇을 실행할 것인가
  • playbook : 어덯게 실행할 것인가

Ansible command (엔서블 실행 VM) → SSH Demon (엔서블 작업 대상)

!host2.txt에는 각 ec2 host명이 적혀있음. vm01,vm02,vm03

host2.txt에는 각 ec2 host명이 적혀있음. vm01,vm02,vm03

inventory : host2.txt

module : ping

playbook : 즉석 명령 (한줄). 보통 할 일이 많을 때 yaml에 저장해두고 사용.

!image.png

play-book 사용 예제

---
- name: Install jq on all services (Ubuntu 22)
  hosts: all
  become: true

  tasks:
    - name: Install jq
      apt:
        name: jq
        state: present
        update_cache: yes
💡

terraform을 통해 구축하고, ansible을 통해 관리하자!!

EBS (Elastic Block Store)

AWS에서 제공하는 블록 스토리지 서비스로, EC2 인스턴스에 연결하여 사용. (=디스크)

지속적인 데이터 저장이 필용한 애플리케이션에 적합

  • gp3 : 범용 SSD, 저렴하면서 고성능
  • io2 : 프로비저닝된 IOPS SSD, 고성능/고신뢰성
  • st1 : 처리량 최적화 HDD, 대용량 순차적 작업
  • sc1 : 콜드 HDD, 저렴한 비용으로 가끔 접근하는 데이터 저장

스냅샷을 통해 EBS 볼륨의 현재 상태를 백업하여 저장 가능.

Volume 생성 및 EC2 연동

  1. EC2 Console → Create Volume
  2. Availability Zone을 EC2 instance가 존재하는 곳으로 설정!! + 크기’타입.. 설정
  3. 생성된 볼륨에서 attach volume (컴퓨터에 하드 디스크 붙여야지!)
    df -h 로 확인 했을 때 나오는 /dev에 모든 장비 파일이 존재, (disk, keyboard..)
    /dev/xvdal5 가 존재하는 것을 확인 ? → 다음은 xvdbb로 설정

m으로 명령어를 확인 가능.

n을 입력해서 partition 생성 가능.

linux에서는 drive를 만드는게 아닌, 특정 폴더에 연결하는 방식으로 파티셔닝을 한다.

위 작업을 partitioning mount 라고 함.

sudo mkfs.ext4 /dev/xvdbb1

sudo mkdir /data1
sudo mount /dev/xvdbb1 /data1

df -h

#이후 아래 명령어를 통해 unmount 가능
sudo umount /data1

 # 재부팅해도 자동 마운트 하려면 아래 명령어 사용
 echo "/dev/xvdbb1 /data1 ext4 defaults 01" | sudo tee -a /etc/fstab

mount가 완료된것을 확인 가능.

⚠️ AWS KMS를 이용한 암호화 / IAM 정책을 통한 볼륨 접근 제어 로 보안성 강화

  • vpc.tf
더보기
  • # Internet VPC resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" instance_tenancy = "default" enable_dns_support = "true" enable_dns_hostnames = "true" tags = { Name = "main" } } # Subnets resource "aws_subnet" "main-public-1" { vpc_id = aws_vpc.main.id cidr_block = "10.0.1.0/24" map_public_ip_on_launch = "true" availability_zone = "ap-northeast-2a" tags = { Name = "main-public-1" } } resource "aws_subnet" "main-public-2" { vpc_id = aws_vpc.main.id cidr_block = "10.0.2.0/24" map_public_ip_on_launch = "true" availability_zone = "ap-northeast-2b" tags = { Name = "main-public-2" } } resource "aws_subnet" "main-public-3" { vpc_id = aws_vpc.main.id cidr_block = "10.0.3.0/24" map_public_ip_on_launch = "true" availability_zone = "ap-northeast-2c" tags = { Name = "main-public-3" } } resource "aws_subnet" "main-private-1" { vpc_id = aws_vpc.main.id cidr_block = "10.0.4.0/24" map_public_ip_on_launch = "false" availability_zone = "ap-northeast-2a" tags = { Name = "main-private-1" } } resource "aws_subnet" "main-private-2" { vpc_id = aws_vpc.main.id cidr_block = "10.0.5.0/24" map_public_ip_on_launch = "false" availability_zone = "ap-northeast-2b" tags = { Name = "main-private-2" } } resource "aws_subnet" "main-private-3" { vpc_id = aws_vpc.main.id cidr_block = "10.0.6.0/24" map_public_ip_on_launch = "false" availability_zone = "ap-northeast-2c" tags = { Name = "main-private-3" } } # Internet GW resource "aws_internet_gateway" "main-gw" { vpc_id = aws_vpc.main.id tags = { Name = "main" } } # route tables resource "aws_route_table" "main-public" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.main-gw.id } tags = { Name = "main-public-1" } } # route associations public resource "aws_route_table_association" "main-public-1-a" { subnet_id = aws_subnet.main-public-1.id route_table_id = aws_route_table.main-public.id } resource "aws_route_table_association" "main-public-2-a" { subnet_id = aws_subnet.main-public-2.id route_table_id = aws_route_table.main-public.id } resource "aws_route_table_association" "main-public-3-a" { subnet_id = aws_subnet.main-public-3.id route_table_id = aws_route_table.main-public.id }
terraform destroy -auto-approve # instance 삭제 후 실행.
aws ec2 delete-key-pair --key-name mykey2

terraform init
terraform aaply -auto-approve 

# 상황에 따라 cloud init 사용 가능

RDS

mysql 의 root와 같이 rds에서는 admin 계정이 존재.

EC2에 DB 설치하면 되잖아요?

백업은 어떻게? region이 달라지는 경우에 대해서는?

  • 자동 백업’복구 -수동 스냅샷 및 특정 시점 복구(PITR)도 가능
  • 고가용성 및 내구성 (멀티 AZ 지원)
  • 자동 스케일링

ERD 그려보기

GPT 통해서 간단한 ERD 받은 후 아래 사이트에 코드를 넣어 ERD 시각화 가능

 

 

Online FlowChart & Diagrams Editor - Mermaid Live Editor

 

mermaid.live

 

 

⚠️RDS 인스턴스를 VPC 내부에 배치하거나 IAM을 통해 DB 작업 권한을 세부화, 데이터 암호화 및 SSL을 사용해 안전한 연결하여 보안 설정

💡

왜 VPC를 쓰는가?

HA를 위해 AZ를 설정해야 하기 위해.

성능 튜닝 및 모니터링

  • Performance Insights : DB 인스턴스의 성능 병목을 파악 및 문제 해결을 돕는 시각적 도구
  • CloudWatch : CPU 사용률, 메모리, 디스크 I/O등 주요 지표 모니터링
  • 인덱스 및 쿼리 최적화

스토리지 유형

  • GP2 /GP3 : 범용 SSD
  • IO1 / IO2 : 프로비저닝된 IOPS SSD, 고성능

+Amazon Aurora 경우 스토리지 자동 확장 기능 제공, 읽기 전용 복제본 추가 가능(읽기 성능 확장)

RDS 수동 세팅

  1. RDS 인스턴스 생성
  2. 엔진 옵션 설정
  3. 설정 정보 입력
  4. 인스턴스 구성
  5. 연결 설정
  6. 추가 구성
  7. 보안 그룹 설정 (3306 포트 뚫기)

  8. 연결 테스트

⚠️ -p 뒤에 비밀번호를 입력해서 명령어를 수행하면 history에 기록이 남음… 주의!

수동 스냅샷 생성

RDS Console → Snapshots → Take snapshot

자동 백업 설정 확인

RDS Console → Databases → 인스턴스 → Maintenance & backups

모니터링 설정 (CloudWatch 메트릭 확인)

  • Database Connections
  • CPU Utilization
  • Freeable Memory
  • ReadLatency / WriteLatency

파라미터 그룹 커스터마이징

-- 현재 설정 확인
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

-- 파라미터 그룹에서 수정 가능한 설정들:
-- max_connections: 최대 연결 수
-- innodb_buffer_pool_size: InnoDB 버퍼 풀 크기
-- slow_query_log: 슬로우 쿼리 로그 활성화

 

Terraform을 통한 RDS 세팅

  • main.tf
더보기
  • # --------------------------------------------------------------------------------------------------------------------- # DEPLOY INTO THE DEFAULT VPC AND SUBNETS # To keep this example simple, we are deploying into the Default VPC and its subnets. In real-world usage, you should # deploy into a custom VPC and private subnets. Given the subnet group needs to span multiple AZs and hence subnets we # have deployed it across all the subnets of the default VPC. # --------------------------------------------------------------------------------------------------------------------- data "aws_vpc" "default" { default = true } data "aws_subnets" "all" { filter { name = "vpc-id" values = [data.aws_vpc.default.id] } } # --------------------------------------------------------------------------------------------------------------------- # CREATE AN SUBNET GROUP ACROSS ALL THE SUBNETS OF THE DEFAULT ASG TO HOST THE RDS INSTANCE # --------------------------------------------------------------------------------------------------------------------- resource "aws_db_subnet_group" "example" { name = var.name # subnet_ids = [data.aws_subnet_ids.all.ids] subnet_ids = data.aws_subnets.all.ids # subnet_ids = ["${data.aws_subnet_ids.*.ids}"] tags = { Name = var.name } } # --------------------------------------------------------------------------------------------------------------------- # CREATE A CUSTOM PARAMETER GROUP AND AN OPTION GROUP FOR CONFIGURABILITY # --------------------------------------------------------------------------------------------------------------------- resource "aws_db_option_group" "example" { name = var.name engine_name = var.engine_name major_engine_version = var.major_engine_version tags = { Name = var.name } option { option_name = "MARIADB_AUDIT_PLUGIN" option_settings { name = "SERVER_AUDIT_EVENTS" value = "CONNECT" } } } resource "aws_db_parameter_group" "example" { name = var.name family = var.family tags = { Name = var.name } parameter { name = "general_log" value = "0" } } # --------------------------------------------------------------------------------------------------------------------- # CREATE A SECURITY GROUP TO ALLOW ACCESS TO THE RDS INSTANCE # --------------------------------------------------------------------------------------------------------------------- resource "aws_security_group" "db_instance" { name = var.name vpc_id = data.aws_vpc.default.id } resource "aws_security_group_rule" "allow_db_access" { type = "ingress" from_port = var.port to_port = var.port protocol = "tcp" security_group_id = aws_security_group.db_instance.id cidr_blocks = ["0.0.0.0/0"] } # --------------------------------------------------------------------------------------------------------------------- # CREATE THE DATABASE INSTANCE # --------------------------------------------------------------------------------------------------------------------- resource "aws_db_instance" "example" { identifier = var.name engine = var.engine_name engine_version = var.engine_version port = var.port db_name = var.database_name # 수정된 부분 username = var.username password = var.password instance_class = "db.t3.micro" allocated_storage = var.allocated_storage skip_final_snapshot = true license_model = var.license_model db_subnet_group_name = aws_db_subnet_group.example.id vpc_security_group_ids = [aws_security_group.db_instance.id] publicly_accessible = true parameter_group_name = aws_db_parameter_group.example.id option_group_name = aws_db_option_group.example.id tags = { Name = var.name } }

  • output.tf
  • output "subnet_ids" { value = data.aws_subnets.all.ids }
  • variables.tf
더보기
  • # --------------------------------------------------------------------------------------------------------------------- # ENVIRONMENT VARIABLES # Define these secrets as environment variables # --------------------------------------------------------------------------------------------------------------------- # AWS_ACCESS_KEY_ID # AWS_SECRET_ACCESS_KEY variable "AWS_ACCESS_KEY" {} variable "AWS_SECRET_KEY" {} variable "AWS_REGION" { default = "ap-northeast-2" } # --------------------------------------------------------------------------------------------------------------------- # REQUIRED PARAMETERS # You must provide a value for each of these parameters. # Given these are credentials, security of the values should be considered. # --------------------------------------------------------------------------------------------------------------------- variable "username" { default = "root" description = "Master username of the DB" } variable "password" { description = "Master password of the DB" } variable "database_name" { default = "mydb" description = "Name of the database to be created" } # --------------------------------------------------------------------------------------------------------------------- # OPTIONAL PARAMETERS # These parameters have reasonable defaults. # --------------------------------------------------------------------------------------------------------------------- variable "name" { description = "Name of the database" default = "terratest-example-nowage" } variable "engine_name" { description = "Name of the database engine" default = "mysql" } variable "family" { description = "Family of the database" default = "mysql8.0" } variable "port" { description = "Port which the database should run on" default = 3306 } variable "major_engine_version" { description = "MAJOR.MINOR version of the DB engine" default = "8.0" } variable "engine_version" { default = "8.0.33" description = "Version of the database to be launched" } variable "allocated_storage" { default = 5 description = "Disk space to be allocated to the DB instance" } variable "license_model" { default = "general-public-license" description = "License model of the DB instance" }
terraform init
terraform apply -auto-approve  -var password=Nowage12kitri

# 인스턴스 생성 확인
#sudo apt-get install -y mysql-client

cat terraform.tfstate |grep endpoint
mysql -uroot -h <url> -pNowage12kitri
  show databases;
  exit


terraform destroy -auto-approve -var password=Nowage12kitri

!image.png

🎶 mermaid live editor 에서 설계 document 잘 작성하면 도움이 됨!

최신 버전 : terraform, ansible, kubernetes 사용시 아래 참고

 

 

GitHub - Finfra/sreMsa

Contribute to Finfra/sreMsa development by creating an account on GitHub.

github.com

 

번외 - Vibe Coding

1세대 Tool : Cline

비용 : 종량제(API 사용량) / 정액제 (월 비용)

→ 바이브 코딩에서는 종량제가 유리 (정액제보다 응답 속도가 빠름)

vscode + cline 사용. (extension-cline설치, chat사용)

Cline 장점? 폐쇄망에서도 가능.

Day3

RDS 성능 모니터링 및 튜닝

  1. 데이터베이스 및 테이블 생성
-- 데이터베이스 생성
CREATE DATABASE IF NOT EXISTS db1;
USE db1;

-- 성능 테스트용 테이블 생성
CREATE TABLE t1 (
    id1 INT NOT NULL AUTO_INCREMENT,
    id2 VARCHAR(255),
    data_field VARCHAR(1000),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id1)
);
  1. 대량 데이터 생성
-- 초기 데이터 입력
INSERT INTO t1 (id2, data_field) VALUES ('data_1', 'Sample data content for testing');

-- 데이터 증배 (충분히 느려질 때까지 반복)
INSERT INTO t1 (id2, data_field)
SELECT CONCAT('data_', id1 + 1), CONCAT('Sample data content ', id1 + 1)
FROM t1;

-- 데이터 수 확인
SELECT COUNT(*) FROM t1;

-- 10만 건 이상 될 때까지 반복 실행
-- 또는 한 번에 더 많은 데이터 생성:
INSERT INTO t1 (id2, data_field)
SELECT
    CONCAT('data_', (@row_number:=@row_number+1)),
    CONCAT('Sample data content ', @row_number)
FROM
    (SELECT @row_number:=0) r
    CROSS JOIN (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1
    CROSS JOIN (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2
    CROSS JOIN (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3
    CROSS JOIN (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4;
  1. 인덱스 생성 전후 성능 비교
-- 인덱스 생성 전 쿼리 성능 테스트
EXPLAIN SELECT * FROM t1 WHERE id2 = 'data_1234';

-- 실행 시간 측정
SET profiling = 1;
SELECT * FROM t1 WHERE id2 = 'data_1234';
SHOW PROFILES;

-- 인덱스 생성
CREATE INDEX idx_id2 ON t1 (id2);

-- 인덱스 생성 후 성능 비교
EXPLAIN SELECT * FROM t1 WHERE id2 = 'data_1234';
SELECT * FROM t1 WHERE id2 = 'data_1234';
SHOW PROFILES;
  1. 쿼리 실행 계획 분석
-- EXPLAIN 결과 분석
EXPLAIN FORMAT=JSON SELECT * FROM t1 WHERE id2 LIKE 'data_1%';

-- 인덱스 사용 현황 확인
SHOW INDEX FROM t1;

-- 슬로우 쿼리 로그 활성화 (Parameter Group에서 설정)
-- slow_query_log = 1
-- long_query_time = 1

-- 쿼리 캐시 상태 확인
SHOW STATUS LIKE 'Qcache%';
  1. 성능 최적화 쿼리들
-- 복합 인덱스 생성
CREATE INDEX idx_composite ON t1 (id2, created_at);

-- 파티셔닝된 쿼리 테스트
SELECT COUNT(*) FROM t1 WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY);

-- 집계 쿼리 성능 테스트
SELECT
    DATE(created_at) as date,
    COUNT(*) as daily_count,
    AVG(LENGTH(data_field)) as avg_data_length
FROM t1
GROUP BY DATE(created_at)
ORDER BY date DESC;

-- JOIN 성능 테스트용 두 번째 테이블
CREATE TABLE t2 (
    id INT AUTO_INCREMENT PRIMARY KEY,
    t1_id INT,
    status VARCHAR(50),
    INDEX idx_t1_id (t1_id)
);

INSERT INTO t2 (t1_id, status)
SELECT id1, CASE WHEN id1 % 3 = 0 THEN 'active' WHEN id1 % 3 = 1 THEN 'inactive' ELSE 'pending' END
FROM t1 LIMIT 50000;

-- JOIN 쿼리 성능 측정
EXPLAIN SELECT t1.id2, t2.status
FROM t1
JOIN t2 ON t1.id1 = t2.t1_id
WHERE t2.status = 'active';
  1. CloudWatch 메트릭 모니터링
  • 주요 메트릭들:
    • DatabaseConnections: 현재 연결 수
    • CPUUtilization: CPU 사용률
    • FreeableMemory: 사용 가능한 메모리
    • ReadLatency/WriteLatency: 읽기/쓰기 지연시간
    • ReadThroughput/WriteThroughput: 읽기/쓰기 처리량
    • NetworkReceiveThroughput/NetworkTransmitThroughput: 네트워크 처리량
  1. Performance Insights 활용
  • RDS Console → Performance Insights 활성화
  • Top SQL 문 분석
  • Wait events 모니터링
  • Database load 확인
  1. 파라미터 그룹 최적화
-- 현재 설정 확인
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'query_cache_size';
SHOW VARIABLES LIKE 'tmp_table_size';

-- 권장 설정들 (Parameter Group에서 수정):
-- innodb_buffer_pool_size = (총 메모리의 70-80%)
-- max_connections = (적절한 연결 수, 기본값 조정)
-- query_cache_size = 0 (MySQL 8.0에서는 deprecated)
-- innodb_log_file_size = 256M (또는 더 큰 값)
  1. 성능 부하 테스트
# EC2에서 mysqlslap을 사용한 부하 테스트
mysqlslap --defaults-file=/etc/mysql/my.cnf \\
  --host=<RDS-Endpoint> \\
  --user=root \\
  --password=<password> \\
  --concurrency=50 \\
  --iterations=10 \\
  --number-int-cols=2 \\
  --number-char-cols=3 \\
  --auto-generate-sql

# sysbench를 사용한 더 정교한 테스트
sudo apt install sysbench
sysbench oltp_read_write \\
  --mysql-host=<RDS-Endpoint> \\
  --mysql-user=root \\
  --mysql-password=<password> \\
  --mysql-db=db1 \\
  --tables=10 \\
  --table-size=100000 \\
  prepare

sysbench oltp_read_write \\
  --mysql-host=<RDS-Endpoint> \\
  --mysql-user=root \\
  --mysql-password=<password> \\
  --mysql-db=db1 \\
  --tables=10 \\
  --table-size=100000 \\
  --threads=16 \\
  --time=300 \\
  run

성능 최적화 체크리스트

인덱스 최적화

  • 자주 사용되는 WHERE 절 컬럼에 인덱스 생성
  • 복합 인덱스 순서 최적화 (선택도가 높은 컬럼을 앞에)
  • 사용하지 않는 인덱스 제거

쿼리 최적화

  • SELECT * 대신 필요한 컬럼만 선택
  • LIMIT 사용으로 결과 제한
  • 적절한 JOIN 타입 선택
  • 서브쿼리 대신 JOIN 사용 검토

설정 최적화

  • innodb_buffer_pool_size: 메모리의 70-80%
  • max_connections: 적절한 연결 수 설정
  • innodb_log_file_size: 충분한 로그 파일 크기

문제 진단 및 해결

느린 쿼리 식별

-- 슬로우 쿼리 로그 확인
SHOW PROCESSLIST;

-- 실행 중인 쿼리 확인
SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 5;

-- 테이블 잠금 확인
SHOW OPEN TABLES WHERE In_use > 0;

인덱스 사용률 분석

-- 인덱스 카디널리티 확인
SELECT
    TABLE_NAME,
    INDEX_NAME,
    CARDINALITY,
    SUB_PART,
    PACKED,
    NULLABLE,
    INDEX_TYPE
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'db1';

-- 사용되지 않는 인덱스 찾기
SELECT
    s.schema_name,
    s.table_name,
    s.index_name
FROM sys.schema_unused_indexes s;

주의사항

  • 운영 환경에서는 부하 테스트 전 백업 필수
  • 파라미터 변경 시 인스턴스 재시작 필요할 수 있음
  • 인덱스 생성은 테이블 크기에 따라 시간이 오래 걸릴 수 있음
  • Performance Insights는 추가 비용 발생 가능
  • 부하 테스트 시 RDS 인스턴스 성능에 영향 줄 수 있음

성능 모니터링 대시보드 설정

-- 실시간 성능 모니터링 쿼리
SELECT
    CONCAT(ROUND(timer_wait/1000000000000,6), ' s') as duration,
    sql_text,
    current_schema
FROM performance_schema.events_statements_history_long
WHERE timer_wait > 1000000000000
ORDER BY timer_wait DESC
LIMIT 10;

-- 테이블별 I/O 통계
SELECT
    object_schema,
    object_name,
    count_read,
    count_write,
    count_fetch,
    count_insert,
    count_update,
    count_delete
FROM performance_schema.table_io_waits_summary_by_table
WHERE object_schema = 'db1'
ORDER BY count_read + count_write DESC;

알람 설정

  • CloudWatch에서 다음 메트릭에 대한 알람 생성:
    • CPUUtilization > 80%
    • DatabaseConnections > 80% of max_connections
    • FreeableMemory < 100MB
    • ReadLatency > 200ms
    • WriteLatency > 200ms

백업 및 복구 전략

# 논리적 백업 (mysqldump)
mysqldump -h <RDS-Endpoint> -u root -p \\
  --single-transaction \\
  --routines \\
  --triggers \\
  db1 > db1_backup.sql

# 백업 복원
mysql -h <RDS-Endpoint> -u root -p db1 < db1_backup.sql

다음 단계

  • Multi-AZ 배포로 고가용성 구성
  • 읽기 전용 복제본으로 읽기 성능 향상
  • Aurora로 마이그레이션 검토
  • 데이터베이스 프록시 활용
  • 파티셔닝 전략 수립

Lambda (서버리스 컴퓨팅 서비스)

map reduce 와 같은 병렬/분산 처리에서 합치는 연산 = lambda

reduce,map,lambda와 같은 Functional Programming을 잘 알아야함. (병렬처리)

>>> l1=[1,22,333]
>>> list(map(lambda x : x*2 , l1))
[2, 44, 666]
>>> def m2(su):
...     return su*2
...
>>> list(map(lambda x : m2(x) , l1))
[2, 44, 666]
>>>
>>> from functools import reduce
>>> reduce(lambda a,b : a+b, l1)
356
>>> def sum(a,b):
...     return a+b
...
>>> reduce(lambda a,b : sum(a,b), l1)
356
>>> reduce(lambda a,b : sum(a,b), map(lambda x : m2(x) , l1))
712
>>>

Lambda 사용 과정

  1. 코드 업로드
  2. 이벤트 트리거 (S3)
  3. 함수 실행 및 스케일링, CloudWatch 로그를 통한 모니터링
  4. 종료 및 과금 (실행 및 호출 횟수에 비례)

개발자가 서버를 관리할 필요없이, 이벤트 기반 코드(함수)실행되며, AWS가 환경을 제공하고 관리.

💡

1년에 한번 돌아가야 하는 코드가 있다면… ? 서버를 계속 켜두긴 아까워!

이럴 때 서버리스 활용!!

🎶실제로 많이 쓰이진 않음…

  1. Lambda 함수 생성 및 코드 작성

  • lambda code
더보기
  • import json import urllib.parse def lambda_handler(event, context): print("Lambda function started") records = event.get('Records', []) processed_files = [] for record in records: bucket_name = record['s3']['bucket']['name'] object_key = urllib.parse.unquote_plus( record['s3']['object']['key'], encoding='utf-8' ) object_size = record['s3']['object']['size'] print(f"Processing file: {object_key}") print(f"Bucket: {bucket_name}, Size: {object_size} bytes") # 파일 타입별 처리 if object_key.endswith(('.jpg', '.png')): print("Image file detected - processing...") elif object_key.endswith('.txt'): print("Text file detected - processing...") # 처리된 파일명을 리스트에 추가 processed_files.append(object_key) return { 'statusCode': 200, 'body': json.dumps({ 'message': 'S3 Event Processed Successfully!!', 'processed_files_count': len(records), 'processed_files': processed_files }) }
  1. 테스트 이벤트 구성

s3-put Template 사용

Test 실행 및 결과 확인

  1. S3 버킷 생성 및 이벤트 알림 설정
  • region마다 unique 해야함.
  • 업로드/다운로드에 비용 발생. 유지로는 비용 X

이벤트 알림 설정

  • Properties 탭 > Event notifications
  • "Create event notification" 클릭
    • Event name: S3UploadTrigger
    • Prefix: uploads/ (선택사항)
    • Suffix: .jpg (선택사항)
    • Event types:
      • s3:ObjectCreated:Put
      • s3:ObjectCreated:Post
    • Destination: Lambda function
    • Lambda function: processS3Event

⚠️버킷 제거시에는 내용을 모두 비운 후 bucket 삭제 가능

권한 설정 확인 및 테스트

jpg 파일 하나 upload한게 정상적으로 모니터링 됨을 확인

View CloudWatch logs를 통해 보다 자세한 로그 확인 가능

API Gateway (API 관리 서비스)7

RESTful API, WebSocket API를 생성하고 관리하는 서비스

Labmda와 통합해 서버리스 백엔드 구축 시 사용

서버리스 애플리케이션의 진입점 역할 수행

REST API

요청/응답 기반의 비동기 통신

CRUD 작업에 적합

WebSocket API

양방향 실시간 통신이 필요한 경우 사용

실시간 알림, 채팅등에 적합

연결 상태를 유지

  1. API 정의 및 리소스 추가
  2. 백엔드 리소스 통합
  3. 배포 스테이지 설정

EKS (Elastic Kubernetes Service)

AWS + Kubernetes = EKS

Iaas → VM

⚠️VM 의 문제점? 무거운 guest OS

Paas → Container (시뮬레이션)

K8s란 ? docker cluster 플랫폼 (Docker container orchestration 툴)

docker 3개를 설치하는 것과 K8s를 사용하는것의 차이점은?

→ Load balancing가능, container 배포’복구… etc 가능

💡

강사님의 면접 질문

  1. Markdown 써봤냐
  2. Git을 사용하냐
  3. docker를 사용하냐

Docker 와 EC2 Port 연결 및 실행

컨테이너에 port forwading해주는것? service

-v : volume

 

간단한 도커 실습…

ubuntu@i1:~$ docker run -d -p 80:80 -v ~/html:/usr/share/nginx/html --name n1 nginx  

ubuntu@i1:~$ echo "<h1>hi</hi>" > ~/html/index.html 

 

 

 

 

 

EC2 Public IP 주소에 접속하면
왼쪽과 같이 확인해볼 수 있다.

 

 

K8s 구조

  • Container
    Docker에서 사용하던것과 동일
  • Pod
    Container 묶음
  • Controller
    Pod 관리

❕Docker에서 각 container에 이름을 붙이는 것과 달리, K8s에서 Pod에 대해 별도 이름을 붙이진 않음 (16진수 숫자값 사용)

Ansible 기반 Kubespray 작동

terraform으로 진행. 구현하기에 복잡하기 때문에 codex cli / gemini cli 사용 권장.

npm install -g @google/gemini-cli
cd
git clone -b release-2.25 https://github.com/kubernetes-sigs/kubespray

kuberspray playbook 설치

 

https://kubernetes.io/ko/docs/concepts/overview/

https://kubernetes.io/ko/docs/tutorials/kubernetes-basics/

한국어 번역이 잘 되어있으니 꼭 읽어볼것.

접속 및 테스트 ssh vm01sudo -ikubectl get no
k8s deploy 테스트 kubectl create deployment --image=httpd --port=80 h1kubectl get all
kubectl alias [ ! $(cat ~/.bashrc
k8s service kubectl expose deployment h1 --type="NodePort" --port 80
k8s scale k scale deployment h1 --replicas=3k get po

k8s 객체

Short name Full name 설명
po pods 컨테이너의 기본 실행 단위
svc services Pod 그룹에 접근할 수 있는 안정적인 진입점
deploy deployments 애플리케이션의 상태를 관리하고 업데이트/롤백을 제어
no nodes 클러스터의 실제 물리/가상 서버
ns namespaces 클러스터 내의 논리적인 격리 영역
cm configmaps 설정 데이터를 저장하는 객체
pvc persistentvolumeclaims Pod가 사용할 스토리지 요청

Helm Chart

kubernetes 패키지 관리를 도와줌 (npm이나 pip같은 역할)

  • Chart : Helm 패키지의 기본 단위, k8s 리소스의 템플릿 포함
  • Repository : 차트를 저장하고 공유하는 장소
  • Release : 차트를 설치한 인스턴스, 고유한 이름과 설정을 가지며 동일 차트를 여러번 설치하여 여러 릴리즈를 만들 수 있음

Helm Chart 구성요소 및 장점

  • Chart.yaml : 차트 정보와 의존성 정의
  • values.yaml : 기본값 설정 파일
  • templates/ : Kubernetes 리소스 템플릿 디렉토리

→ 복잡한 배포 작업 자동화, 배포 이력 관리, 설정 일관성 유지

CodeDeploy (애플리케이션 배포 서비스)

ELK (Elasticsearch, Logstash, Kibana 스택)

위 2개는 시간 관계상 진행 못함.. ㅠㅠ

저작자표시 비영리 변경금지 (새창열림)

'AWS' 카테고리의 다른 글

[AWS] S3 알아보기  (0) 2026.04.15
[AWS] AWS EC2 복습  (0) 2026.02.09
'AWS' 카테고리의 다른 글
  • [AWS] S3 알아보기
  • [AWS] AWS EC2 복습
co-yong
co-yong
co-yong 님의 블로그 입니다.
  • co-yong
    co-yong 님의 블로그
    co-yong
  • 전체
    오늘
    어제
    • 분류 전체보기 (92)
      • Data Engineer (31)
      • AWS (3)
      • Docker (2)
      • CS (1)
      • AI (15)
      • 논문리뷰 (4)
      • Data analysis (2)
      • 기타 (2)
      • Git (3)
      • algorithm (5)
      • Front End (19)
      • 회고 (5)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    FRONT
    WithClaude
    코테공부
    Git
    코딩테스트
    인턴
    GRU
    AWS
    Node-red
    코드트리
    iceberg
    모던 리액트 deep dive
    de
    react
    DVC
    udemy
    github
    InfluxDB
    LSTM
    AI
  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
co-yong
AWS Basic / Terraform & Ansible / Lambda, EKS
상단으로

티스토리툴바