# eks-nodes

Creates EKS managed node groups with configurable instance types, taints, labels, and KMS-encrypted volumes.

Provisions one or more EKS managed node groups with a worker node IAM role (or an externally supplied one), scaling configuration, instance-level taints and labels for workload scheduling, and per-group launch templates for KMS-encrypted EBS volumes. IMDSv2 is enforced on all nodes via the launch template.

## Usage

```hcl
module "eks_nodes" {
  source  = "hcassc.jfrog.io/iac-terraform-modules-virtual/compute/eks-nodes/aws"
  version = "0.1.0"

  cluster_name = module.eks.id

  node_groups = {
    general = {
      name           = "general"
      subnet_ids     = module.vpc.private_subnet_id_list
      instance_types = ["m5.xlarge"]
      desired_size   = 3
      max_size       = 10
      kms_key_arn    = module.kms.key_arn
    }
  }
}
```

<!-- BEGIN_TF_DOCS — DO NOT EDIT BELOW THIS LINE -->
## Requirements

| Name | Version |
| ---- | ------- |
| <a name="requirement_terraform"></a> [terraform](#requirement_terraform) | ~> 1.5 |
| <a name="requirement_aws"></a> [aws](#requirement_aws) | ~> 6.50 |

## Providers

| Name | Version |
| ---- | ------- |
| <a name="provider_aws"></a> [aws](#provider_aws) | 6.50.0 |

## Resources

| Name | Type |
| ---- | ---- |
| [aws_eks_node_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/eks_node_group) | resource |
| [aws_iam_role.node](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
| [aws_iam_role_policy_attachment.node](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
| [aws_launch_template.node](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_template) | resource |

## Inputs

| Name | Description | Type | Default | Required |
| ---- | ----------- | ---- | ------- | :------: |
| <a name="input_cluster_name"></a> [cluster_name](#input_cluster_name) | EKS cluster name to attach node groups to | `string` | n/a | yes |
| <a name="input_create_node_role"></a> [create_node_role](#input_create_node_role) | Create a default node IAM role when node_role_arn is null | `bool` | `true` | no |
| <a name="input_node_groups"></a> [node_groups](#input_node_groups) | Map of managed node group definitions | <pre>map(object({<br/>    name           = string<br/>    subnet_ids     = list(string)<br/>    instance_types = optional(list(string), ["m5.large"])<br/>    ami_type       = optional(string, "AL2_x86_64")<br/>    capacity_type  = optional(string, "ON_DEMAND")<br/>    disk_size      = optional(number, 50)<br/>    min_size       = optional(number, 1)<br/>    max_size       = optional(number, 5)<br/>    desired_size   = optional(number, 2)<br/>    kms_key_arn    = optional(string, null)<br/>    labels         = optional(map(string), {})<br/>    taints = optional(list(object({<br/>      key    = string<br/>      value  = optional(string, null)<br/>      effect = string<br/>    })), [])<br/>    max_unavailable = optional(number, 1)<br/>  }))</pre> | `{}` | no |
| <a name="input_node_role_arn"></a> [node_role_arn](#input_node_role_arn) | ARN of the IAM role for worker nodes (created externally or via iam-role module) | `string` | `null` | no |
| <a name="input_tags"></a> [tags](#input_tags) | Resource tags to apply to all resources | `map(string)` | `{}` | no |

## Outputs

| Name | Description |
| ---- | ----------- |
| <a name="output_node_group_arns"></a> [node_group_arns](#output_node_group_arns) | Map of node group logical key to ARN |
| <a name="output_node_group_ids"></a> [node_group_ids](#output_node_group_ids) | Map of node group logical key to ID |
| <a name="output_node_role_arn"></a> [node_role_arn](#output_node_role_arn) | ARN of the node IAM role |
<!-- END_TF_DOCS — DO NOT EDIT ABOVE THIS LINE -->
