Playground / Terraform builder
Terraform builder
Pick AWS, Google Cloud, or Azure, set a cluster name, node count, and the provider-specific basics, and get working Terraform for a managed Kubernetes cluster -- raw resources, not a third-party module, so there’s nothing hidden in what actually gets created. See managed Kubernetes for what EKS, GKE, and AKS are each doing for you underneath this.
Provider
AWS
Generated main.tf
main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.0"
}
}
}
provider "aws" {
region = "us-east-1"
}
# EKS needs an existing VPC with subnets in at least two Availability
# Zones -- bring your own (a fresh VPC is a bigger piece of Terraform
# than fits here) by filling in these subnet IDs.
variable "subnet_ids" {
type = list(string)
default = ["subnet-aaaaaaaa", "subnet-bbbbbbbb"]
}
resource "aws_iam_role" "cluster" {
name = "my-cluster-cluster-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = { Service = "eks.amazonaws.com" }
}]
})
}
resource "aws_iam_role_policy_attachment" "cluster_policy" {
role = aws_iam_role.cluster.name
policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
}
resource "aws_eks_cluster" "this" {
name = "my-cluster"
role_arn = aws_iam_role.cluster.arn
vpc_config {
subnet_ids = var.subnet_ids
}
depends_on = [aws_iam_role_policy_attachment.cluster_policy]
}
resource "aws_iam_role" "node" {
name = "my-cluster-node-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = { Service = "ec2.amazonaws.com" }
}]
})
}
resource "aws_iam_role_policy_attachment" "node_worker" {
role = aws_iam_role.node.name
policy_arn = "arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy"
}
resource "aws_iam_role_policy_attachment" "node_cni" {
role = aws_iam_role.node.name
policy_arn = "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"
}
resource "aws_iam_role_policy_attachment" "node_ecr" {
role = aws_iam_role.node.name
policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"
}
resource "aws_eks_node_group" "default" {
cluster_name = aws_eks_cluster.this.name
node_group_name = "default"
node_role_arn = aws_iam_role.node.arn
subnet_ids = var.subnet_ids
instance_types = ["t3.medium"]
scaling_config {
desired_size = 3
min_size = 1
max_size = 5
}
depends_on = [
aws_iam_role_policy_attachment.node_worker,
aws_iam_role_policy_attachment.node_cni,
aws_iam_role_policy_attachment.node_ecr,
]
}
output "kubeconfig_command" {
value = "aws eks update-kubeconfig --region us-east-1 --name my-cluster"
}