mirror of
https://github.com/storytold/terraform-aws-observability-accelerator.git
synced 2026-10-09 00:09:43 +00:00
Add local example for empty EKS Cluster
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
# EKS Cluster Deployment with new VPC
|
||||
|
||||
Note: This example is a subset from [this EKS Blueprint example](https://github.com/aws-ia/terraform-aws-eks-blueprints/tree/main/examples/eks-cluster-with-new-vpc)
|
||||
|
||||
This example deploys the following Basic EKS Cluster with VPC
|
||||
|
||||
- Creates a new sample VPC, 3 Private Subnets and 3 Public Subnets
|
||||
- Creates Internet gateway for Public Subnets and NAT Gateway for Private Subnets
|
||||
- Creates EKS Cluster Control plane with one managed node group
|
||||
|
||||
## How to Deploy
|
||||
|
||||
### Prerequisites
|
||||
|
||||
Ensure that you have installed the following tools in your Mac or Windows Laptop before start working with this module and run Terraform Plan and Apply
|
||||
|
||||
1. [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)
|
||||
2. [Kubectl](https://Kubernetes.io/docs/tasks/tools/)
|
||||
3. [Terraform](https://learn.hashicorp.com/tutorials/terraform/install-cli)
|
||||
|
||||
### Minimum IAM Policy
|
||||
|
||||
> **Note**: The policy resource is set as `*` to allow all resources, this is not a recommended practice.
|
||||
|
||||
You can find the policy [here](min-iam-policy.json)
|
||||
|
||||
|
||||
### Deployment Steps
|
||||
|
||||
#### Step 1: Clone the repo using the command below
|
||||
|
||||
```sh
|
||||
git clone https://github.com/aws-observability/terraform-aws-observability-accelerator.git
|
||||
```
|
||||
|
||||
#### Step 2: Run Terraform INIT
|
||||
|
||||
Initialize a working directory with configuration files
|
||||
|
||||
```sh
|
||||
cd examples/eks-cluster-with-vpc/
|
||||
terraform init
|
||||
```
|
||||
|
||||
#### Step 3: Run Terraform PLAN
|
||||
|
||||
Verify the resources created by this execution
|
||||
|
||||
```sh
|
||||
export TF_VAR_aws_region=<ENTER YOUR REGION> # Select your own region
|
||||
terraform plan
|
||||
```
|
||||
|
||||
#### Step 4: Finally, Terraform APPLY
|
||||
|
||||
**Deploy the pattern**
|
||||
|
||||
```sh
|
||||
terraform apply
|
||||
```
|
||||
|
||||
Enter `yes` to apply.
|
||||
|
||||
### Configure `kubectl` and test cluster
|
||||
|
||||
EKS Cluster details can be extracted from terraform output or from AWS Console to get the name of cluster.
|
||||
This following command used to update the `kubeconfig` in your local machine where you run kubectl commands to interact with your EKS Cluster.
|
||||
|
||||
#### Step 5: Run `update-kubeconfig` command
|
||||
|
||||
`~/.kube/config` file gets updated with cluster details and certificate from the below command
|
||||
|
||||
aws eks --region <enter-your-region> update-kubeconfig --name <cluster-name>
|
||||
|
||||
#### Step 6: List all the worker nodes by running the command below
|
||||
|
||||
kubectl get nodes
|
||||
|
||||
#### Step 7: List all the pods running in `kube-system` namespace
|
||||
|
||||
kubectl get pods -n kube-system
|
||||
|
||||
## Cleanup
|
||||
|
||||
To clean up your environment, destroy the Terraform modules in reverse order.
|
||||
|
||||
Destroy the Kubernetes Add-ons, EKS cluster with Node groups and VPC
|
||||
|
||||
```sh
|
||||
terraform destroy -target="module.eks_blueprints_kubernetes_addons" -auto-approve
|
||||
terraform destroy -target="module.eks_blueprints" -auto-approve
|
||||
terraform destroy -target="module.vpc" -auto-approve
|
||||
```
|
||||
|
||||
Finally, destroy any additional resources that are not in the above modules
|
||||
|
||||
```sh
|
||||
terraform destroy -auto-approve
|
||||
```
|
||||
@@ -0,0 +1,119 @@
|
||||
provider "aws" {
|
||||
region = local.region
|
||||
}
|
||||
|
||||
provider "kubernetes" {
|
||||
host = module.eks_blueprints.eks_cluster_endpoint
|
||||
cluster_ca_certificate = base64decode(module.eks_blueprints.eks_cluster_certificate_authority_data)
|
||||
token = data.aws_eks_cluster_auth.this.token
|
||||
}
|
||||
|
||||
provider "helm" {
|
||||
kubernetes {
|
||||
host = module.eks_blueprints.eks_cluster_endpoint
|
||||
cluster_ca_certificate = base64decode(module.eks_blueprints.eks_cluster_certificate_authority_data)
|
||||
token = data.aws_eks_cluster_auth.this.token
|
||||
}
|
||||
}
|
||||
|
||||
data "aws_eks_cluster_auth" "this" {
|
||||
name = module.eks_blueprints.eks_cluster_id
|
||||
}
|
||||
|
||||
data "aws_availability_zones" "available" {}
|
||||
|
||||
locals {
|
||||
name = basename(path.cwd)
|
||||
cluster_name = coalesce(var.cluster_name, local.name)
|
||||
region = var.aws_region
|
||||
|
||||
vpc_cidr = "10.0.0.0/16"
|
||||
azs = slice(data.aws_availability_zones.available.names, 0, 3)
|
||||
|
||||
tags = {
|
||||
Blueprint = local.name
|
||||
GithubRepo = "github.com/aws-observability/terraform-aws-observability-accelerator"
|
||||
}
|
||||
}
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# EKS Blueprints
|
||||
#---------------------------------------------------------------
|
||||
|
||||
module "eks_blueprints" {
|
||||
source = "github.com/aws-ia/terraform-aws-eks-blueprints"
|
||||
|
||||
cluster_name = local.cluster_name
|
||||
cluster_version = "1.23"
|
||||
|
||||
vpc_id = module.vpc.vpc_id
|
||||
private_subnet_ids = module.vpc.private_subnets
|
||||
|
||||
managed_node_groups = {
|
||||
mg_5 = {
|
||||
node_group_name = "managed-ondemand"
|
||||
instance_types = ["m5.large"]
|
||||
min_size = 2
|
||||
subnet_ids = module.vpc.private_subnets
|
||||
}
|
||||
}
|
||||
|
||||
tags = local.tags
|
||||
}
|
||||
|
||||
module "eks_blueprints_kubernetes_addons" {
|
||||
source = "github.com/aws-ia/terraform-aws-eks-blueprints/modules/kubernetes-addons"
|
||||
|
||||
eks_cluster_id = module.eks_blueprints.eks_cluster_id
|
||||
eks_cluster_endpoint = module.eks_blueprints.eks_cluster_endpoint
|
||||
eks_oidc_provider = module.eks_blueprints.oidc_provider
|
||||
eks_cluster_version = module.eks_blueprints.eks_cluster_version
|
||||
|
||||
# EKS Managed Add-ons
|
||||
enable_amazon_eks_vpc_cni = true
|
||||
enable_amazon_eks_coredns = true
|
||||
enable_amazon_eks_kube_proxy = true
|
||||
enable_amazon_eks_aws_ebs_csi_driver = true
|
||||
|
||||
tags = local.tags
|
||||
}
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# Supporting Resources
|
||||
#---------------------------------------------------------------
|
||||
|
||||
module "vpc" {
|
||||
source = "terraform-aws-modules/vpc/aws"
|
||||
version = "~> 3.0"
|
||||
|
||||
name = local.name
|
||||
cidr = local.vpc_cidr
|
||||
|
||||
azs = local.azs
|
||||
public_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k)]
|
||||
private_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 10)]
|
||||
|
||||
enable_nat_gateway = true
|
||||
single_nat_gateway = true
|
||||
enable_dns_hostnames = true
|
||||
|
||||
# Manage so we can name
|
||||
manage_default_network_acl = true
|
||||
default_network_acl_tags = { Name = "${local.name}-default" }
|
||||
manage_default_route_table = true
|
||||
default_route_table_tags = { Name = "${local.name}-default" }
|
||||
manage_default_security_group = true
|
||||
default_security_group_tags = { Name = "${local.name}-default" }
|
||||
|
||||
public_subnet_tags = {
|
||||
"kubernetes.io/cluster/${local.cluster_name}" = "shared"
|
||||
"kubernetes.io/role/elb" = 1
|
||||
}
|
||||
|
||||
private_subnet_tags = {
|
||||
"kubernetes.io/cluster/${local.cluster_name}" = "shared"
|
||||
"kubernetes.io/role/internal-elb" = 1
|
||||
}
|
||||
|
||||
tags = local.tags
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": [
|
||||
"ec2:AllocateAddress",
|
||||
"ec2:AssociateRouteTable",
|
||||
"ec2:AttachInternetGateway",
|
||||
"ec2:AuthorizeSecurityGroupEgress",
|
||||
"ec2:AuthorizeSecurityGroupIngress",
|
||||
"ec2:CreateInternetGateway",
|
||||
"ec2:CreateNatGateway",
|
||||
"ec2:CreateNetworkAclEntry",
|
||||
"ec2:CreateRoute",
|
||||
"ec2:CreateRouteTable",
|
||||
"ec2:CreateSecurityGroup",
|
||||
"ec2:CreateSubnet",
|
||||
"ec2:CreateTags",
|
||||
"ec2:CreateVpc",
|
||||
"ec2:DeleteInternetGateway",
|
||||
"ec2:DeleteNatGateway",
|
||||
"ec2:DeleteNetworkAclEntry",
|
||||
"ec2:DeleteRoute",
|
||||
"ec2:DeleteRouteTable",
|
||||
"ec2:DeleteSecurityGroup",
|
||||
"ec2:DeleteSubnet",
|
||||
"ec2:DeleteTags",
|
||||
"ec2:DeleteVpc",
|
||||
"ec2:DescribeAccountAttributes",
|
||||
"ec2:DescribeAddresses",
|
||||
"ec2:DescribeAvailabilityZones",
|
||||
"ec2:DescribeInternetGateways",
|
||||
"ec2:DescribeNatGateways",
|
||||
"ec2:DescribeNetworkAcls",
|
||||
"ec2:DescribeNetworkInterfaces",
|
||||
"ec2:DescribeRouteTables",
|
||||
"ec2:DescribeSecurityGroups",
|
||||
"ec2:DescribeSubnets",
|
||||
"ec2:DescribeTags",
|
||||
"ec2:DescribeVpcAttribute",
|
||||
"ec2:DescribeVpcClassicLink",
|
||||
"ec2:DescribeVpcClassicLinkDnsSupport",
|
||||
"ec2:DescribeVpcs",
|
||||
"ec2:DetachInternetGateway",
|
||||
"ec2:DisassociateRouteTable",
|
||||
"ec2:ModifySubnetAttribute",
|
||||
"ec2:ModifyVpcAttribute",
|
||||
"ec2:ReleaseAddress",
|
||||
"ec2:RevokeSecurityGroupEgress",
|
||||
"ec2:RevokeSecurityGroupIngress",
|
||||
"eks:CreateAddon",
|
||||
"eks:CreateCluster",
|
||||
"eks:CreateNodegroup",
|
||||
"eks:DeleteAddon",
|
||||
"eks:DeleteCluster",
|
||||
"eks:DeleteNodegroup",
|
||||
"eks:DescribeAddon",
|
||||
"eks:DescribeAddonVersions",
|
||||
"eks:DescribeCluster",
|
||||
"eks:DescribeNodegroup",
|
||||
"iam:AddRoleToInstanceProfile",
|
||||
"iam:AttachRolePolicy",
|
||||
"iam:CreateInstanceProfile",
|
||||
"iam:CreateOpenIDConnectProvider",
|
||||
"iam:CreatePolicy",
|
||||
"iam:CreateRole",
|
||||
"iam:CreateServiceLinkedRole",
|
||||
"iam:DeleteInstanceProfile",
|
||||
"iam:DeleteOpenIDConnectProvider",
|
||||
"iam:DeletePolicy",
|
||||
"iam:DeleteRole",
|
||||
"iam:DetachRolePolicy",
|
||||
"iam:GetInstanceProfile",
|
||||
"iam:GetOpenIDConnectProvider",
|
||||
"iam:GetPolicy",
|
||||
"iam:GetPolicyVersion",
|
||||
"iam:GetRole",
|
||||
"iam:ListAttachedRolePolicies",
|
||||
"iam:ListInstanceProfilesForRole",
|
||||
"iam:ListPolicyVersions",
|
||||
"iam:ListRolePolicies",
|
||||
"iam:PassRole",
|
||||
"iam:RemoveRoleFromInstanceProfile",
|
||||
"iam:TagInstanceProfile",
|
||||
"kms:CreateAlias",
|
||||
"kms:CreateKey",
|
||||
"kms:DeleteAlias",
|
||||
"kms:DescribeKey",
|
||||
"kms:EnableKeyRotation",
|
||||
"kms:GetKeyPolicy",
|
||||
"kms:GetKeyRotationStatus",
|
||||
"kms:ListAliases",
|
||||
"kms:ListResourceTags",
|
||||
"kms:PutKeyPolicy",
|
||||
"kms:ScheduleKeyDeletion",
|
||||
"kms:TagResource",
|
||||
"s3:GetObject",
|
||||
"s3:ListBucket",
|
||||
"s3:PutObject"
|
||||
],
|
||||
"Resource": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
output "vpc_private_subnet_cidr" {
|
||||
description = "VPC private subnet CIDR"
|
||||
value = module.vpc.private_subnets_cidr_blocks
|
||||
}
|
||||
|
||||
output "vpc_public_subnet_cidr" {
|
||||
description = "VPC public subnet CIDR"
|
||||
value = module.vpc.public_subnets_cidr_blocks
|
||||
}
|
||||
|
||||
output "vpc_cidr" {
|
||||
description = "VPC CIDR"
|
||||
value = module.vpc.vpc_cidr_block
|
||||
}
|
||||
|
||||
output "eks_cluster_id" {
|
||||
description = "EKS cluster ID"
|
||||
value = module.eks_blueprints.eks_cluster_id
|
||||
}
|
||||
|
||||
output "eks_managed_nodegroups" {
|
||||
description = "EKS managed node groups"
|
||||
value = module.eks_blueprints.managed_node_groups
|
||||
}
|
||||
|
||||
output "eks_managed_nodegroup_ids" {
|
||||
description = "EKS managed node group ids"
|
||||
value = module.eks_blueprints.managed_node_groups_id
|
||||
}
|
||||
|
||||
output "eks_managed_nodegroup_arns" {
|
||||
description = "EKS managed node group arns"
|
||||
value = module.eks_blueprints.managed_node_group_arn
|
||||
}
|
||||
|
||||
output "eks_managed_nodegroup_role_name" {
|
||||
description = "EKS managed node group role name"
|
||||
value = module.eks_blueprints.managed_node_group_iam_role_names
|
||||
}
|
||||
|
||||
output "eks_managed_nodegroup_status" {
|
||||
description = "EKS managed node group status"
|
||||
value = module.eks_blueprints.managed_node_groups_status
|
||||
}
|
||||
|
||||
output "configure_kubectl" {
|
||||
description = "Configure kubectl: make sure you're logged in with the correct AWS profile and run the following command to update your kubeconfig"
|
||||
value = module.eks_blueprints.configure_kubectl
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
variable "cluster_name" {
|
||||
description = "Name of cluster - used by Terratest for e2e test automation"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
variable "aws_region" {
|
||||
description = "AWS Region"
|
||||
type = string
|
||||
}
|
||||
Reference in New Issue
Block a user