- 목차 -
1. 자리이동
2. 초기 환경 세팅
http://mirror.kakao.com/centos/7.9.2009/isos/x86_64/ 에서 iso 파일 다운로드
https://www.virtualbox.org/wiki/Download_Old_Builds_6_1 에서 VirtualBox 다운로드
CentOS7 스펙
가상 머신 이름 : CentOS7MINI
CPU : 2C
RAM : 4GB
SSD : 128GB
IMG : CentOS7 mini
NET : Bridge
네스티드 VT-x/AMD-V 사용하기 : 중첩된 가상화 옵션 체크
옵션 세팅이 끝나면 가상 머신을 시작해서 설치 진행
3. 서버 설정
MobaXterm 설치하고 접속하기
https://mobaxterm.mobatek.net/download-home-edition.html
vi /etc/selinux/config 들어가서 disabled 시키기
# yum update -y
# poweroff
현재 환경설정하고 패키지를 깔고 업데이트하고한 가상머신을 스냅샷찍고 이미지(ova)로 떠서 도커나 쿠버네티스에 활용
이미지가 잘 떠졌다. D드라이브로 이동시키기
Teraform 개념
- 코드(스크립트)를 작성 및 실행하여 인프라를 생성, 배포, 수정, 정리하는 것을 말한다
- 이는 서버를 물리적으로 설치하는 등의 하드웨어 측면을 포함하여 운영의 모든 측면을 소프트웨어적으로 생각하는 중대한 사고 전환을 보여준다
- 코드형 인프라의 핵심은 서버, 데이터베이스, 네트워크, 로그 파일, 애플리케이션 구성, 문서, 자동화된 테스트, 배포 프로세스 등 거의 모든 것을 코드(스크립트)로 관리할 수 있다
- 코드형 인프라 도구로는 애드혹 스크립트, 구성 관리 도구, 서버 템플릿 도구, 오케스트레이션 도구, 프로비전 도구가 있다.
4.
1. 애드혹 스크립트
- 수행할 작업을 단계별로 나누고 배시(Bash)와 같은 언어를 사용하여 각 단계를 코드로 정의하고 작성된 스크립트를 서버에서 수동으로 실행하는 것
- 코드를 직접 작성하여 매번 수동으로 맞춤 코드를 작성해야 되기 때문에 간단한 설치에 적합
#!/bin/bash
yum install -y httpd
systemctl enable -now httpd
echo "Hello World" > /var/www/html/index.htmI
2. 구성 관리 도구(Configuration)
- 셰프, 퍼핏, 앤서블, 솔트스택 등은 모두 구성 관리 도구로써 대상 서버에 소프트 웨어를 설치하고 관리하도록 설계되어 있다. ※ 셰프와 퍼핏은 AWS내에 솔루션으로 있다
- 배시 스크립트와 비슷해 보이지만 애드혹 스크립트를 사용할 때와 다른 여러 가지 장점이 있다.
1) 코딩 규칙
- 구성 관리 도구는 문서화, 파일 레이아웃, 명확하게 이름 붙여진 매개 변수, 시크릿 관리 등을 포함하는 코딩 큐칙으로 일관되고 예측 가능한 구조를 제공한다.
2) 멱등성
- 구성 관리 도구는 실행 횟수에 관계없이 설정 파일을 사용하여 소프트웨어가 설치되지 않았을 경우에만 설치하고 소프트웨어가 동작하자 않는 경우에만 동작하도록 한다.
- 한 번 수행이 된 명령or설치는 skip함으로써 서버 부하를 없앤다
3) 분산형 구조
- 에드혹 스크립트는 단일 로컬 머신에서만 실행되도록 설계되어 있지만 앤서블과 같은 구성 관리 도구는 원격의 수많은 서버를 관리하기 위해 특별히 설계된 것
- 관리가 필요한 서버들의 IP를 정리한 hosts 파일을 생성하고 플레이북(스크립트를 정리한 파일)을 정의하여 실행
3. 서버 템플릿 도구
- 운영체제, 소프트웨어, 파일 및 기타 필요한 모든 내용을 포함하고 있는 스냅샷으로 이미지를 생성하여 모든 서버에 이미지를 설치할 수 있다.
- 도커, 패커, 베이그런트와 같은 서버 템플릿 도구는 여러 서버를 시작하고 각각 동일한 코드를 실행하여 서버를 구성하는 기존 방식과 다름
- 실행은 서버에 이미지를 배포하고 할 수 있다.
4. 오케스트레이션 도구
- 서버 템플릿 도구는 VM이나 컨테이너를 생성하기에 좋은 도구이지만 관리 부분이 부족하기 때문에 오케스트레이션 도구가 필요
- 오케스트레이션 도구는 VM 과 컨테이너 배포, 효율적 업데이트 및 롤백, 자동 복구(치유), 자동 확장(조정), 로드밸런싱, 서로 식별하고 통신할 수 있게 서비스 검색 기능을 제공합니다.
- 쿠버네티스를 사용하면 도커 컨테이너를 어떻게 관리할지를 코드로 정의할 수 있습니다.
- 오케스트레이션 도구의 종류로는 온-프렘에서 클러스터를 구축할 수 있는 쿠버네티스, 마라톤/메소스,도커 스웜, 노마드 등이 있으며 퍼블릭 클라우드에서는 AWS EKS, Azure AKS, GCP GKE가 있다
5. 프로비전 도구
- 구성 관리, 서버 템플릿 및 오케스트레이션 도구가 각 서버에서 실행되는 코드를 정의한다면 테라폼, AWS CloudFormation, 오픈스택 히트와 같은 프로비전 도구는 서버 자체를 생성한다
- 테라폼이 AWS, GCP, Azure에 API로 사용할 수 있어서 많이 사용한다
- 서버 생성만 하는 것이 아니라 사실상 설정도 하고 있어서 인프라에 관한 거의 모든 부분을 프로비저닝할 수 있다.
5. 테라폼 장점
IaC(코드형 인프라) 장점
- 수동으로 코드를 변환하지 않아도 되므로 소프트웨어를 효율적으로 배포할 수 있다.
- laC(코드형 인프라)는 데브옵스의 일종으로 이를 도입한 조직은 배포 횟수를 200배 늘렸고 오류를 24배 빠르게 개선하며 배포 시간을 2,555배 줄였다.
1. 자급식 배포
- 마법의 명령어_를 알고 있는 소수의 시스템 관리자만 프로덕션 환경에 접속하여 배포를 진행해 왔다. 하지만 인프라를 코드로 정의하면 전체 배포 프로세스를 자동화할 수 있으며 개발자도 필요할 때마다 자체적으로 배포를 진행할 수 있다.
2. 속도와 안정성
- 배포 프로세스를 자동화하면 사람이 진행하는 것보다 훨씬 빠르게 컴퓨터가 배포를 진행할 수 있습니다.
- 자동화된 프로세스는 일관되고 반복 가능하며 수동으로 진행했을 때보다 오류(휴먼 에러, 버전 문제)가 적게 발생하기 때문에 더 안전합니다.
3. 문서화
- 시스템 관리자뿐만 아니라 누구나 읽을 수 있는 소스 파일로 인프라 상태를 나타낼 수 있다.
- 즉 모든 사람이 인프라 구조를 이해하고 업무를 볼 수 있도록 해준다.
4. 버전 관리
- 가장 큰 기능 : 롤백.
- 인프라의 변경 내용이 모두 기록된 코드형 인프라 소스 파일을 저장할 수 있으므로 버전을 쉽게 관리할 수 있다.
- 스템에 문제가 생겼을 때 문제가 발생한 지점을 찾기가 수월하다.
- 문제의 내용을 확인한 다음 문제가 없던 이전 코드로 다시 되돌리면 문제가 해결된다.
5. 유효성 검증
- 인프라 상태가 코드로 정의되어 있으면 코드가 변경될 때마다 검증을 수행하고 일련의 자동화된 테스트를 실행할 수 있다.
6. 재사용성
- 인프라를 재사용 가능한 모듈로 패키징할 수 있으므로 모든 제품을 매번 처음부터 배포하는 대신 문서화되고 검증된 모듈로 일관되게 배포할 수 있다.
테라폼이란?
- Hashi Corp Terraform은 버전을 지정하고 재사용하고 공유할 수 있는 사람이 읽을 수 있는 구성 파일에서 클라우드 및 온프레미스(오픈스택) 리소스를 모두 정의할 수 있는 코드형 인프라 도구
- 그런 다음 일관된 워크플로를 사용하여 수명 주기 동안 모든 인프라를 프로비저님하고 관리할 수 있다
- Terraform은 컴퓨팅, 스토리지 및 네트워킹 리소스와 같은 하위 수준 구성 요소는 물론 DNS 항목 및 SaaS 기능과 같은 상위 수준 구성 요소를 관리할 수 있다
테라폼 작동 방식
- Terraform은 API(응용 프로그래밍 인터페이스)를 통해 클라우드 플랫폼 및 기타 서비스에서 리소스를 생성하고 관리한다.
- 제공자를 통해 Terraform은 액세스 가능한 API를 통해 거의 모든 플랫폼 또는 서비스와 함께 작동할 수 있다.
- 핵심 Terraform 워크플로는 세 단계로 구성된다
- 쓰기(스크립트 작성)
여러 클라우드 공급자 및 서비스에 걸쳐 있을 수 있는 리소스를 정의한다.
예를 들어 보안 그룹 및 로드 밸런서가 있는 Virtual Private Cloud(VPC) 네트워크의 가상 머신에 애플리케이션을 배포하기 위한 구성을 생성할 수 있다. - 계획
Terraform은 기존 인프라 및 구성을 기반으로 생성, 업데이트 또는 destroy(삭제)할 인프라를 설명하는 실행 계획을 생성한다. - 적용
승인 시 Terraform은 리소스 종속성을 고려하여 제안된 작업을 올바른 순서로 수행한다
예를 들어 VPC의 속성을 업데이트하고 해당 VPC의 가상 머신 수를 변경하면 Terraform은 가상 머신을 확장하기 전에 VPC를 다시 생성한다.
- 쓰기(스크립트 작성)
Virtual Box 가상머신 이름 변경 'CentOS7MINI -> Infra as Code'
전원켜기
MobaXterm SSH 접속
AWS CLI 설치
# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
# yum install -y unzip wget bash-completion mysql git
# unzip awscliv2.zip
# ./aws/install // install 파일 실행해서 aws cli 설치
# echo "complete -C '/usr/local/bin/aws_completer' aws" >> .bash_profile // 자동 완성 기능. 시스템이 껐다 켜져도 자동완성 기능이 실행되도록 .bash_profile에 >>를 통해 입력
# exit
# aws --version // 버전 확인
# aws s3 ls // 자격증명이 되어있는지 확인. 아직 안되어있음
6. IAM 유저 만들기
IAM 유저 만들기
사용자 이름 'peach'
AWS Management Consel 옵션 체크하지 않기. CLI로 작업할 사용자임
권한 옵션 '직접 정책 연결'
권한 정책 'admin' 검색 - 정책 'AdministratorAccess' 선택
계정은 만들었지만 키가 없다. 키를 만들어준다
보안 자격 증명 - '액세스 키 만들기'
'Command Line Interface(CLI)' 선택
액세스 키와 비밀 액세스 키가 나온다. 굳이 csv 파일로 다운받을 필요없다
# aws configure
Access Key ID 붙여넣기
Secret Access Key 붙여넣기
리전 : ap-northeast-2
Output 파일 형식 : json
1. CLI로 VPC와 서브넷 만들기
VPC 생성
# aws ec2 create-vpc --cidr-block 192.168.0.0/16 --tag-specification "ResourceType=vpc,Tags=[{Key=Name,Value=test-vpc}]" --output text // vpc를 192.168.0./16 대역으로 태그 정해서 생성하는 명령
# test_vpc=vpc-07d8d90020796e1ef // 생성하면서 나온 VPC ID를 변수에 입력
# echo $test_vpc // 변수 출력해보기
서브넷 8개 생성
# aws ec2 create-subnet --vpc-id $test_vpc --cidr-block 192.168.0.0/20 --availability-zone ap-northeast-2a --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=test-pub-2a}]" // 생성한 VPC에서 서브넷 IP 대역, 가용 영역, 태그 정해서 서브넷 생성
# aws ec2 create-subnet --vpc-id $test_vpc --cidr-block 192.168.16.0/20 --availability-zone ap-northeast-2b --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=test-pub-2b}]"
# aws ec2 create-subnet --vpc-id $test_vpc --cidr-block 192.168.32.0/20 --availability-zone ap-northeast-2c --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=test-pub-2c}]"
# aws ec2 create-subnet --vpc-id $test_vpc --cidr-block 192.168.48.0/20 --availability-zone ap-northeast-2d --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=test-pub-2d}]"
# aws ec2 create-subnet --vpc-id $test_vpc --cidr-block 192.168.64.0/20 --availability-zone ap-northeast-2a --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=test-pvt-2a}]"
# aws ec2 create-subnet --vpc-id $test_vpc --cidr-block 192.168.80.0/20 --availability-zone ap-northeast-2b --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=test-pvt-2b}]"
# aws ec2 create-subnet --vpc-id $test_vpc --cidr-block 192.168.96.0/20 --availability-zone ap-northeast-2c --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=test-pvt-2c}]"
# aws ec2 create-subnet --vpc-id $test_vpc --cidr-block 192.168.112.0/20 --availability-zone ap-northeast-2d --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=test-pvt-2d}]"
# aws ec2 describe-subnets --filters "Name=vpc-id,Values=$test_vpc" --query 'Subnets[*].{AZ:AvailabilityZone,CIDR:CidrBlock,SUBNET:Tags[0].Value}'
생성한 서브넷을 조건에 따라 조회
# aws ec2 describe-subnets --filters "Name=vpc-id,Values=$test_vpc" --query 'Subnets[*].{AZ:AvailabilityZone,CIDR:CidrBlock,SUBNET:Tags[0].Value}' --output table // VPC ID로 서브넷을 조회. 테이블 형식으로 나온다
7. 인터넷 게이트웨이 생성, 라우팅 테이블 설정
2. 인터넷 게이트웨이 생성, 라우팅 테이블 설정
서브넷을 생성만 했다. 인터넷 게이트웨이 만들고 라우팅 테이블로 라우팅 설정을 해줘야 함
인터넷 게이트웨이 생성
# aws ec2 create-internet-gateway --tag-specification "ResourceType=internet-gateway,Tags=[{Key=Name,Value=test-igw}]" --output text // 인터넷 게이트웨이 생성되면서 IGW ID가 나온다
# test_igw=igw-010aa36df6a9ec0bf // IGW ID 변수에 담아주기
# aws ec2 attach-internet-gateway --vpc-id $test_vpc --internet-gateway-id $test_igw // VPC에 IGW 붙이기
# aws ec2 describe-internet-gateways --filters "Name=internet-gateway-id,Values=$test_igw" --output table // IGW ID로 검색. JSON 형식으로 출력된다
라우팅 테이블에 인터넷 게이트웨이 설정
# aws ec2 describe-route-tables --filter "Name=vpc-id,Values=$test_vpc" // VPC ID로 라우팅 테이블 조회. 조회하면 라우팅 테이블 ID가 나온다
# test_pub_rtb=rtb-0b3db4c6b059d4454 // 변수에 라우팅 테이블 ID를 넣어준다
# aws ec2 create-route --route-table-id $test_pub_rtb --destination-cidr-block 0.0.0.0/0 --gateway-id $test_igw // 목적지가 anywhere(0.0.0.0/0)인 모든 IP는 인터넷 게이트웨이를 next-hop(target)으로 설정
# aws ec2 create-tags --resources $test_pub_rtb --tags "Key=Name,Value=test-pub-rtb"
# aws ec2 describe-route-tables --route-table-id $test_pub_rtb --output table // 라우팅 테이블 조회. 경로가 잘 설정됨
퍼블릭 라우팅 테이블 설정
# aws ec2 describe-subnets --filters "Name=vpc-id,Values=$test_vpc" --query 'Subnets[*].{ID:SubnetId,CIDR:CidrBlock,TAGS:Tags[0].Value} // VPC 안에 있는 서브넷 []배열, {}조건을 줘서 검색. 생성했던 8개의 서브넷이 출력되고 ID가 나온다.
# test_pub_2a=subnet-053dd745340ebec11 // 퍼블릭 ID를 변수에 담아주기
# test_pub_2b=subnet-0ed356236dd0f2df8
# test_pub_2c=subnet-01a7b0ff5fe63c144
# test_pub_2d=subnet-070066862e63bebed
# test_pvt_2a=subnet-0a05d63198c81b80f
# test_pvt_2b=subnet-0b5be4fdfb1c7ebe0
# test_pvt_2c=subnet-076b961bcda995842
# test_pvt_2d=subnet-019f8edc436fd0ed2
# aws ec2 associate-route-table --subnet-id $test_pub_2a --route-table-id $test_pub_rtb // 퍼블릭 서브넷과 퍼블릭 라우팅 테이블을 명시적으로 연결
# aws ec2 associate-route-table --subnet-id $test_pub_2b --route-table-id $test_pub_rtb
# aws ec2 associate-route-table --subnet-id $test_pub_2c --route-table-id $test_pub_rtb
# aws ec2 associate-route-table --subnet-id $test_pub_2d --route-table-id $test_pub_rtb
# aws ec2 modify-subnet-attribute --subnet-id $test_pub_2a --map-public-ip-on-launch // 퍼블릭 IP 부여 활성화 명령
# aws ec2 modify-subnet-attribute --subnet-id $test_pub_2b --map-public-ip-on-launch
# aws ec2 modify-subnet-attribute --subnet-id $test_pub_2c --map-public-ip-on-launch
# aws ec2 modify-subnet-attribute --subnet-id $test_pub_2d --map-public-ip-on-launch
프라이빗 라우팅 테이블 만들기
# aws ec2 create-route-table --vpc-id $test_vpc // 프라이빗 라우팅 테이블 만들기
# test_pvt_rtb=rtb-076c84a3fc3e96c72 // 변수에 담기
# aws ec2 create-tags --resources $test_pvt_rtb --tags "Key=Name,Value=test-pvt-rtb" // 프라이빗 라우팅 테이블 태그 달기
# aws ec2 associate-route-table --subnet-id $test_pvt_2a --route-table-id $test_pvt_rtb // 프라이빗 서브넷과 프라이빗 라우팅 테이블 명시적으로 연결
# aws ec2 associate-route-table --subnet-id $test_pvt_2b --route-table-id $test_pvt_rtb
# aws ec2 associate-route-table --subnet-id $test_pvt_2c --route-table-id $test_pvt_rtb
# aws ec2 associate-route-table --subnet-id $test_pvt_2d --route-table-id $test_pvt_rtb
# aws ec2 modify-vpc-attribute --vpc-id $test_vpc --enable-dns-hostnames // VPC에서 시작된 인스턴스가 DNS 호스트 이름을 가져오는지 여부를 나타낸다. 활성화된 경우 VPC의 인스턴스는 DNS 호스트 이름을 가져온다
3. 키페어, 보안그룹 만들기
키페어 생성
# aws ec2 create-key-pair --key-name test-key --query 'KeyMaterial' --output text > test-key.pem // test-key로 퍼블릭, 프라이빗 키를 생성하고 KeyMaterial 조건으로 조회한 것을 text로 출력해서 프라이빗 키로 만드는 명령
# ls // test-key.pem이 생성됨
# chmod 400 test-key.pem // 퍼미션 변경
# cat test-key.pem // PRIVATE KEY인 것을 확인할 수 있음
보안그룹 생성
# aws ec2 create-security-group --group-name test-sg-web --description "Security group for HTTP_SSH access" --vpc-id $test_vpc --tag-specification "ResourceType=security-group,Tags=[{Key=Name,Value=test-sg-web}]"
// VPC에 test-sg-web 이름의 보안 그룹 생성. 설명과 태그도 달아줌. 보안 그룹 ID가 나온다
# test_sg_web=sg-05e02f7b5f4fcedc1 // 보안 그룹 ID 변수에 넣어주기
# aws ec2 authorize-security-group-ingress --group-id $test_web_sg --protocol tcp --port 22 --cidr 0.0.0.0/0 // 인바운드 규칙 생성.
# aws ec2 authorize-security-group-ingress --group-id $test_web_sg --protocol tcp --port 80 --cidr 0.0.0.0/0
# aws ec2 authorize-security-group-ingress --group-id $test_web_sg --protocol icmp --port -1 --cidr 0.0.0.0/0 // ICMP는 포트 개념이 없기 때문에 '-1'로 해준다
# aws ec2 describe-security-groups --group-id $test_web_sg
// # aws ec2 describe-security-groups --group-id $test_web_sg --output table JSON 형식으로 보기 힘든 경우 테이블로 출력
8. 볼륨 및 인스턴스 만들기, 생성한 것들 지우기
4. 볼륨 및 인스턴스 만들기
# vi mapping.json // 볼륨 설정 파일 생성. 루트 볼륨과 추가 볼륨을 생성한다
[
{
"DeviceName": "/dev/xvda",
"Ebs": {
"VolumeSize": 8
}
},
{
"DeviceName": "/dev/xvdb",
"Ebs": {
"VolumeSize": 8
}
}
]
# vi my_script.txt // 사용자 데이터 파일 생성. 웹페이지를 띄우는 명령
#!/bin/bash
yum install -y httpd
systemctl enable --now httpd
echo "<h1>Hello AWS CLI</h1>" > /var/www/html/index.html
인스턴스 만들기
// Amazon Linux 2 AMI (HVM)의 ID - ami-035da6a0773842f64
// 인스턴스 개수, 인스턴스 유형, 키, 보안그룹, 가용영역, 볼륨, 사용자데이터, 태그 설정
# aws ec2 run-instances \
--image-id ami-035da6a0773842f64 \
--count 1 \
--instance-type t2.micro \
--key-name test-key \
--security-group-ids $test_web_sg \
--subnet-id $test_pub_2a \
--block-device-mappings file://mapping.json \
--user-data file://my_script.txt \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=test-web}]' 'ResourceType=volume,Tags=[{Key=Name,Value=test-root}]'
# test_iid=i-06dfb56ce5b0f4600
# aws ec2 describe-instances --instance-id $test_iid | grep PublicIp // 인스턴스 퍼블릭 IP 확인하기
# ssh -i "test-key.pem" ec2-user@13.125.226.100 // 키를 이용해서 인스턴스 접속
# curl 13.125.226.100
콘솔에서 확인하기
추가 볼륨 태그를 입력해주지 않아서 둘 다 루트 볼륨 태그 'test-root'로 생성되었다
# lsblk // 현재 xvdb가 자동으로 마운트가 되어있지 않다. 수동으로 마운트시켜줘야함
# sudo mkfs -t xfs /dev/xvdb
# sudo mount /dev/xvdb /mnt
# df -h // 잘 마운트되었다
5. 정리
$ exit // 인스턴스에서 나와서 root 에서 작업
# aws ec2 terminate-instances --instance-id $test_iid
# aws ec2 describe-security-groups --group-id $test_sg_web
# aws ec2 delete-subnet --subnet-id $test_pub_2a
# aws ec2 delete-subnet --subnet-id $test_pub_2b
# aws ec2 delete-subnet --subnet-id $test_pub_2c
# aws ec2 delete-subnet --subnet-id $test_pub_2d
# aws ec2 delete-subnet --subnet-id $test_pvt_2a
# aws ec2 delete-subnet --subnet-id $test_pvt_2b
# aws ec2 delete-subnet --subnet-id $test_pvt_2c
# aws ec2 delete-subnet --subnet-id $test_pvt_2d
# aws ec2 detach-internet-gateway --internet-gateway-id $test_igw --vpc-id $test_vpc // VPC와 인터넷 게이트 분리
# aws ec2 delete-internet-gateway --internet-gateway-id $test_igw
# aws ec2 delete-route-table --route-table-id $test_pvt_rtb
# aws ec2 delete-route --route-table-id $test_pub_rtb --destination-cidr-block 0.0.0.0/0
# aws ec2 delete-vpc --vpc-id $test_vpc
댓글