AWSTemplateFormatVersion: '2010-09-09'
Description: CloudFormation template to create a VPC, Subnets, Internet Gateway, Route Tables, Security Group, and a configured EC2 instance.
Parameters:
ClusterBaseName:
Type: String
Description: The base name for the EKS cluster.
Default: myeks # 기본값 설정 (필요시 변경 가능)
LatestAmazonLinux2023AmiId:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64"
Description: "The latest Amazon Linux 2023 AMI ID from SSM Parameter Store"
Resources:
# VPC
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 192.168.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: myeks-VPC
# Public Subnets
MyPublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 192.168.1.0/24
AvailabilityZone: ap-northeast-3a
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: myeks-PublicSubnet1
MyPublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 192.168.2.0/24
AvailabilityZone: ap-northeast-3b
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: myeks-PublicSubnet2
MyPublicSubnet3:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 192.168.3.0/24
AvailabilityZone: ap-northeast-3c
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: myeks-PublicSubnet3
# Private Subnets
MyPrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 192.168.11.0/24
AvailabilityZone: ap-northeast-3a
Tags:
- Key: Name
Value: myeks-PrivateSubnet1
MyPrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 192.168.12.0/24
AvailabilityZone: ap-northeast-3b
Tags:
- Key: Name
Value: myeks-PrivateSubnet2
MyPrivateSubnet3:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
CidrBlock: 192.168.13.0/24
AvailabilityZone: ap-northeast-3c
Tags:
- Key: Name
Value: myeks-PrivateSubnet3
# Internet Gateway
MyInternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: myeks-IGW
MyVPCGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref MyVPC
InternetGatewayId: !Ref MyInternetGateway
# Route Tables for Public and Private Subnets
MyPublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: myeks-PublicSubnetRT
MyPrivateRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: myeks-PrivateSubnetRT
# Public Route for Internet Gateway
MyPublicRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref MyPublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref MyInternetGateway
# Associate Public Subnets with Public Route Table
PublicSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref MyPublicSubnet1
RouteTableId: !Ref MyPublicRouteTable
PublicSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref MyPublicSubnet2
RouteTableId: !Ref MyPublicRouteTable
PublicSubnet3RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref MyPublicSubnet3
RouteTableId: !Ref MyPublicRouteTable
# Associate Private Subnets with Private Route Table
PrivateSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref MyPrivateSubnet1
RouteTableId: !Ref MyPrivateRouteTable
PrivateSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref MyPrivateSubnet2
RouteTableId: !Ref MyPrivateRouteTable
PrivateSubnet3RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref MyPrivateSubnet3
RouteTableId: !Ref MyPrivateRouteTable
# Security Group for EC2
MySecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow SSH and other necessary traffic
VpcId: !Ref MyVPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: myeks-host-SG
# EC2 Instance
EC2Instance:
Type: AWS::EC2::Instance
Properties:
AvailabilityZone: ap-northeast-3a
InstanceType: t3.medium
ImageId: !Ref LatestAmazonLinux2023AmiId
KeyName: nana
Tags:
- Key: Name
Value: myeks-host
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: 0
SubnetId: !Ref MyPublicSubnet1
GroupSet:
- !Ref MySecurityGroup
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
hostnamectl --static set-hostname "myeks-bastion-EC2"
echo 'alias vi=vim' >> /etc/profile
echo "sudo su -" >> /home/ec2-user/.bashrc
cd /root
yum -y install tree jq git htop lynx
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
mv /tmp/eksctl /usr/local/bin
unzip awscliv2.zip >/dev/null 2>&1
sudo ./aws/install
complete -C '/usr/local/bin/aws_completer' aws
cho 'export AWS_PAGER=""' >>/etc/profile
export AWS_DEFAULT_REGION="ap-northeast-3"
echo "export AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION" >> /etc/profile
unzip yh-linux-amd64.zip
mv yh /usr/local/bin/
tar zxvf krew-linux_amd64.tar.gz
./krew-linux_amd64 install krew
export PATH="$PATH:/root/.krew/bin"
echo 'export PATH="$PATH:/root/.krew/bin"' >> /etc/profile
kubectl krew install ctx ns get-all df-pv # ktop mtail tree
echo 'source <(kubectl completion bash)' >> /etc/profile
echo 'alias k=kubectl' >> /etc/profile
echo 'complete -F __start_kubectl k' >> /etc/profile
cat <<"EOT" >> /root/.bash_profile
source /root/kube-ps1/kube-ps1.sh
KUBE_PS1_SYMBOL_ENABLE=false
function get_cluster_short() {
echo "$1" | cut -d . -f1
}
KUBE_PS1_CLUSTER_FUNCTION=get_cluster_short
KUBE_PS1_SUFFIX=') '
PS1='$(kube_ps1)'$PS1
EOT
yum install docker -y
systemctl start docker && systemctl enable docker
ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa
export AWS_ACCESS_KEY_ID="AKIAQXPZC24ZZP57O4J4"
export AWS_SECRET_ACCESS_KEY="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"
export AWS_DEFAULT_REGION="ap-northeast-3"
export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
echo "export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> /etc/profile
echo "export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> /etc/profile
echo "export AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION" >> /etc/profile
echo "export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)" >> /etc/profile
export CLUSTER_NAME="myeks"
echo "export CLUSTER_NAME=$CLUSTER_NAME" >> /etc/profile
export KUBERNETES_VERSION="1.27"
echo "export KUBERNETES_VERSION=$KUBERNETES_VERSION" >> /etc/profile
export VPCID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=myeks-VPC" | jq -r .Vpcs[].VpcId)
echo "export VPCID=$VPCID" >> /etc/profile
export PubSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="myeks-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text)
export PubSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="myeks-PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text)
export PubSubnet3=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="myeks-PublicSubnet3" --query "Subnets[0].[SubnetId]" --output text)
echo "export PubSubnet1=$PubSubnet1" >> /etc/profile
echo "export PubSubnet2=$PubSubnet2" >> /etc/profile
echo "export PubSubnet3=$PubSubnet3" >> /etc/profile
export PrivateSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="myeks-PrivateSubnet1" --query "Subnets[0].[SubnetId]" --output text)
export PrivateSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="myeks-PrivateSubnet2" --query "Subnets[0].[SubnetId]" --output text)
export PrivateSubnet3=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="myeks-PrivateSubnet3" --query "Subnets[0].[SubnetId]" --output text)
echo "export PrivateSubnet1=$PrivateSubnet1" >> /etc/profile
echo "export PrivateSubnet2=$PrivateSubnet2" >> /etc/profile
echo "export PrivateSubnet3=$PrivateSubnet3" >> /etc/profile
eksctl create cluster --name $CLUSTER_NAME --region=$AWS_DEFAULT_REGION --nodegroup-name=ng1 --node-type=t3.medium --nodes 3 --node-volume-size=30 --vpc-public-subnets "$PubSubnet1","$PubSubnet2","$PubSubnet3" --version 1.27 --ssh-access --ssh-public-key nana --with-oidc --external-dns-access --full-ecr-access --dry-run > myeks.yaml
sed -i 's/certManager: false/certManager: true/g' myeks.yaml
sed -i 's/ebs: false/ebs: true/g' myeks.yaml
cat <<EOT >> myeks.yaml
addons:
- name: vpc-cni # no version is specified so it deploys the default version
version: latest
attachPolicyARNs:
- arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
- name: kube-proxy
version: latest # auto discovers the latest available
- name: coredns
version: latest # v1.9.3-eksbuild.2
EOT
nohup eksctl create cluster -f myeks.yaml --verbose 4 --kubeconfig "/root/.kube/config" 1> /root/create-eks.log 2>&1 &
echo 'cloudinit End!'