feat: Add support for EKS Auto Mode and EKS Hybrid nodes (#3225)

* feat: Add support for EKS hybrid nodes

* feat: Add support for EKS Auto Mode

* chore: Update test directory names

* chore: Clean up examples and tests

* fix: Clean up and last minute changes for GA

* chore: Formatting

* chore: Bump min required version for new features

* fix: Corrects from test/validation on existing clusters

* feat: Add policy for custom tags on EKS Auto Mode, validate examples

* chore: Expand on `CAM` acronym

* chore: Update README to match examples
This commit is contained in:
Bryant Biggs
2024-12-04 09:24:21 -06:00
committed by GitHub
parent 6866b40bec
commit 3b974d33ad
62 changed files with 3896 additions and 441 deletions

View File

@@ -0,0 +1,65 @@
# EKS Hybrid Node IAM Role
## Usage
To provision the provided configurations you need to execute:
```bash
$ terraform init
$ terraform plan
$ terraform apply --auto-approve
```
Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
<!-- BEGIN_TF_DOCS -->
## Requirements
| Name | Version |
|------|---------|
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.3.2 |
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 5.79 |
| <a name="requirement_tls"></a> [tls](#requirement\_tls) | >= 4.0 |
## Providers
| Name | Version |
|------|---------|
| <a name="provider_tls"></a> [tls](#provider\_tls) | >= 4.0 |
## Modules
| Name | Source | Version |
|------|--------|---------|
| <a name="module_disabled_eks_hybrid_node_role"></a> [disabled\_eks\_hybrid\_node\_role](#module\_disabled\_eks\_hybrid\_node\_role) | ../../modules/hybrid-node-role | n/a |
| <a name="module_eks_hybrid_node_role"></a> [eks\_hybrid\_node\_role](#module\_eks\_hybrid\_node\_role) | ../../modules/hybrid-node-role | n/a |
| <a name="module_ira_eks_hybrid_node_role"></a> [ira\_eks\_hybrid\_node\_role](#module\_ira\_eks\_hybrid\_node\_role) | ../../modules/hybrid-node-role | n/a |
## Resources
| Name | Type |
|------|------|
| [tls_private_key.example](https://registry.terraform.io/providers/hashicorp/tls/latest/docs/resources/private_key) | resource |
| [tls_self_signed_cert.example](https://registry.terraform.io/providers/hashicorp/tls/latest/docs/resources/self_signed_cert) | resource |
## Inputs
No inputs.
## Outputs
| Name | Description |
|------|-------------|
| <a name="output_arn"></a> [arn](#output\_arn) | The Amazon Resource Name (ARN) specifying the node IAM role |
| <a name="output_intermediate_role_arn"></a> [intermediate\_role\_arn](#output\_intermediate\_role\_arn) | The Amazon Resource Name (ARN) specifying the node IAM role |
| <a name="output_intermediate_role_name"></a> [intermediate\_role\_name](#output\_intermediate\_role\_name) | The name of the node IAM role |
| <a name="output_intermediate_role_unique_id"></a> [intermediate\_role\_unique\_id](#output\_intermediate\_role\_unique\_id) | Stable and unique string identifying the node IAM role |
| <a name="output_ira_arn"></a> [ira\_arn](#output\_ira\_arn) | The Amazon Resource Name (ARN) specifying the node IAM role |
| <a name="output_ira_intermediate_role_arn"></a> [ira\_intermediate\_role\_arn](#output\_ira\_intermediate\_role\_arn) | The Amazon Resource Name (ARN) specifying the node IAM role |
| <a name="output_ira_intermediate_role_name"></a> [ira\_intermediate\_role\_name](#output\_ira\_intermediate\_role\_name) | The name of the node IAM role |
| <a name="output_ira_intermediate_role_unique_id"></a> [ira\_intermediate\_role\_unique\_id](#output\_ira\_intermediate\_role\_unique\_id) | Stable and unique string identifying the node IAM role |
| <a name="output_ira_name"></a> [ira\_name](#output\_ira\_name) | The name of the node IAM role |
| <a name="output_ira_unique_id"></a> [ira\_unique\_id](#output\_ira\_unique\_id) | Stable and unique string identifying the node IAM role |
| <a name="output_name"></a> [name](#output\_name) | The name of the node IAM role |
| <a name="output_unique_id"></a> [unique\_id](#output\_unique\_id) | Stable and unique string identifying the node IAM role |
<!-- END_TF_DOCS -->

View File

@@ -0,0 +1,84 @@
provider "aws" {
region = local.region
}
locals {
name = "ex-${basename(path.cwd)}"
region = "us-west-2"
tags = {
Test = local.name
GithubRepo = "terraform-aws-eks"
GithubOrg = "terraform-aws-modules"
}
}
################################################################################
# Hybrid Node IAM Module
################################################################################
# Default (SSM)
module "eks_hybrid_node_role" {
source = "../../modules/hybrid-node-role"
policy_statements = [
{
actions = [
"s3:Get*",
"s3:List*",
]
resources = ["*"]
}
]
tags = local.tags
}
# IAM Roles Anywhere
module "ira_eks_hybrid_node_role" {
source = "../../modules/hybrid-node-role"
name = "${local.name}-ira"
enable_ira = true
ira_trust_anchor_source_type = "CERTIFICATE_BUNDLE"
ira_trust_anchor_x509_certificate_data = local.cert_data
tags = local.tags
}
module "disabled_eks_hybrid_node_role" {
source = "../../modules/hybrid-node-role"
create = false
}
################################################################################
# Supporting Resources
################################################################################
resource "tls_private_key" "example" {
algorithm = "RSA"
rsa_bits = 4096
}
resource "tls_self_signed_cert" "example" {
private_key_pem = tls_private_key.example.private_key_pem
subject {
common_name = "Custom root"
organization = "ACME Examples, Inc"
}
validity_period_hours = 17544
is_ca_certificate = true
allowed_uses = [
"cert_signing",
]
}
locals {
cert_data = trimspace(replace(trimprefix(tls_self_signed_cert.example.cert_pem, "-----BEGIN CERTIFICATE-----"), "-----END CERTIFICATE-----", ""))
}

View File

@@ -0,0 +1,71 @@
################################################################################
# Default (SSM) - Node IAM Role
################################################################################
# Node IAM Role
output "name" {
description = "The name of the node IAM role"
value = module.eks_hybrid_node_role.name
}
output "arn" {
description = "The Amazon Resource Name (ARN) specifying the node IAM role"
value = module.eks_hybrid_node_role.arn
}
output "unique_id" {
description = "Stable and unique string identifying the node IAM role"
value = module.eks_hybrid_node_role.unique_id
}
# Intermedaite IAM Role
output "intermediate_role_name" {
description = "The name of the node IAM role"
value = module.eks_hybrid_node_role.intermediate_role_name
}
output "intermediate_role_arn" {
description = "The Amazon Resource Name (ARN) specifying the node IAM role"
value = module.eks_hybrid_node_role.intermediate_role_arn
}
output "intermediate_role_unique_id" {
description = "Stable and unique string identifying the node IAM role"
value = module.eks_hybrid_node_role.intermediate_role_unique_id
}
################################################################################
# IAM Roles Anywhere - Node IAM Role
################################################################################
# Node IAM Role
output "ira_name" {
description = "The name of the node IAM role"
value = module.ira_eks_hybrid_node_role.name
}
output "ira_arn" {
description = "The Amazon Resource Name (ARN) specifying the node IAM role"
value = module.ira_eks_hybrid_node_role.arn
}
output "ira_unique_id" {
description = "Stable and unique string identifying the node IAM role"
value = module.ira_eks_hybrid_node_role.unique_id
}
# Intermedaite IAM Role
output "ira_intermediate_role_name" {
description = "The name of the node IAM role"
value = module.ira_eks_hybrid_node_role.intermediate_role_name
}
output "ira_intermediate_role_arn" {
description = "The Amazon Resource Name (ARN) specifying the node IAM role"
value = module.ira_eks_hybrid_node_role.intermediate_role_arn
}
output "ira_intermediate_role_unique_id" {
description = "Stable and unique string identifying the node IAM role"
value = module.ira_eks_hybrid_node_role.intermediate_role_unique_id
}

View File

View File

@@ -0,0 +1,14 @@
terraform {
required_version = ">= 1.3.2"
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 5.79"
}
tls = {
source = "hashicorp/tls"
version = ">= 4.0"
}
}
}