AWS CloudFormation은 Amazon Web Services에서 제공하는 인프라 관리 도구로, 코드로 인프라를 정의하고 관리할 수 있게 해준다.
클라우드 환경에서 서버, 데이터베이스, 네트워크 등 다양한 AWS 리소스를 효율적으로 프로비저닝하고 관리할 수 있도록 도와준다.
Git, Subversion(SVN) 등 선택한 버전 제어 시스템을 사용하여 CloudFormation 템플릿을 관리할 수 있다.
JSON 또는 YAML 템플릿 파일에서 전체 애플리케이션 스택(애플리케이션에 필요한 모든 리소스)을 정의한다.
출처: Architecting on AWS 7.7.6 (KO): Student Guide
단일 단위로 관리되는 AWS 리소스 모음이다.
스택을 통해 여러 리소스를 한꺼번에 생성, 업데이트, 삭제할 수 있어, 복잡한 인프라 설정을 쉽고 일관되게 관리할 수 있다.
출처: Architecting on AWS 7.7.6 (KO): Student Guide
CloudFormation을 사용하면 각 계층을 개별 템플릿이나 모듈로 관리할 수 있다.
각 계층의 리소스가 독립적으로 관리되고, 필요할 때 특정 계층만 업데이트할 수 있다.
예를 들어, 네트워크 계층(VPC, 서브넷 등)은 한 템플릿으로 정의하고, 애플리케이션 계층(EC2 인스턴스, 로드 밸런서 등)은 다른 템플릿으로 관리할 수 있다.
sgingressSshcidr
AWS CloudFormation 템플릿에서 보안 그룹(Security Group)의 SSH(포트 22) 인바운드 규칙을 정의할 때 사용되는 매개변수(Parameter)이다. 이 매개변수는 특정 CIDR 블록을 지정하여 SSH 트래픽을 허용할 IP 범위를 정의한다. 여기서는 자신의 IP 주소/32로 설정해준다.
나머지는 기본 설정으로 진행한다.
출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟
출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟
myeks-host라는 EC2 인스턴스는 EKS 관리 용도의 인스턴스로 Bastion Host 역할을 수행한다. 즉 myeks-host에 접근하여 EKS 관리 작업을 수행한다.
- Bastion Host
보안 목적으로 사용되는 특별한 유형의 서버로, 민감한 내부 네트워크에 위치한 다른 서버들에 접근하기 위한 게이트웨이 역할을 한다.
보안 그룹은 위에서 설정한 대로 각자의 PC만 접근이 가능하도록 설정되어 있다.
cf. 인터넷 게이트웨이
퍼블릭 서브넷의 리소스가 인터넷과 양방향으로 통신할 수 있도록 한다.
cf. NAT 게이트웨이
프라이빗 서브넷의 리소스가 인터넷에 나가는 트래픽을 처리하되, 외부에서 해당 리소스로 직접 접근할 수는 없다.
putty를 사용하여 myeks-host EC2에 접속하여 다음 명령어들을 실행한다.
whoami
명령어를 통해 root 사용자임을 확인한다.기본 설치 도구 확인
# kubectl 버전 확인
kubectl version --client=true -o yaml | yh
# eksctl 버전 확인
eksctl version
# awscli 버전 확인
aws --version
# 도커 정보 확인
docker info | yh
awscli 사용을 위한 IAM 자격 증명
aws configure
명령어를 통해 IAM 사용자의 액세스 키들을 참고하여 자격 증명을 설정해준다. 그래야 awscli 사용이 가능하다.
EKS 배포할 VPC 정보 확인
# CLUSTER_NAME 변수 확인
echo $CLUSTER_NAME
# EKS를 배포할 myeks-VPC 정보 확인
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq
# EKS를 배포할 myeks-VPC ID 값만 확인
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId
EKS 배포할 VPC ID 변수 저장
# VPCID 변수에 myeks-VPC ID 값을 저장
export VPCID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId)
# VPCID를 전역 변수로 선언
echo "export VPCID=$VPCID" >> /etc/profile
# VPCID 변수 호출
echo $VPCID
EKS를 배포할 VPC의 서브넷 정보 확인
# EKS를 배포할 VPC의 전체 서브넷 정보 확인
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output json | jq
# EKS를 배포할 VPC의 퍼블릭 서브넷 정보 확인
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" | jq
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" | jq
# EKS를 배포할 VPC의 퍼블릭 서브넷 ID 값만 확인
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text
EKS를 배포할 퍼블릭 서브넷 ID 변수 저장
// 변수에 퍼블릭 서브넷 ID 값을 저장
export PubSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text)
export PubSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text)
// 퍼블릭 서브넷 ID를 전역 변수로 선언
echo "export PubSubnet1=$PubSubnet1" >> /etc/profile
echo "export PubSubnet2=$PubSubnet2" >> /etc/profile
// VPCID 변수 호출
echo $PubSubnet1
echo $PubSubnet2