This workflow automates the end-to-end setup of an Amazon EKS cluster using AWS CLI. It includes IAM role creation, VPC provisioning via CloudFormation, cluster deployment, and managed node group setup.
Step 1: IAM Role Creation
Create IAM Role for EKS Cluster
1
2
aws iam create-role --role-name "$CLUSTER_ROLE_NAME" \
--assume-role-policy-document file://"$CLUSTER_TRUST_FILE"
This role is assumed by the EKS control plane. The
AmazonEKSClusterPolicyis attached for required permissions.
Create IAM Role for Worker Nodes
1
2
aws iam create-role --role-name "$NODE_ROLE_NAME" \
--assume-role-policy-document file://"$NODE_TRUST_FILE"
This EC2-assumed role is used by the worker nodes. It includes:
AmazonEKSWorkerNodePolicyAmazonEC2ContainerRegistryReadOnlyAmazonEKS_CNI_Policy
The script checks if roles exist before creating them and stores their ARNs for later use.
Step 2: VPC Provisioning via CloudFormation
1
2
3
4
5
aws cloudformation create-stack \
--stack-name "$STACK_NAME" \
--region "$REGION" \
--template-url https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-06-10/amazon-eks-vpc-sample.yaml \
--capabilities CAPABILITY_IAM
A default VPC is created using the official EKS sample template if it doesn’t already exist. Subnet and security group IDs are extracted from the CloudFormation outputs.
Step 3: Create the EKS Cluster
1
2
3
4
5
6
aws eks create-cluster \
--name "$CLUSTER_NAME" \
--region "$REGION" \
--kubernetes-version "$K8S_VERSION" \
--role-arn "$CLUSTER_ROLE_ARN" \
--resources-vpc-config subnetIds=$SUBNET1,$SUBNET2,securityGroupIds=$SECURITY_GROUP_ID
The cluster is created in the VPC subnets with the specified IAM role. The script waits until the cluster status is
ACTIVE.
Step 4: Configure kubectl
1
aws eks update-kubeconfig --region "$REGION" --name "$CLUSTER_NAME"
This updates your kubeconfig so you can access the new cluster using
kubectl.
Step 5: Create a Managed Node Group
1
2
3
4
5
6
7
8
9
aws eks create-nodegroup \
--cluster-name "$CLUSTER_NAME" \
--region "$REGION" \
--nodegroup-name "$NODE_GROUP_NAME" \
--subnets "$SUBNET1" "$SUBNET2" \
--node-role "$NODE_ROLE_ARN" \
--scaling-config minSize=1,maxSize=4,desiredSize=$NODE_COUNT \
--instance-types "$NODE_TYPE" \
--ami-type AL2_x86_64
The node group is launched in the same subnets. The script waits until the group is fully active before proceeding.
Final Output
1
kubectl get nodes
Confirms that the EKS cluster is fully operational and displays the active nodes.