mirror of
https://github.com/ysoftdevs/terraform-aws-eks.git
synced 2026-05-01 04:44:29 +02:00
feat!: Removed support for launch configuration and replace count with for_each (#1680)
This commit is contained in:
123
modules/_user_data/README.md
Normal file
123
modules/_user_data/README.md
Normal file
@@ -0,0 +1,123 @@
|
||||
# Internal User Data Module
|
||||
|
||||
Configuration in this directory renders the appropriate user data for the given inputs. There are a number of different ways that user data can be utilized and this internal module is designed to aid in making that flexibility possible as well as providing a means for out of bands testing and validation.
|
||||
|
||||
See the [`examples/user_data/` directory](https://github.com/terraform-aws-modules/terraform-aws-eks/tree/master/examples/user_data) for various examples of using the module.
|
||||
|
||||
## Combinations
|
||||
|
||||
At a high level, AWS EKS users have two methods for launching nodes within this EKS module (ignoring Fargate profiles):
|
||||
|
||||
1. EKS managed node group
|
||||
2. Self managed node group
|
||||
|
||||
### EKS Managed Node Group
|
||||
|
||||
When using an EKS managed node group, users have 2 primary routes for interacting with the bootstrap user data:
|
||||
|
||||
1. If the EKS managed node group does **NOT** utilize a custom AMI, then users can elect to supply additional user data that is pre-pended before the EKS managed node group bootstrap user data. You can read more about this process from the [AWS supplied documentation](https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html#launch-template-user-data)
|
||||
|
||||
- Users can use the following variables to facilitate this process:
|
||||
|
||||
```hcl
|
||||
pre_bootstrap_user_data = "..."
|
||||
bootstrap_extra_args = "..."
|
||||
```
|
||||
|
||||
2. If the EKS managed node group does utilize a custom AMI, then per the [AWS documentation](https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html#launch-template-custom-ami), users will need to supply the necessary bootstrap configuration via user data to ensure that the node is configured to register with the cluster when launched. There are two routes that users can utilize to facilitate this bootstrapping process:
|
||||
- If the AMI used is a derivative of the [AWS EKS Optimized AMI ](https://github.com/awslabs/amazon-eks-ami), users can opt in to using a template provided by the module that provides the minimum necessary configuration to bootstrap the node when launched, with the option to add additional pre and post bootstrap user data as well as bootstrap additional args that are supplied to the [AWS EKS bootstrap.sh script](https://github.com/awslabs/amazon-eks-ami/blob/master/files/bootstrap.sh)
|
||||
- Users can use the following variables to facilitate this process:
|
||||
```hcl
|
||||
enable_bootstrap_user_data = true # to opt in to using the module supplied bootstrap user data template
|
||||
pre_bootstrap_user_data = "..."
|
||||
bootstrap_extra_args = "..."
|
||||
post_bootstrap_user_data = "..."
|
||||
```
|
||||
- If the AMI is not an AWS EKS Optimized AMI derivative, or if users wish to have more control over the user data that is supplied to the node when launched, users have the ability to supply their own user data template that will be rendered instead of the module supplied template. Note - only the variables that are supplied to the `templatefile()` for the respective platform/OS are available for use in the supplied template, otherwise users will need to pre-render/pre-populate the template before supplying the final template to the module for rendering as user data.
|
||||
- Users can use the following variables to facilitate this process:
|
||||
```hcl
|
||||
user_data_template_path = "./your/user_data.sh" # user supplied bootstrap user data template
|
||||
pre_bootstrap_user_data = "..."
|
||||
bootstrap_extra_args = "..."
|
||||
post_bootstrap_user_data = "..."
|
||||
```
|
||||
|
||||
| ℹ️ When using bottlerocket as the desired platform, since the user data for bottlerocket is TOML, all configurations are merged in the one file supplied as user data. Therefore, `pre_bootstrap_user_data` and `post_bootstrap_user_data` are not valid since the bottlerocket OS handles when various settings are applied. If you wish to supply additional configuration settings when using bottlerocket, supply them via the `bootstrap_extra_args` variable. For the linux platform, `bootstrap_extra_args` are settings that will be supplied to the [AWS EKS Optimized AMI bootstrap script](https://github.com/awslabs/amazon-eks-ami/blob/master/files/bootstrap.sh#L14) such as kubelet extra args, etc. See the [bottlerocket GitHub repository documentation](https://github.com/bottlerocket-os/bottlerocket#description-of-settings) for more details on what settings can be supplied via the `bootstrap_extra_args` variable. |
|
||||
| :--- |
|
||||
|
||||
### Self Managed Node Group
|
||||
|
||||
When using a self managed node group, the options presented to users is very similar to the 2nd option listed above for EKS managed node groups. Since self managed node groups require users to provide the bootstrap user data, there is no concept of appending to user data that AWS provides; users can either elect to use the user data template provided for their platform/OS by the module or provide their own user data template for rendering by the module.
|
||||
|
||||
- If the AMI used is a derivative of the [AWS EKS Optimized AMI ](https://github.com/awslabs/amazon-eks-ami), users can opt in to using a template provided by the module that provides the minimum necessary configuration to bootstrap the node when launched, with the option to add additional pre and post bootstrap user data as well as bootstrap additional args that are supplied to the [AWS EKS bootstrap.sh script](https://github.com/awslabs/amazon-eks-ami/blob/master/files/bootstrap.sh)
|
||||
- Users can use the following variables to facilitate this process:
|
||||
```hcl
|
||||
enable_bootstrap_user_data = true # to opt in to using the module supplied bootstrap user data template
|
||||
pre_bootstrap_user_data = "..."
|
||||
bootstrap_extra_args = "..."
|
||||
post_bootstrap_user_data = "..."
|
||||
```
|
||||
- If the AMI is not an AWS EKS Optimized AMI derivative, or if users wish to have more control over the user data that is supplied to the node upon launch, users have the ability to supply their own user data template that will be rendered instead of the module supplied template. Note - only the variables that are supplied to the `templatefile()` for the respective platform/OS are available for use in the supplied template, otherwise users will need to pre-render/pre-populate the template before supplying the final template to the module for rendering as user data.
|
||||
- Users can use the following variables to facilitate this process:
|
||||
```hcl
|
||||
user_data_template_path = "./your/user_data.sh" # user supplied bootstrap user data template
|
||||
pre_bootstrap_user_data = "..."
|
||||
bootstrap_extra_args = "..."
|
||||
post_bootstrap_user_data = "..."
|
||||
```
|
||||
|
||||
### Logic Diagram
|
||||
|
||||
The rough flow of logic that is encapsulated within the `_user_data` internal module can be represented by the following diagram to better highlight the various manners in which user data can be populated.
|
||||
|
||||
<p align="center">
|
||||
<img src="https://raw.githubusercontent.com/terraform-aws-modules/terraform-aws-eks/master/.github/images/user_data.svg" alt="User Data" width="60%">
|
||||
</p>
|
||||
|
||||
<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
|
||||
## Requirements
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 0.13.1 |
|
||||
| <a name="requirement_cloudinit"></a> [cloudinit](#requirement\_cloudinit) | >= 2.0 |
|
||||
|
||||
## Providers
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="provider_cloudinit"></a> [cloudinit](#provider\_cloudinit) | >= 2.0 |
|
||||
|
||||
## Modules
|
||||
|
||||
No modules.
|
||||
|
||||
## Resources
|
||||
|
||||
| Name | Type |
|
||||
|------|------|
|
||||
| [cloudinit_config.linux_eks_managed_node_group](https://registry.terraform.io/providers/hashicorp/cloudinit/latest/docs/data-sources/config) | data source |
|
||||
|
||||
## Inputs
|
||||
|
||||
| Name | Description | Type | Default | Required |
|
||||
|------|-------------|------|---------|:--------:|
|
||||
| <a name="input_bootstrap_extra_args"></a> [bootstrap\_extra\_args](#input\_bootstrap\_extra\_args) | Additional arguments passed to the bootstrap script. When `platform` = `bottlerocket`; these are additional [settings](https://github.com/bottlerocket-os/bottlerocket#settings) that are provided to the Bottlerocket user data | `string` | `""` | no |
|
||||
| <a name="input_cluster_auth_base64"></a> [cluster\_auth\_base64](#input\_cluster\_auth\_base64) | Base64 encoded CA of associated EKS cluster | `string` | `""` | no |
|
||||
| <a name="input_cluster_endpoint"></a> [cluster\_endpoint](#input\_cluster\_endpoint) | Endpoint of associated EKS cluster | `string` | `""` | no |
|
||||
| <a name="input_cluster_name"></a> [cluster\_name](#input\_cluster\_name) | Name of the EKS cluster | `string` | `""` | no |
|
||||
| <a name="input_cluster_service_ipv4_cidr"></a> [cluster\_service\_ipv4\_cidr](#input\_cluster\_service\_ipv4\_cidr) | The CIDR block to assign Kubernetes service IP addresses from. If you don't specify a block, Kubernetes assigns addresses from either the 10.100.0.0/16 or 172.20.0.0/16 CIDR blocks | `string` | `null` | no |
|
||||
| <a name="input_create"></a> [create](#input\_create) | Determines whether to create user-data or not | `bool` | `true` | no |
|
||||
| <a name="input_enable_bootstrap_user_data"></a> [enable\_bootstrap\_user\_data](#input\_enable\_bootstrap\_user\_data) | Determines whether the bootstrap configurations are populated within the user data template | `bool` | `false` | no |
|
||||
| <a name="input_is_eks_managed_node_group"></a> [is\_eks\_managed\_node\_group](#input\_is\_eks\_managed\_node\_group) | Determines whether the user data is used on nodes in an EKS managed node group. Used to determine if user data will be appended or not | `bool` | `true` | no |
|
||||
| <a name="input_platform"></a> [platform](#input\_platform) | Identifies if the OS platform is `bottlerocket`, `linux`, or `windows` based | `string` | `"linux"` | no |
|
||||
| <a name="input_post_bootstrap_user_data"></a> [post\_bootstrap\_user\_data](#input\_post\_bootstrap\_user\_data) | User data that is appended to the user data script after of the EKS bootstrap script. Not used when `platform` = `bottlerocket` | `string` | `""` | no |
|
||||
| <a name="input_pre_bootstrap_user_data"></a> [pre\_bootstrap\_user\_data](#input\_pre\_bootstrap\_user\_data) | User data that is injected into the user data script ahead of the EKS bootstrap script. Not used when `platform` = `bottlerocket` | `string` | `""` | no |
|
||||
| <a name="input_user_data_template_path"></a> [user\_data\_template\_path](#input\_user\_data\_template\_path) | Path to a local, custom user data template file to use when rendering user data | `string` | `""` | no |
|
||||
|
||||
## Outputs
|
||||
|
||||
| Name | Description |
|
||||
|------|-------------|
|
||||
| <a name="output_user_data"></a> [user\_data](#output\_user\_data) | Base64 encoded user data rendered for the provided inputs |
|
||||
<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
|
||||
78
modules/_user_data/main.tf
Normal file
78
modules/_user_data/main.tf
Normal file
@@ -0,0 +1,78 @@
|
||||
|
||||
locals {
|
||||
int_linux_default_user_data = var.create && var.platform == "linux" && (var.enable_bootstrap_user_data || var.user_data_template_path != "") ? base64encode(templatefile(
|
||||
coalesce(var.user_data_template_path, "${path.module}/../../templates/linux_user_data.tpl"),
|
||||
{
|
||||
# https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html#launch-template-custom-ami
|
||||
enable_bootstrap_user_data = var.enable_bootstrap_user_data
|
||||
# Required to bootstrap node
|
||||
cluster_name = var.cluster_name
|
||||
cluster_endpoint = var.cluster_endpoint
|
||||
cluster_auth_base64 = var.cluster_auth_base64
|
||||
# Optional
|
||||
cluster_service_ipv4_cidr = var.cluster_service_ipv4_cidr != null ? var.cluster_service_ipv4_cidr : ""
|
||||
bootstrap_extra_args = var.bootstrap_extra_args
|
||||
pre_bootstrap_user_data = var.pre_bootstrap_user_data
|
||||
post_bootstrap_user_data = var.post_bootstrap_user_data
|
||||
}
|
||||
)) : ""
|
||||
platform = {
|
||||
bottlerocket = {
|
||||
user_data = var.create && var.platform == "bottlerocket" && (var.enable_bootstrap_user_data || var.user_data_template_path != "" || var.bootstrap_extra_args != "") ? base64encode(templatefile(
|
||||
coalesce(var.user_data_template_path, "${path.module}/../../templates/bottlerocket_user_data.tpl"),
|
||||
{
|
||||
# https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html#launch-template-custom-ami
|
||||
enable_bootstrap_user_data = var.enable_bootstrap_user_data
|
||||
# Required to bootstrap node
|
||||
cluster_name = var.cluster_name
|
||||
cluster_endpoint = var.cluster_endpoint
|
||||
cluster_auth_base64 = var.cluster_auth_base64
|
||||
# Optional - is appended if using EKS managed node group without custom AMI
|
||||
# cluster_service_ipv4_cidr = var.cluster_service_ipv4_cidr # Not supported yet: https://github.com/bottlerocket-os/bottlerocket/issues/1866
|
||||
bootstrap_extra_args = var.bootstrap_extra_args
|
||||
}
|
||||
)) : ""
|
||||
}
|
||||
linux = {
|
||||
user_data = try(data.cloudinit_config.linux_eks_managed_node_group[0].rendered, local.int_linux_default_user_data)
|
||||
|
||||
}
|
||||
windows = {
|
||||
user_data = var.create && var.platform == "windows" && var.enable_bootstrap_user_data ? base64encode(templatefile(
|
||||
coalesce(var.user_data_template_path, "${path.module}/../../templates/windows_user_data.tpl"),
|
||||
{
|
||||
# Required to bootstrap node
|
||||
cluster_name = var.cluster_name
|
||||
cluster_endpoint = var.cluster_endpoint
|
||||
cluster_auth_base64 = var.cluster_auth_base64
|
||||
# Optional - is appended if using EKS managed node group without custom AMI
|
||||
# cluster_service_ipv4_cidr = var.cluster_service_ipv4_cidr # Not supported yet: https://github.com/awslabs/amazon-eks-ami/issues/805
|
||||
bootstrap_extra_args = var.bootstrap_extra_args
|
||||
pre_bootstrap_user_data = var.pre_bootstrap_user_data
|
||||
post_bootstrap_user_data = var.post_bootstrap_user_data
|
||||
}
|
||||
)) : ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# https://github.com/aws/containers-roadmap/issues/596#issuecomment-675097667
|
||||
# An important note is that user data must in MIME multi-part archive format,
|
||||
# as by default, EKS will merge the bootstrapping command required for nodes to join the
|
||||
# cluster with your user data. If you use a custom AMI in your launch template,
|
||||
# this merging will NOT happen and you are responsible for nodes joining the cluster.
|
||||
# See docs for more details -> https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html#launch-template-user-data
|
||||
|
||||
data "cloudinit_config" "linux_eks_managed_node_group" {
|
||||
count = var.create && var.platform == "linux" && var.is_eks_managed_node_group && !var.enable_bootstrap_user_data && var.pre_bootstrap_user_data != "" && var.user_data_template_path == "" ? 1 : 0
|
||||
|
||||
base64_encode = true
|
||||
gzip = false
|
||||
boundary = "//"
|
||||
|
||||
# Prepend to existing user data suppled by AWS EKS
|
||||
part {
|
||||
content_type = "text/x-shellscript"
|
||||
content = var.pre_bootstrap_user_data
|
||||
}
|
||||
}
|
||||
4
modules/_user_data/outputs.tf
Normal file
4
modules/_user_data/outputs.tf
Normal file
@@ -0,0 +1,4 @@
|
||||
output "user_data" {
|
||||
description = "Base64 encoded user data rendered for the provided inputs"
|
||||
value = try(local.platform[var.platform].user_data, "")
|
||||
}
|
||||
71
modules/_user_data/variables.tf
Normal file
71
modules/_user_data/variables.tf
Normal file
@@ -0,0 +1,71 @@
|
||||
variable "create" {
|
||||
description = "Determines whether to create user-data or not"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "platform" {
|
||||
description = "Identifies if the OS platform is `bottlerocket`, `linux`, or `windows` based"
|
||||
type = string
|
||||
default = "linux"
|
||||
}
|
||||
|
||||
variable "enable_bootstrap_user_data" {
|
||||
description = "Determines whether the bootstrap configurations are populated within the user data template"
|
||||
type = bool
|
||||
default = false
|
||||
}
|
||||
|
||||
variable "is_eks_managed_node_group" {
|
||||
description = "Determines whether the user data is used on nodes in an EKS managed node group. Used to determine if user data will be appended or not"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "cluster_name" {
|
||||
description = "Name of the EKS cluster"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "cluster_endpoint" {
|
||||
description = "Endpoint of associated EKS cluster"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "cluster_auth_base64" {
|
||||
description = "Base64 encoded CA of associated EKS cluster"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "cluster_service_ipv4_cidr" {
|
||||
description = "The CIDR block to assign Kubernetes service IP addresses from. If you don't specify a block, Kubernetes assigns addresses from either the 10.100.0.0/16 or 172.20.0.0/16 CIDR blocks"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "pre_bootstrap_user_data" {
|
||||
description = "User data that is injected into the user data script ahead of the EKS bootstrap script. Not used when `platform` = `bottlerocket`"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "post_bootstrap_user_data" {
|
||||
description = "User data that is appended to the user data script after of the EKS bootstrap script. Not used when `platform` = `bottlerocket`"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "bootstrap_extra_args" {
|
||||
description = "Additional arguments passed to the bootstrap script. When `platform` = `bottlerocket`; these are additional [settings](https://github.com/bottlerocket-os/bottlerocket#settings) that are provided to the Bottlerocket user data"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "user_data_template_path" {
|
||||
description = "Path to a local, custom user data template file to use when rendering user data"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
10
modules/_user_data/versions.tf
Normal file
10
modules/_user_data/versions.tf
Normal file
@@ -0,0 +1,10 @@
|
||||
terraform {
|
||||
required_version = ">= 0.13.1"
|
||||
|
||||
required_providers {
|
||||
cloudinit = {
|
||||
source = "hashicorp/cloudinit"
|
||||
version = ">= 2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
175
modules/eks-managed-node-group/README.md
Normal file
175
modules/eks-managed-node-group/README.md
Normal file
@@ -0,0 +1,175 @@
|
||||
# EKS Managed Node Group Module
|
||||
|
||||
Configuration in this directory creates an EKS Managed Node Group along with an IAM role, security group, and launch template
|
||||
|
||||
## Usage
|
||||
|
||||
```hcl
|
||||
module "eks_managed_node_group" {
|
||||
source = "terraform-aws-modules/eks/aws//modules/eks-managed-node-group"
|
||||
|
||||
name = "separate-eks-mng"
|
||||
cluster_name = "my-cluster"
|
||||
cluster_version = "1.21"
|
||||
|
||||
vpc_id = "vpc-1234556abcdef"
|
||||
subnet_ids = ["subnet-abcde012", "subnet-bcde012a", "subnet-fghi345a"]
|
||||
|
||||
min_size = 1
|
||||
max_size = 10
|
||||
desired_size = 1
|
||||
|
||||
instance_types = ["t3.large"]
|
||||
capacity_type = "SPOT"
|
||||
|
||||
labels = {
|
||||
Environment = "test"
|
||||
GithubRepo = "terraform-aws-eks"
|
||||
GithubOrg = "terraform-aws-modules"
|
||||
}
|
||||
|
||||
taints = {
|
||||
dedicated = {
|
||||
key = "dedicated"
|
||||
value = "gpuGroup"
|
||||
effect = "NO_SCHEDULE"
|
||||
}
|
||||
}
|
||||
|
||||
tags = {
|
||||
Environment = "dev"
|
||||
Terraform = "true"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
|
||||
## Requirements
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 0.13.1 |
|
||||
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 3.64 |
|
||||
| <a name="requirement_cloudinit"></a> [cloudinit](#requirement\_cloudinit) | >= 2.0 |
|
||||
|
||||
## Providers
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 3.64 |
|
||||
|
||||
## Modules
|
||||
|
||||
| Name | Source | Version |
|
||||
|------|--------|---------|
|
||||
| <a name="module_user_data"></a> [user\_data](#module\_user\_data) | ../_user_data | n/a |
|
||||
|
||||
## 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.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
|
||||
| [aws_iam_role_policy_attachment.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
|
||||
| [aws_launch_template.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_template) | resource |
|
||||
| [aws_security_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group) | resource |
|
||||
| [aws_security_group_rule.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group_rule) | resource |
|
||||
| [aws_iam_policy_document.assume_role_policy](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |
|
||||
| [aws_partition.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/partition) | data source |
|
||||
|
||||
## Inputs
|
||||
|
||||
| Name | Description | Type | Default | Required |
|
||||
|------|-------------|------|---------|:--------:|
|
||||
| <a name="input_ami_id"></a> [ami\_id](#input\_ami\_id) | The AMI from which to launch the instance. If not supplied, EKS will use its own default image | `string` | `""` | no |
|
||||
| <a name="input_ami_release_version"></a> [ami\_release\_version](#input\_ami\_release\_version) | AMI version of the EKS Node Group. Defaults to latest version for Kubernetes version | `string` | `null` | no |
|
||||
| <a name="input_ami_type"></a> [ami\_type](#input\_ami\_type) | Type of Amazon Machine Image (AMI) associated with the EKS Node Group. Valid values are `AL2_x86_64`, `AL2_x86_64_GPU`, `AL2_ARM_64`, `CUSTOM`, `BOTTLEROCKET_ARM_64`, `BOTTLEROCKET_x86_64` | `string` | `null` | no |
|
||||
| <a name="input_block_device_mappings"></a> [block\_device\_mappings](#input\_block\_device\_mappings) | Specify volumes to attach to the instance besides the volumes specified by the AMI | `any` | `{}` | no |
|
||||
| <a name="input_bootstrap_extra_args"></a> [bootstrap\_extra\_args](#input\_bootstrap\_extra\_args) | Additional arguments passed to the bootstrap script. When `platform` = `bottlerocket`; these are additional [settings](https://github.com/bottlerocket-os/bottlerocket#settings) that are provided to the Bottlerocket user data | `string` | `""` | no |
|
||||
| <a name="input_capacity_reservation_specification"></a> [capacity\_reservation\_specification](#input\_capacity\_reservation\_specification) | Targeting for EC2 capacity reservations | `any` | `null` | no |
|
||||
| <a name="input_capacity_type"></a> [capacity\_type](#input\_capacity\_type) | Type of capacity associated with the EKS Node Group. Valid values: `ON_DEMAND`, `SPOT` | `string` | `"ON_DEMAND"` | no |
|
||||
| <a name="input_cluster_auth_base64"></a> [cluster\_auth\_base64](#input\_cluster\_auth\_base64) | Base64 encoded CA of associated EKS cluster | `string` | `""` | no |
|
||||
| <a name="input_cluster_endpoint"></a> [cluster\_endpoint](#input\_cluster\_endpoint) | Endpoint of associated EKS cluster | `string` | `""` | no |
|
||||
| <a name="input_cluster_name"></a> [cluster\_name](#input\_cluster\_name) | Name of associated EKS cluster | `string` | `null` | no |
|
||||
| <a name="input_cluster_security_group_id"></a> [cluster\_security\_group\_id](#input\_cluster\_security\_group\_id) | Cluster control plane security group ID | `string` | `null` | no |
|
||||
| <a name="input_cluster_service_ipv4_cidr"></a> [cluster\_service\_ipv4\_cidr](#input\_cluster\_service\_ipv4\_cidr) | The CIDR block to assign Kubernetes service IP addresses from. If you don't specify a block, Kubernetes assigns addresses from either the 10.100.0.0/16 or 172.20.0.0/16 CIDR blocks | `string` | `null` | no |
|
||||
| <a name="input_cluster_version"></a> [cluster\_version](#input\_cluster\_version) | Kubernetes version. Defaults to EKS Cluster Kubernetes version | `string` | `null` | no |
|
||||
| <a name="input_cpu_options"></a> [cpu\_options](#input\_cpu\_options) | The CPU options for the instance | `map(string)` | `null` | no |
|
||||
| <a name="input_create"></a> [create](#input\_create) | Determines whether to create EKS managed node group or not | `bool` | `true` | no |
|
||||
| <a name="input_create_iam_role"></a> [create\_iam\_role](#input\_create\_iam\_role) | Determines whether an IAM role is created or to use an existing IAM role | `bool` | `true` | no |
|
||||
| <a name="input_create_launch_template"></a> [create\_launch\_template](#input\_create\_launch\_template) | Determines whether to create a launch template or not. If set to `false`, EKS will use its own default launch template | `bool` | `true` | no |
|
||||
| <a name="input_create_security_group"></a> [create\_security\_group](#input\_create\_security\_group) | Determines whether to create a security group | `bool` | `true` | no |
|
||||
| <a name="input_credit_specification"></a> [credit\_specification](#input\_credit\_specification) | Customize the credit specification of the instance | `map(string)` | `null` | no |
|
||||
| <a name="input_desired_size"></a> [desired\_size](#input\_desired\_size) | Desired number of instances/nodes | `number` | `1` | no |
|
||||
| <a name="input_disable_api_termination"></a> [disable\_api\_termination](#input\_disable\_api\_termination) | If true, enables EC2 instance termination protection | `bool` | `null` | no |
|
||||
| <a name="input_disk_size"></a> [disk\_size](#input\_disk\_size) | Disk size in GiB for nodes. Defaults to `20` | `number` | `null` | no |
|
||||
| <a name="input_ebs_optimized"></a> [ebs\_optimized](#input\_ebs\_optimized) | If true, the launched EC2 instance(s) will be EBS-optimized | `bool` | `null` | no |
|
||||
| <a name="input_elastic_gpu_specifications"></a> [elastic\_gpu\_specifications](#input\_elastic\_gpu\_specifications) | The elastic GPU to attach to the instance | `map(string)` | `null` | no |
|
||||
| <a name="input_elastic_inference_accelerator"></a> [elastic\_inference\_accelerator](#input\_elastic\_inference\_accelerator) | Configuration block containing an Elastic Inference Accelerator to attach to the instance | `map(string)` | `null` | no |
|
||||
| <a name="input_enable_bootstrap_user_data"></a> [enable\_bootstrap\_user\_data](#input\_enable\_bootstrap\_user\_data) | Determines whether the bootstrap configurations are populated within the user data template | `bool` | `false` | no |
|
||||
| <a name="input_enable_monitoring"></a> [enable\_monitoring](#input\_enable\_monitoring) | Enables/disables detailed monitoring | `bool` | `true` | no |
|
||||
| <a name="input_enclave_options"></a> [enclave\_options](#input\_enclave\_options) | Enable Nitro Enclaves on launched instances | `map(string)` | `null` | no |
|
||||
| <a name="input_force_update_version"></a> [force\_update\_version](#input\_force\_update\_version) | Force version update if existing pods are unable to be drained due to a pod disruption budget issue | `bool` | `null` | no |
|
||||
| <a name="input_iam_role_additional_policies"></a> [iam\_role\_additional\_policies](#input\_iam\_role\_additional\_policies) | Additional policies to be added to the IAM role | `list(string)` | `[]` | no |
|
||||
| <a name="input_iam_role_arn"></a> [iam\_role\_arn](#input\_iam\_role\_arn) | Existing IAM role ARN for the node group. Required if `create_iam_role` is set to `false` | `string` | `null` | no |
|
||||
| <a name="input_iam_role_description"></a> [iam\_role\_description](#input\_iam\_role\_description) | Description of the role | `string` | `null` | no |
|
||||
| <a name="input_iam_role_name"></a> [iam\_role\_name](#input\_iam\_role\_name) | Name to use on IAM role created | `string` | `null` | no |
|
||||
| <a name="input_iam_role_path"></a> [iam\_role\_path](#input\_iam\_role\_path) | IAM role path | `string` | `null` | no |
|
||||
| <a name="input_iam_role_permissions_boundary"></a> [iam\_role\_permissions\_boundary](#input\_iam\_role\_permissions\_boundary) | ARN of the policy that is used to set the permissions boundary for the IAM role | `string` | `null` | no |
|
||||
| <a name="input_iam_role_tags"></a> [iam\_role\_tags](#input\_iam\_role\_tags) | A map of additional tags to add to the IAM role created | `map(string)` | `{}` | no |
|
||||
| <a name="input_iam_role_use_name_prefix"></a> [iam\_role\_use\_name\_prefix](#input\_iam\_role\_use\_name\_prefix) | Determines whether the IAM role name (`iam_role_name`) is used as a prefix | `string` | `true` | no |
|
||||
| <a name="input_instance_market_options"></a> [instance\_market\_options](#input\_instance\_market\_options) | The market (purchasing) option for the instance | `any` | `null` | no |
|
||||
| <a name="input_instance_types"></a> [instance\_types](#input\_instance\_types) | Set of instance types associated with the EKS Node Group. Defaults to `["t3.medium"]` | `list(string)` | `null` | no |
|
||||
| <a name="input_kernel_id"></a> [kernel\_id](#input\_kernel\_id) | The kernel ID | `string` | `null` | no |
|
||||
| <a name="input_key_name"></a> [key\_name](#input\_key\_name) | The key name that should be used for the instance(s) | `string` | `null` | no |
|
||||
| <a name="input_labels"></a> [labels](#input\_labels) | Key-value map of Kubernetes labels. Only labels that are applied with the EKS API are managed by this argument. Other Kubernetes labels applied to the EKS Node Group will not be managed | `map(string)` | `null` | no |
|
||||
| <a name="input_launch_template_default_version"></a> [launch\_template\_default\_version](#input\_launch\_template\_default\_version) | Default version of the launch template | `string` | `null` | no |
|
||||
| <a name="input_launch_template_description"></a> [launch\_template\_description](#input\_launch\_template\_description) | Description of the launch template | `string` | `null` | no |
|
||||
| <a name="input_launch_template_name"></a> [launch\_template\_name](#input\_launch\_template\_name) | Launch template name - either to be created (`var.create_launch_template` = `true`) or existing (`var.create_launch_template` = `false`) | `string` | `""` | no |
|
||||
| <a name="input_launch_template_use_name_prefix"></a> [launch\_template\_use\_name\_prefix](#input\_launch\_template\_use\_name\_prefix) | Determines whether to use `launch_template_name` as is or create a unique name beginning with the `launch_template_name` as the prefix | `bool` | `true` | no |
|
||||
| <a name="input_launch_template_version"></a> [launch\_template\_version](#input\_launch\_template\_version) | Launch template version number. The default is `$Default` | `string` | `null` | no |
|
||||
| <a name="input_license_specifications"></a> [license\_specifications](#input\_license\_specifications) | A list of license specifications to associate with | `map(string)` | `null` | no |
|
||||
| <a name="input_max_size"></a> [max\_size](#input\_max\_size) | Maximum number of instances/nodes | `number` | `3` | no |
|
||||
| <a name="input_metadata_options"></a> [metadata\_options](#input\_metadata\_options) | Customize the metadata options for the instance | `map(string)` | <pre>{<br> "http_endpoint": "enabled",<br> "http_put_response_hop_limit": 2,<br> "http_tokens": "required"<br>}</pre> | no |
|
||||
| <a name="input_min_size"></a> [min\_size](#input\_min\_size) | Minimum number of instances/nodes | `number` | `0` | no |
|
||||
| <a name="input_name"></a> [name](#input\_name) | Name of the EKS managed node group | `string` | `""` | no |
|
||||
| <a name="input_network_interfaces"></a> [network\_interfaces](#input\_network\_interfaces) | Customize network interfaces to be attached at instance boot time | `list(any)` | `[]` | no |
|
||||
| <a name="input_placement"></a> [placement](#input\_placement) | The placement of the instance | `map(string)` | `null` | no |
|
||||
| <a name="input_platform"></a> [platform](#input\_platform) | Identifies if the OS platform is `bottlerocket` or `linux` based; `windows` is not supported | `string` | `"linux"` | no |
|
||||
| <a name="input_post_bootstrap_user_data"></a> [post\_bootstrap\_user\_data](#input\_post\_bootstrap\_user\_data) | User data that is appended to the user data script after of the EKS bootstrap script. Not used when `platform` = `bottlerocket` | `string` | `""` | no |
|
||||
| <a name="input_pre_bootstrap_user_data"></a> [pre\_bootstrap\_user\_data](#input\_pre\_bootstrap\_user\_data) | User data that is injected into the user data script ahead of the EKS bootstrap script. Not used when `platform` = `bottlerocket` | `string` | `""` | no |
|
||||
| <a name="input_ram_disk_id"></a> [ram\_disk\_id](#input\_ram\_disk\_id) | The ID of the ram disk | `string` | `null` | no |
|
||||
| <a name="input_remote_access"></a> [remote\_access](#input\_remote\_access) | Configuration block with remote access settings | `map(string)` | `{}` | no |
|
||||
| <a name="input_security_group_description"></a> [security\_group\_description](#input\_security\_group\_description) | Description for the security group created | `string` | `"EKS managed node group security group"` | no |
|
||||
| <a name="input_security_group_name"></a> [security\_group\_name](#input\_security\_group\_name) | Name to use on security group created | `string` | `null` | no |
|
||||
| <a name="input_security_group_rules"></a> [security\_group\_rules](#input\_security\_group\_rules) | List of security group rules to add to the security group created | `any` | `{}` | no |
|
||||
| <a name="input_security_group_tags"></a> [security\_group\_tags](#input\_security\_group\_tags) | A map of additional tags to add to the security group created | `map(string)` | `{}` | no |
|
||||
| <a name="input_security_group_use_name_prefix"></a> [security\_group\_use\_name\_prefix](#input\_security\_group\_use\_name\_prefix) | Determines whether the security group name (`security_group_name`) is used as a prefix | `string` | `true` | no |
|
||||
| <a name="input_subnet_ids"></a> [subnet\_ids](#input\_subnet\_ids) | Identifiers of EC2 Subnets to associate with the EKS Node Group. These subnets must have the following resource tag: `kubernetes.io/cluster/CLUSTER_NAME` | `list(string)` | `null` | no |
|
||||
| <a name="input_tags"></a> [tags](#input\_tags) | A map of tags to add to all resources | `map(string)` | `{}` | no |
|
||||
| <a name="input_taints"></a> [taints](#input\_taints) | The Kubernetes taints to be applied to the nodes in the node group. Maximum of 50 taints per node group | `any` | `{}` | no |
|
||||
| <a name="input_timeouts"></a> [timeouts](#input\_timeouts) | Create, update, and delete timeout configurations for the node group | `map(string)` | `{}` | no |
|
||||
| <a name="input_update_config"></a> [update\_config](#input\_update\_config) | Configuration block of settings for max unavailable resources during node group updates | `map(string)` | `{}` | no |
|
||||
| <a name="input_update_launch_template_default_version"></a> [update\_launch\_template\_default\_version](#input\_update\_launch\_template\_default\_version) | Whether to update the launch templates default version on each update. Conflicts with `launch_template_default_version` | `bool` | `true` | no |
|
||||
| <a name="input_use_name_prefix"></a> [use\_name\_prefix](#input\_use\_name\_prefix) | Determines whether to use `name` as is or create a unique name beginning with the `name` as the prefix | `bool` | `true` | no |
|
||||
| <a name="input_user_data_template_path"></a> [user\_data\_template\_path](#input\_user\_data\_template\_path) | Path to a local, custom user data template file to use when rendering user data | `string` | `""` | no |
|
||||
| <a name="input_vpc_id"></a> [vpc\_id](#input\_vpc\_id) | ID of the VPC where the security group/nodes will be provisioned | `string` | `null` | no |
|
||||
| <a name="input_vpc_security_group_ids"></a> [vpc\_security\_group\_ids](#input\_vpc\_security\_group\_ids) | A list of security group IDs to associate | `list(string)` | `[]` | no |
|
||||
|
||||
## Outputs
|
||||
|
||||
| Name | Description |
|
||||
|------|-------------|
|
||||
| <a name="output_iam_role_arn"></a> [iam\_role\_arn](#output\_iam\_role\_arn) | The Amazon Resource Name (ARN) specifying the IAM role |
|
||||
| <a name="output_iam_role_name"></a> [iam\_role\_name](#output\_iam\_role\_name) | The name of the IAM role |
|
||||
| <a name="output_iam_role_unique_id"></a> [iam\_role\_unique\_id](#output\_iam\_role\_unique\_id) | Stable and unique string identifying the IAM role |
|
||||
| <a name="output_launch_template_arn"></a> [launch\_template\_arn](#output\_launch\_template\_arn) | The ARN of the launch template |
|
||||
| <a name="output_launch_template_id"></a> [launch\_template\_id](#output\_launch\_template\_id) | The ID of the launch template |
|
||||
| <a name="output_launch_template_latest_version"></a> [launch\_template\_latest\_version](#output\_launch\_template\_latest\_version) | The latest version of the launch template |
|
||||
| <a name="output_node_group_arn"></a> [node\_group\_arn](#output\_node\_group\_arn) | Amazon Resource Name (ARN) of the EKS Node Group |
|
||||
| <a name="output_node_group_id"></a> [node\_group\_id](#output\_node\_group\_id) | EKS Cluster name and EKS Node Group name separated by a colon (`:`) |
|
||||
| <a name="output_node_group_resources"></a> [node\_group\_resources](#output\_node\_group\_resources) | List of objects containing information about underlying resources |
|
||||
| <a name="output_node_group_status"></a> [node\_group\_status](#output\_node\_group\_status) | Status of the EKS Node Group |
|
||||
| <a name="output_security_group_arn"></a> [security\_group\_arn](#output\_security\_group\_arn) | Amazon Resource Name (ARN) of the security group |
|
||||
| <a name="output_security_group_id"></a> [security\_group\_id](#output\_security\_group\_id) | ID of the security group |
|
||||
<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
|
||||
435
modules/eks-managed-node-group/main.tf
Normal file
435
modules/eks-managed-node-group/main.tf
Normal file
@@ -0,0 +1,435 @@
|
||||
data "aws_partition" "current" {}
|
||||
|
||||
################################################################################
|
||||
# User Data
|
||||
################################################################################
|
||||
|
||||
module "user_data" {
|
||||
source = "../_user_data"
|
||||
|
||||
create = var.create
|
||||
platform = var.platform
|
||||
|
||||
cluster_name = var.cluster_name
|
||||
cluster_endpoint = var.cluster_endpoint
|
||||
cluster_auth_base64 = var.cluster_auth_base64
|
||||
|
||||
cluster_service_ipv4_cidr = var.cluster_service_ipv4_cidr
|
||||
|
||||
enable_bootstrap_user_data = var.enable_bootstrap_user_data
|
||||
pre_bootstrap_user_data = var.pre_bootstrap_user_data
|
||||
post_bootstrap_user_data = var.post_bootstrap_user_data
|
||||
bootstrap_extra_args = var.bootstrap_extra_args
|
||||
user_data_template_path = var.user_data_template_path
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Launch template
|
||||
################################################################################
|
||||
|
||||
locals {
|
||||
use_custom_launch_template = var.launch_template_name != ""
|
||||
launch_template_name_int = coalesce(var.launch_template_name, "${var.name}-eks-node-group")
|
||||
}
|
||||
|
||||
resource "aws_launch_template" "this" {
|
||||
count = var.create && var.create_launch_template ? 1 : 0
|
||||
|
||||
name = var.launch_template_use_name_prefix ? null : local.launch_template_name_int
|
||||
name_prefix = var.launch_template_use_name_prefix ? "${local.launch_template_name_int}-" : null
|
||||
description = var.launch_template_description
|
||||
|
||||
ebs_optimized = var.ebs_optimized
|
||||
image_id = var.ami_id
|
||||
# # Set on node group instead
|
||||
# instance_type = var.launch_template_instance_type
|
||||
key_name = var.key_name
|
||||
user_data = module.user_data.user_data
|
||||
|
||||
vpc_security_group_ids = compact(concat([try(aws_security_group.this[0].id, "")], var.vpc_security_group_ids))
|
||||
|
||||
default_version = var.launch_template_default_version
|
||||
update_default_version = var.update_launch_template_default_version
|
||||
disable_api_termination = var.disable_api_termination
|
||||
# Set on EKS managed node group, will fail if set here
|
||||
# https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html#launch-template-basics
|
||||
# instance_initiated_shutdown_behavior = var.instance_initiated_shutdown_behavior
|
||||
kernel_id = var.kernel_id
|
||||
ram_disk_id = var.ram_disk_id
|
||||
|
||||
dynamic "block_device_mappings" {
|
||||
for_each = var.block_device_mappings
|
||||
content {
|
||||
device_name = block_device_mappings.value.device_name
|
||||
no_device = lookup(block_device_mappings.value, "no_device", null)
|
||||
virtual_name = lookup(block_device_mappings.value, "virtual_name", null)
|
||||
|
||||
dynamic "ebs" {
|
||||
for_each = flatten([lookup(block_device_mappings.value, "ebs", [])])
|
||||
content {
|
||||
delete_on_termination = lookup(ebs.value, "delete_on_termination", null)
|
||||
encrypted = lookup(ebs.value, "encrypted", null)
|
||||
kms_key_id = lookup(ebs.value, "kms_key_id", null)
|
||||
iops = lookup(ebs.value, "iops", null)
|
||||
throughput = lookup(ebs.value, "throughput", null)
|
||||
snapshot_id = lookup(ebs.value, "snapshot_id", null)
|
||||
volume_size = lookup(ebs.value, "volume_size", null)
|
||||
volume_type = lookup(ebs.value, "volume_type", null)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "capacity_reservation_specification" {
|
||||
for_each = var.capacity_reservation_specification != null ? [var.capacity_reservation_specification] : []
|
||||
content {
|
||||
capacity_reservation_preference = lookup(capacity_reservation_specification.value, "capacity_reservation_preference", null)
|
||||
|
||||
dynamic "capacity_reservation_target" {
|
||||
for_each = lookup(capacity_reservation_specification.value, "capacity_reservation_target", [])
|
||||
content {
|
||||
capacity_reservation_id = lookup(capacity_reservation_target.value, "capacity_reservation_id", null)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "cpu_options" {
|
||||
for_each = var.cpu_options != null ? [var.cpu_options] : []
|
||||
content {
|
||||
core_count = cpu_options.value.core_count
|
||||
threads_per_core = cpu_options.value.threads_per_core
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "credit_specification" {
|
||||
for_each = var.credit_specification != null ? [var.credit_specification] : []
|
||||
content {
|
||||
cpu_credits = credit_specification.value.cpu_credits
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "elastic_gpu_specifications" {
|
||||
for_each = var.elastic_gpu_specifications != null ? [var.elastic_gpu_specifications] : []
|
||||
content {
|
||||
type = elastic_gpu_specifications.value.type
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "elastic_inference_accelerator" {
|
||||
for_each = var.elastic_inference_accelerator != null ? [var.elastic_inference_accelerator] : []
|
||||
content {
|
||||
type = elastic_inference_accelerator.value.type
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "enclave_options" {
|
||||
for_each = var.enclave_options != null ? [var.enclave_options] : []
|
||||
content {
|
||||
enabled = enclave_options.value.enabled
|
||||
}
|
||||
}
|
||||
|
||||
# Set on EKS managed node group, will fail if set here
|
||||
# https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html#launch-template-basics
|
||||
# dynamic "hibernation_options" {
|
||||
# for_each = var.hibernation_options != null ? [var.hibernation_options] : []
|
||||
# content {
|
||||
# configured = hibernation_options.value.configured
|
||||
# }
|
||||
# }
|
||||
|
||||
# Set on EKS managed node group, will fail if set here
|
||||
# https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html#launch-template-basics
|
||||
# dynamic "iam_instance_profile" {
|
||||
# for_each = [var.iam_instance_profile]
|
||||
# content {
|
||||
# name = lookup(var.iam_instance_profile, "name", null)
|
||||
# arn = lookup(var.iam_instance_profile, "arn", null)
|
||||
# }
|
||||
# }
|
||||
|
||||
dynamic "instance_market_options" {
|
||||
for_each = var.instance_market_options != null ? [var.instance_market_options] : []
|
||||
content {
|
||||
market_type = instance_market_options.value.market_type
|
||||
|
||||
dynamic "spot_options" {
|
||||
for_each = lookup(instance_market_options.value, "spot_options", null) != null ? [instance_market_options.value.spot_options] : []
|
||||
content {
|
||||
block_duration_minutes = spot_options.value.block_duration_minutes
|
||||
instance_interruption_behavior = lookup(spot_options.value, "instance_interruption_behavior", null)
|
||||
max_price = lookup(spot_options.value, "max_price", null)
|
||||
spot_instance_type = lookup(spot_options.value, "spot_instance_type", null)
|
||||
valid_until = lookup(spot_options.value, "valid_until", null)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "license_specification" {
|
||||
for_each = var.license_specifications != null ? [var.license_specifications] : []
|
||||
content {
|
||||
license_configuration_arn = license_specifications.value.license_configuration_arn
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "metadata_options" {
|
||||
for_each = var.metadata_options != null ? [var.metadata_options] : []
|
||||
content {
|
||||
http_endpoint = lookup(metadata_options.value, "http_endpoint", null)
|
||||
http_tokens = lookup(metadata_options.value, "http_tokens", null)
|
||||
http_put_response_hop_limit = lookup(metadata_options.value, "http_put_response_hop_limit", null)
|
||||
http_protocol_ipv6 = lookup(metadata_options.value, "http_protocol_ipv6", null)
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "monitoring" {
|
||||
for_each = var.enable_monitoring != null ? [1] : []
|
||||
content {
|
||||
enabled = var.enable_monitoring
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "network_interfaces" {
|
||||
for_each = var.network_interfaces
|
||||
content {
|
||||
associate_carrier_ip_address = lookup(network_interfaces.value, "associate_carrier_ip_address", null)
|
||||
associate_public_ip_address = lookup(network_interfaces.value, "associate_public_ip_address", null)
|
||||
delete_on_termination = lookup(network_interfaces.value, "delete_on_termination", null)
|
||||
description = lookup(network_interfaces.value, "description", null)
|
||||
device_index = lookup(network_interfaces.value, "device_index", null)
|
||||
ipv4_addresses = lookup(network_interfaces.value, "ipv4_addresses", null) != null ? network_interfaces.value.ipv4_addresses : []
|
||||
ipv4_address_count = lookup(network_interfaces.value, "ipv4_address_count", null)
|
||||
ipv6_addresses = lookup(network_interfaces.value, "ipv6_addresses", null) != null ? network_interfaces.value.ipv6_addresses : []
|
||||
ipv6_address_count = lookup(network_interfaces.value, "ipv6_address_count", null)
|
||||
network_interface_id = lookup(network_interfaces.value, "network_interface_id", null)
|
||||
private_ip_address = lookup(network_interfaces.value, "private_ip_address", null)
|
||||
security_groups = lookup(network_interfaces.value, "security_groups", null) != null ? network_interfaces.value.security_groups : []
|
||||
# Set on EKS managed node group, will fail if set here
|
||||
# https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html#launch-template-basics
|
||||
# subnet_id = lookup(network_interfaces.value, "subnet_id", null)
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "placement" {
|
||||
for_each = var.placement != null ? [var.placement] : []
|
||||
content {
|
||||
affinity = lookup(placement.value, "affinity", null)
|
||||
availability_zone = lookup(placement.value, "availability_zone", null)
|
||||
group_name = lookup(placement.value, "group_name", null)
|
||||
host_id = lookup(placement.value, "host_id", null)
|
||||
spread_domain = lookup(placement.value, "spread_domain", null)
|
||||
tenancy = lookup(placement.value, "tenancy", null)
|
||||
partition_number = lookup(placement.value, "partition_number", null)
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "tag_specifications" {
|
||||
for_each = toset(["instance", "volume", "network-interface"])
|
||||
content {
|
||||
resource_type = tag_specifications.key
|
||||
tags = merge(var.tags, { Name = var.name })
|
||||
}
|
||||
}
|
||||
|
||||
lifecycle {
|
||||
create_before_destroy = true
|
||||
}
|
||||
|
||||
# Prevent premature access of security group roles and policies by pods that
|
||||
# require permissions on create/destroy that depend on nodes
|
||||
depends_on = [
|
||||
aws_security_group_rule.this,
|
||||
aws_iam_role_policy_attachment.this,
|
||||
]
|
||||
|
||||
tags = var.tags
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Node Group
|
||||
################################################################################
|
||||
|
||||
locals {
|
||||
launch_template_name = try(aws_launch_template.this[0].name, var.launch_template_name, null)
|
||||
# Change order to allow users to set version priority before using defaults
|
||||
launch_template_version = coalesce(var.launch_template_version, try(aws_launch_template.this[0].default_version, "$Default"))
|
||||
}
|
||||
|
||||
resource "aws_eks_node_group" "this" {
|
||||
count = var.create ? 1 : 0
|
||||
|
||||
# Required
|
||||
cluster_name = var.cluster_name
|
||||
node_role_arn = var.create_iam_role ? aws_iam_role.this[0].arn : var.iam_role_arn
|
||||
subnet_ids = var.subnet_ids
|
||||
|
||||
scaling_config {
|
||||
min_size = var.min_size
|
||||
max_size = var.max_size
|
||||
desired_size = var.desired_size
|
||||
}
|
||||
|
||||
# Optional
|
||||
node_group_name = var.use_name_prefix ? null : var.name
|
||||
node_group_name_prefix = var.use_name_prefix ? "${var.name}-" : null
|
||||
|
||||
# https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html#launch-template-custom-ami
|
||||
ami_type = var.ami_id != "" ? null : var.ami_type
|
||||
release_version = var.ami_id != "" ? null : var.ami_release_version
|
||||
version = var.ami_id != "" ? null : var.cluster_version
|
||||
|
||||
capacity_type = var.capacity_type
|
||||
disk_size = local.use_custom_launch_template ? null : var.disk_size # if using LT, set disk size on LT or else it will error here
|
||||
force_update_version = var.force_update_version
|
||||
instance_types = var.instance_types
|
||||
labels = var.labels
|
||||
|
||||
dynamic "launch_template" {
|
||||
for_each = local.use_custom_launch_template ? [1] : []
|
||||
content {
|
||||
name = local.launch_template_name
|
||||
version = local.launch_template_version
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "remote_access" {
|
||||
for_each = var.remote_access
|
||||
content {
|
||||
ec2_ssh_key = lookup(remote_access.value, "ec2_ssh_key", null)
|
||||
source_security_group_ids = lookup(remote_access.value, "source_security_group_ids", [])
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "taint" {
|
||||
for_each = var.taints
|
||||
content {
|
||||
key = taint.value.key
|
||||
value = lookup(taint.value, "value")
|
||||
effect = taint.value.effect
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "update_config" {
|
||||
for_each = length(var.update_config) > 0 ? [var.update_config] : []
|
||||
content {
|
||||
max_unavailable_percentage = try(update_config.value.max_unavailable_percentage, null)
|
||||
max_unavailable = try(update_config.value.max_unavailable, null)
|
||||
}
|
||||
}
|
||||
|
||||
timeouts {
|
||||
create = lookup(var.timeouts, "create", null)
|
||||
update = lookup(var.timeouts, "update", null)
|
||||
delete = lookup(var.timeouts, "delete", null)
|
||||
}
|
||||
|
||||
lifecycle {
|
||||
create_before_destroy = true
|
||||
ignore_changes = [
|
||||
scaling_config[0].desired_size,
|
||||
]
|
||||
}
|
||||
|
||||
tags = merge(
|
||||
var.tags,
|
||||
{ Name = var.name }
|
||||
)
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Security Group
|
||||
################################################################################
|
||||
|
||||
locals {
|
||||
security_group_name = coalesce(var.security_group_name, "${var.name}-eks-node-group")
|
||||
create_security_group = var.create && var.create_security_group
|
||||
}
|
||||
|
||||
resource "aws_security_group" "this" {
|
||||
count = local.create_security_group ? 1 : 0
|
||||
|
||||
name = var.security_group_use_name_prefix ? null : local.security_group_name
|
||||
name_prefix = var.security_group_use_name_prefix ? "${local.security_group_name}-" : null
|
||||
description = var.security_group_description
|
||||
vpc_id = var.vpc_id
|
||||
|
||||
tags = merge(
|
||||
var.tags,
|
||||
{ "Name" = local.security_group_name },
|
||||
var.security_group_tags
|
||||
)
|
||||
}
|
||||
|
||||
resource "aws_security_group_rule" "this" {
|
||||
for_each = { for k, v in var.security_group_rules : k => v if local.create_security_group }
|
||||
|
||||
# Required
|
||||
security_group_id = aws_security_group.this[0].id
|
||||
protocol = each.value.protocol
|
||||
from_port = each.value.from_port
|
||||
to_port = each.value.to_port
|
||||
type = each.value.type
|
||||
|
||||
# Optional
|
||||
description = try(each.value.description, null)
|
||||
cidr_blocks = try(each.value.cidr_blocks, null)
|
||||
ipv6_cidr_blocks = try(each.value.ipv6_cidr_blocks, null)
|
||||
prefix_list_ids = try(each.value.prefix_list_ids, [])
|
||||
self = try(each.value.self, null)
|
||||
source_security_group_id = try(
|
||||
each.value.source_security_group_id,
|
||||
try(each.value.source_cluster_security_group, false) ? var.cluster_security_group_id : null
|
||||
)
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# IAM Role
|
||||
################################################################################
|
||||
|
||||
locals {
|
||||
iam_role_name = coalesce(var.iam_role_name, "${var.name}-eks-node-group")
|
||||
policy_arn_prefix = "arn:${data.aws_partition.current.partition}:iam::aws:policy"
|
||||
}
|
||||
|
||||
data "aws_iam_policy_document" "assume_role_policy" {
|
||||
count = var.create && var.create_iam_role ? 1 : 0
|
||||
|
||||
statement {
|
||||
sid = "EKSNodeAssumeRole"
|
||||
actions = ["sts:AssumeRole"]
|
||||
|
||||
principals {
|
||||
type = "Service"
|
||||
identifiers = ["ec2.${data.aws_partition.current.dns_suffix}"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_iam_role" "this" {
|
||||
count = var.create && var.create_iam_role ? 1 : 0
|
||||
|
||||
name = var.iam_role_use_name_prefix ? null : local.iam_role_name
|
||||
name_prefix = var.iam_role_use_name_prefix ? "${local.iam_role_name}-" : null
|
||||
path = var.iam_role_path
|
||||
description = var.iam_role_description
|
||||
|
||||
assume_role_policy = data.aws_iam_policy_document.assume_role_policy[0].json
|
||||
permissions_boundary = var.iam_role_permissions_boundary
|
||||
force_detach_policies = true
|
||||
|
||||
tags = merge(var.tags, var.iam_role_tags)
|
||||
}
|
||||
|
||||
# Policies attached ref https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/eks_node_group
|
||||
resource "aws_iam_role_policy_attachment" "this" {
|
||||
for_each = var.create && var.create_iam_role ? toset(compact(distinct(concat([
|
||||
"${local.policy_arn_prefix}/AmazonEKSWorkerNodePolicy",
|
||||
"${local.policy_arn_prefix}/AmazonEC2ContainerRegistryReadOnly",
|
||||
"${local.policy_arn_prefix}/AmazonEKS_CNI_Policy",
|
||||
], var.iam_role_additional_policies)))) : toset([])
|
||||
|
||||
policy_arn = each.value
|
||||
role = aws_iam_role.this[0].name
|
||||
}
|
||||
75
modules/eks-managed-node-group/outputs.tf
Normal file
75
modules/eks-managed-node-group/outputs.tf
Normal file
@@ -0,0 +1,75 @@
|
||||
################################################################################
|
||||
# Launch template
|
||||
################################################################################
|
||||
|
||||
output "launch_template_id" {
|
||||
description = "The ID of the launch template"
|
||||
value = try(aws_launch_template.this[0].id, "")
|
||||
}
|
||||
|
||||
output "launch_template_arn" {
|
||||
description = "The ARN of the launch template"
|
||||
value = try(aws_launch_template.this[0].arn, "")
|
||||
}
|
||||
|
||||
output "launch_template_latest_version" {
|
||||
description = "The latest version of the launch template"
|
||||
value = try(aws_launch_template.this[0].latest_version, "")
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Node Group
|
||||
################################################################################
|
||||
|
||||
output "node_group_arn" {
|
||||
description = "Amazon Resource Name (ARN) of the EKS Node Group"
|
||||
value = try(aws_eks_node_group.this[0].arn, "")
|
||||
}
|
||||
|
||||
output "node_group_id" {
|
||||
description = "EKS Cluster name and EKS Node Group name separated by a colon (`:`)"
|
||||
value = try(aws_eks_node_group.this[0].id, "")
|
||||
}
|
||||
|
||||
output "node_group_resources" {
|
||||
description = "List of objects containing information about underlying resources"
|
||||
value = try(aws_eks_node_group.this[0].resources, "")
|
||||
}
|
||||
|
||||
output "node_group_status" {
|
||||
description = "Status of the EKS Node Group"
|
||||
value = try(aws_eks_node_group.this[0].arn, "")
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Security Group
|
||||
################################################################################
|
||||
|
||||
output "security_group_arn" {
|
||||
description = "Amazon Resource Name (ARN) of the security group"
|
||||
value = try(aws_security_group.this[0].arn, "")
|
||||
}
|
||||
|
||||
output "security_group_id" {
|
||||
description = "ID of the security group"
|
||||
value = try(aws_security_group.this[0].id, "")
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# IAM Role
|
||||
################################################################################
|
||||
|
||||
output "iam_role_name" {
|
||||
description = "The name of the IAM role"
|
||||
value = try(aws_iam_role.this[0].name, "")
|
||||
}
|
||||
|
||||
output "iam_role_arn" {
|
||||
description = "The Amazon Resource Name (ARN) specifying the IAM role"
|
||||
value = try(aws_iam_role.this[0].arn, "")
|
||||
}
|
||||
|
||||
output "iam_role_unique_id" {
|
||||
description = "Stable and unique string identifying the IAM role"
|
||||
value = try(aws_iam_role.this[0].unique_id, "")
|
||||
}
|
||||
467
modules/eks-managed-node-group/variables.tf
Normal file
467
modules/eks-managed-node-group/variables.tf
Normal file
@@ -0,0 +1,467 @@
|
||||
variable "create" {
|
||||
description = "Determines whether to create EKS managed node group or not"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "tags" {
|
||||
description = "A map of tags to add to all resources"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "platform" {
|
||||
description = "Identifies if the OS platform is `bottlerocket` or `linux` based; `windows` is not supported"
|
||||
type = string
|
||||
default = "linux"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# User Data
|
||||
################################################################################
|
||||
|
||||
variable "enable_bootstrap_user_data" {
|
||||
description = "Determines whether the bootstrap configurations are populated within the user data template"
|
||||
type = bool
|
||||
default = false
|
||||
}
|
||||
|
||||
variable "cluster_name" {
|
||||
description = "Name of associated EKS cluster"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "cluster_endpoint" {
|
||||
description = "Endpoint of associated EKS cluster"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "cluster_auth_base64" {
|
||||
description = "Base64 encoded CA of associated EKS cluster"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "cluster_service_ipv4_cidr" {
|
||||
description = "The CIDR block to assign Kubernetes service IP addresses from. If you don't specify a block, Kubernetes assigns addresses from either the 10.100.0.0/16 or 172.20.0.0/16 CIDR blocks"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "pre_bootstrap_user_data" {
|
||||
description = "User data that is injected into the user data script ahead of the EKS bootstrap script. Not used when `platform` = `bottlerocket`"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "post_bootstrap_user_data" {
|
||||
description = "User data that is appended to the user data script after of the EKS bootstrap script. Not used when `platform` = `bottlerocket`"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "bootstrap_extra_args" {
|
||||
description = "Additional arguments passed to the bootstrap script. When `platform` = `bottlerocket`; these are additional [settings](https://github.com/bottlerocket-os/bottlerocket#settings) that are provided to the Bottlerocket user data"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "user_data_template_path" {
|
||||
description = "Path to a local, custom user data template file to use when rendering user data"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Launch template
|
||||
################################################################################
|
||||
|
||||
variable "create_launch_template" {
|
||||
description = "Determines whether to create a launch template or not. If set to `false`, EKS will use its own default launch template"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "launch_template_name" {
|
||||
description = "Launch template name - either to be created (`var.create_launch_template` = `true`) or existing (`var.create_launch_template` = `false`)"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "launch_template_use_name_prefix" {
|
||||
description = "Determines whether to use `launch_template_name` as is or create a unique name beginning with the `launch_template_name` as the prefix"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "launch_template_description" {
|
||||
description = "Description of the launch template"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "ebs_optimized" {
|
||||
description = "If true, the launched EC2 instance(s) will be EBS-optimized"
|
||||
type = bool
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "ami_id" {
|
||||
description = "The AMI from which to launch the instance. If not supplied, EKS will use its own default image"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "key_name" {
|
||||
description = "The key name that should be used for the instance(s)"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "vpc_security_group_ids" {
|
||||
description = "A list of security group IDs to associate"
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "launch_template_default_version" {
|
||||
description = "Default version of the launch template"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "update_launch_template_default_version" {
|
||||
description = "Whether to update the launch templates default version on each update. Conflicts with `launch_template_default_version`"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "disable_api_termination" {
|
||||
description = "If true, enables EC2 instance termination protection"
|
||||
type = bool
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "kernel_id" {
|
||||
description = "The kernel ID"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "ram_disk_id" {
|
||||
description = "The ID of the ram disk"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "block_device_mappings" {
|
||||
description = "Specify volumes to attach to the instance besides the volumes specified by the AMI"
|
||||
type = any
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "capacity_reservation_specification" {
|
||||
description = "Targeting for EC2 capacity reservations"
|
||||
type = any
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "cpu_options" {
|
||||
description = "The CPU options for the instance"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "credit_specification" {
|
||||
description = "Customize the credit specification of the instance"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "elastic_gpu_specifications" {
|
||||
description = "The elastic GPU to attach to the instance"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "elastic_inference_accelerator" {
|
||||
description = "Configuration block containing an Elastic Inference Accelerator to attach to the instance"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "enclave_options" {
|
||||
description = "Enable Nitro Enclaves on launched instances"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "instance_market_options" {
|
||||
description = "The market (purchasing) option for the instance"
|
||||
type = any
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "license_specifications" {
|
||||
description = "A list of license specifications to associate with"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "metadata_options" {
|
||||
description = "Customize the metadata options for the instance"
|
||||
type = map(string)
|
||||
default = {
|
||||
http_endpoint = "enabled"
|
||||
http_tokens = "required"
|
||||
http_put_response_hop_limit = 2
|
||||
}
|
||||
}
|
||||
|
||||
variable "enable_monitoring" {
|
||||
description = "Enables/disables detailed monitoring"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "network_interfaces" {
|
||||
description = "Customize network interfaces to be attached at instance boot time"
|
||||
type = list(any)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "placement" {
|
||||
description = "The placement of the instance"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# EKS Managed Node Group
|
||||
################################################################################
|
||||
|
||||
variable "subnet_ids" {
|
||||
description = "Identifiers of EC2 Subnets to associate with the EKS Node Group. These subnets must have the following resource tag: `kubernetes.io/cluster/CLUSTER_NAME`"
|
||||
type = list(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "min_size" {
|
||||
description = "Minimum number of instances/nodes"
|
||||
type = number
|
||||
default = 0
|
||||
}
|
||||
|
||||
variable "max_size" {
|
||||
description = "Maximum number of instances/nodes"
|
||||
type = number
|
||||
default = 3
|
||||
}
|
||||
|
||||
variable "desired_size" {
|
||||
description = "Desired number of instances/nodes"
|
||||
type = number
|
||||
default = 1
|
||||
}
|
||||
|
||||
variable "name" {
|
||||
description = "Name of the EKS managed node group"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "use_name_prefix" {
|
||||
description = "Determines whether to use `name` as is or create a unique name beginning with the `name` as the prefix"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "ami_type" {
|
||||
description = "Type of Amazon Machine Image (AMI) associated with the EKS Node Group. Valid values are `AL2_x86_64`, `AL2_x86_64_GPU`, `AL2_ARM_64`, `CUSTOM`, `BOTTLEROCKET_ARM_64`, `BOTTLEROCKET_x86_64`"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "ami_release_version" {
|
||||
description = "AMI version of the EKS Node Group. Defaults to latest version for Kubernetes version"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "capacity_type" {
|
||||
description = "Type of capacity associated with the EKS Node Group. Valid values: `ON_DEMAND`, `SPOT`"
|
||||
type = string
|
||||
default = "ON_DEMAND"
|
||||
}
|
||||
|
||||
variable "disk_size" {
|
||||
description = "Disk size in GiB for nodes. Defaults to `20`"
|
||||
type = number
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "force_update_version" {
|
||||
description = "Force version update if existing pods are unable to be drained due to a pod disruption budget issue"
|
||||
type = bool
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "instance_types" {
|
||||
description = "Set of instance types associated with the EKS Node Group. Defaults to `[\"t3.medium\"]`"
|
||||
type = list(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "labels" {
|
||||
description = "Key-value map of Kubernetes labels. Only labels that are applied with the EKS API are managed by this argument. Other Kubernetes labels applied to the EKS Node Group will not be managed"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "cluster_version" {
|
||||
description = "Kubernetes version. Defaults to EKS Cluster Kubernetes version"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "launch_template_version" {
|
||||
description = "Launch template version number. The default is `$Default`"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "remote_access" {
|
||||
description = "Configuration block with remote access settings"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "taints" {
|
||||
description = "The Kubernetes taints to be applied to the nodes in the node group. Maximum of 50 taints per node group"
|
||||
type = any
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "update_config" {
|
||||
description = "Configuration block of settings for max unavailable resources during node group updates"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "timeouts" {
|
||||
description = "Create, update, and delete timeout configurations for the node group"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Security Group
|
||||
################################################################################
|
||||
|
||||
variable "create_security_group" {
|
||||
description = "Determines whether to create a security group"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "security_group_name" {
|
||||
description = "Name to use on security group created"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "security_group_use_name_prefix" {
|
||||
description = "Determines whether the security group name (`security_group_name`) is used as a prefix"
|
||||
type = string
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "security_group_description" {
|
||||
description = "Description for the security group created"
|
||||
type = string
|
||||
default = "EKS managed node group security group"
|
||||
}
|
||||
|
||||
variable "vpc_id" {
|
||||
description = "ID of the VPC where the security group/nodes will be provisioned"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "security_group_rules" {
|
||||
description = "List of security group rules to add to the security group created"
|
||||
type = any
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "cluster_security_group_id" {
|
||||
description = "Cluster control plane security group ID"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "security_group_tags" {
|
||||
description = "A map of additional tags to add to the security group created"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# IAM Role
|
||||
################################################################################
|
||||
|
||||
variable "create_iam_role" {
|
||||
description = "Determines whether an IAM role is created or to use an existing IAM role"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "iam_role_arn" {
|
||||
description = "Existing IAM role ARN for the node group. Required if `create_iam_role` is set to `false`"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_name" {
|
||||
description = "Name to use on IAM role created"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_use_name_prefix" {
|
||||
description = "Determines whether the IAM role name (`iam_role_name`) is used as a prefix"
|
||||
type = string
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "iam_role_path" {
|
||||
description = "IAM role path"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_description" {
|
||||
description = "Description of the role"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_permissions_boundary" {
|
||||
description = "ARN of the policy that is used to set the permissions boundary for the IAM role"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_additional_policies" {
|
||||
description = "Additional policies to be added to the IAM role"
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "iam_role_tags" {
|
||||
description = "A map of additional tags to add to the IAM role created"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ terraform {
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = ">= 3.56"
|
||||
version = ">= 3.64"
|
||||
}
|
||||
cloudinit = {
|
||||
source = "hashicorp/cloudinit"
|
||||
85
modules/fargate-profile/README.md
Normal file
85
modules/fargate-profile/README.md
Normal file
@@ -0,0 +1,85 @@
|
||||
# EKS Fargate Profile Module
|
||||
|
||||
Configuration in this directory creates a Fargate EKS Profile
|
||||
|
||||
## Usage
|
||||
|
||||
```hcl
|
||||
module "fargate_profile" {
|
||||
source = "terraform-aws-modules/eks/aws//modules/fargate-profile"
|
||||
|
||||
name = "separate-fargate-profile"
|
||||
cluster_name = "my-cluster"
|
||||
|
||||
subnet_ids = ["subnet-abcde012", "subnet-bcde012a", "subnet-fghi345a"]
|
||||
selectors = [{
|
||||
namespace = "kube-system"
|
||||
}]
|
||||
|
||||
tags = {
|
||||
Environment = "dev"
|
||||
Terraform = "true"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
|
||||
## Requirements
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 0.13.1 |
|
||||
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 3.64 |
|
||||
|
||||
## Providers
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 3.64 |
|
||||
|
||||
## Modules
|
||||
|
||||
No modules.
|
||||
|
||||
## Resources
|
||||
|
||||
| Name | Type |
|
||||
|------|------|
|
||||
| [aws_eks_fargate_profile.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/eks_fargate_profile) | resource |
|
||||
| [aws_iam_role.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
|
||||
| [aws_iam_role_policy_attachment.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
|
||||
| [aws_iam_policy_document.assume_role_policy](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |
|
||||
| [aws_partition.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/partition) | data source |
|
||||
|
||||
## Inputs
|
||||
|
||||
| Name | Description | Type | Default | Required |
|
||||
|------|-------------|------|---------|:--------:|
|
||||
| <a name="input_cluster_name"></a> [cluster\_name](#input\_cluster\_name) | Name of the EKS cluster | `string` | `null` | no |
|
||||
| <a name="input_create"></a> [create](#input\_create) | Determines whether to create Fargate profile or not | `bool` | `true` | no |
|
||||
| <a name="input_create_iam_role"></a> [create\_iam\_role](#input\_create\_iam\_role) | Determines whether an IAM role is created or to use an existing IAM role | `bool` | `true` | no |
|
||||
| <a name="input_iam_role_additional_policies"></a> [iam\_role\_additional\_policies](#input\_iam\_role\_additional\_policies) | Additional policies to be added to the IAM role | `list(string)` | `[]` | no |
|
||||
| <a name="input_iam_role_arn"></a> [iam\_role\_arn](#input\_iam\_role\_arn) | Existing IAM role ARN for the Fargate profile. Required if `create_iam_role` is set to `false` | `string` | `null` | no |
|
||||
| <a name="input_iam_role_description"></a> [iam\_role\_description](#input\_iam\_role\_description) | Description of the role | `string` | `null` | no |
|
||||
| <a name="input_iam_role_name"></a> [iam\_role\_name](#input\_iam\_role\_name) | Name to use on IAM role created | `string` | `""` | no |
|
||||
| <a name="input_iam_role_path"></a> [iam\_role\_path](#input\_iam\_role\_path) | IAM role path | `string` | `null` | no |
|
||||
| <a name="input_iam_role_permissions_boundary"></a> [iam\_role\_permissions\_boundary](#input\_iam\_role\_permissions\_boundary) | ARN of the policy that is used to set the permissions boundary for the IAM role | `string` | `null` | no |
|
||||
| <a name="input_iam_role_tags"></a> [iam\_role\_tags](#input\_iam\_role\_tags) | A map of additional tags to add to the IAM role created | `map(string)` | `{}` | no |
|
||||
| <a name="input_iam_role_use_name_prefix"></a> [iam\_role\_use\_name\_prefix](#input\_iam\_role\_use\_name\_prefix) | Determines whether the IAM role name (`iam_role_name`) is used as a prefix | `string` | `true` | no |
|
||||
| <a name="input_name"></a> [name](#input\_name) | Name of the EKS Fargate Profile | `string` | `""` | no |
|
||||
| <a name="input_selectors"></a> [selectors](#input\_selectors) | Configuration block(s) for selecting Kubernetes Pods to execute with this Fargate Profile | `any` | `[]` | no |
|
||||
| <a name="input_subnet_ids"></a> [subnet\_ids](#input\_subnet\_ids) | A list of subnet IDs for the EKS Fargate Profile | `list(string)` | `[]` | no |
|
||||
| <a name="input_tags"></a> [tags](#input\_tags) | A map of tags to add to all resources | `map(string)` | `{}` | no |
|
||||
| <a name="input_timeouts"></a> [timeouts](#input\_timeouts) | Create and delete timeout configurations for the Fargate Profile | `map(string)` | `{}` | no |
|
||||
|
||||
## Outputs
|
||||
|
||||
| Name | Description |
|
||||
|------|-------------|
|
||||
| <a name="output_fargate_profile_arn"></a> [fargate\_profile\_arn](#output\_fargate\_profile\_arn) | Amazon Resource Name (ARN) of the EKS Fargate Profile |
|
||||
| <a name="output_fargate_profile_id"></a> [fargate\_profile\_id](#output\_fargate\_profile\_id) | EKS Cluster name and EKS Fargate Profile name separated by a colon (`:`) |
|
||||
| <a name="output_fargate_profile_status"></a> [fargate\_profile\_status](#output\_fargate\_profile\_status) | Status of the EKS Fargate Profile |
|
||||
| <a name="output_iam_role_arn"></a> [iam\_role\_arn](#output\_iam\_role\_arn) | The Amazon Resource Name (ARN) specifying the IAM role |
|
||||
| <a name="output_iam_role_name"></a> [iam\_role\_name](#output\_iam\_role\_name) | The name of the IAM role |
|
||||
| <a name="output_iam_role_unique_id"></a> [iam\_role\_unique\_id](#output\_iam\_role\_unique\_id) | Stable and unique string identifying the IAM role |
|
||||
<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
|
||||
80
modules/fargate-profile/main.tf
Normal file
80
modules/fargate-profile/main.tf
Normal file
@@ -0,0 +1,80 @@
|
||||
data "aws_partition" "current" {}
|
||||
|
||||
locals {
|
||||
iam_role_name = coalesce(var.iam_role_name, var.name, "fargate-profile")
|
||||
policy_arn_prefix = "arn:${data.aws_partition.current.partition}:iam::aws:policy"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# IAM Role
|
||||
################################################################################
|
||||
|
||||
data "aws_iam_policy_document" "assume_role_policy" {
|
||||
count = var.create && var.create_iam_role ? 1 : 0
|
||||
|
||||
statement {
|
||||
effect = "Allow"
|
||||
actions = ["sts:AssumeRole"]
|
||||
|
||||
principals {
|
||||
type = "Service"
|
||||
identifiers = ["eks-fargate-pods.amazonaws.com"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_iam_role" "this" {
|
||||
count = var.create && var.create_iam_role ? 1 : 0
|
||||
|
||||
name = var.iam_role_use_name_prefix ? null : local.iam_role_name
|
||||
name_prefix = var.iam_role_use_name_prefix ? "${local.iam_role_name}-" : null
|
||||
path = var.iam_role_path
|
||||
description = var.iam_role_description
|
||||
|
||||
assume_role_policy = data.aws_iam_policy_document.assume_role_policy[0].json
|
||||
permissions_boundary = var.iam_role_permissions_boundary
|
||||
force_detach_policies = true
|
||||
|
||||
tags = merge(var.tags, var.iam_role_tags)
|
||||
}
|
||||
|
||||
resource "aws_iam_role_policy_attachment" "this" {
|
||||
for_each = var.create && var.create_iam_role ? toset(compact(distinct(concat([
|
||||
"${local.policy_arn_prefix}/AmazonEKSFargatePodExecutionRolePolicy",
|
||||
], var.iam_role_additional_policies)))) : toset([])
|
||||
|
||||
policy_arn = each.value
|
||||
role = aws_iam_role.this[0].name
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Fargate Profile
|
||||
################################################################################
|
||||
|
||||
resource "aws_eks_fargate_profile" "this" {
|
||||
count = var.create ? 1 : 0
|
||||
|
||||
cluster_name = var.cluster_name
|
||||
fargate_profile_name = var.name
|
||||
pod_execution_role_arn = var.create_iam_role ? aws_iam_role.this[0].arn : var.iam_role_arn
|
||||
subnet_ids = var.subnet_ids
|
||||
|
||||
dynamic "selector" {
|
||||
for_each = var.selectors
|
||||
|
||||
content {
|
||||
namespace = selector.value.namespace
|
||||
labels = lookup(selector.value, "labels", {})
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "timeouts" {
|
||||
for_each = [var.timeouts]
|
||||
content {
|
||||
create = lookup(var.timeouts, "create", null)
|
||||
delete = lookup(var.timeouts, "delete", null)
|
||||
}
|
||||
}
|
||||
|
||||
tags = var.tags
|
||||
}
|
||||
37
modules/fargate-profile/outputs.tf
Normal file
37
modules/fargate-profile/outputs.tf
Normal file
@@ -0,0 +1,37 @@
|
||||
################################################################################
|
||||
# IAM Role
|
||||
################################################################################
|
||||
|
||||
output "iam_role_name" {
|
||||
description = "The name of the IAM role"
|
||||
value = try(aws_iam_role.this[0].name, "")
|
||||
}
|
||||
|
||||
output "iam_role_arn" {
|
||||
description = "The Amazon Resource Name (ARN) specifying the IAM role"
|
||||
value = try(aws_iam_role.this[0].arn, "")
|
||||
}
|
||||
|
||||
output "iam_role_unique_id" {
|
||||
description = "Stable and unique string identifying the IAM role"
|
||||
value = try(aws_iam_role.this[0].unique_id, "")
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Fargate Profile
|
||||
################################################################################
|
||||
|
||||
output "fargate_profile_arn" {
|
||||
description = "Amazon Resource Name (ARN) of the EKS Fargate Profile"
|
||||
value = try(aws_eks_fargate_profile.this[0].arn, "")
|
||||
}
|
||||
|
||||
output "fargate_profile_id" {
|
||||
description = "EKS Cluster name and EKS Fargate Profile name separated by a colon (`:`)"
|
||||
value = try(aws_eks_fargate_profile.this[0].id, "")
|
||||
}
|
||||
|
||||
output "fargate_profile_status" {
|
||||
description = "Status of the EKS Fargate Profile"
|
||||
value = try(aws_eks_fargate_profile.this[0].status, "")
|
||||
}
|
||||
103
modules/fargate-profile/variables.tf
Normal file
103
modules/fargate-profile/variables.tf
Normal file
@@ -0,0 +1,103 @@
|
||||
variable "create" {
|
||||
description = "Determines whether to create Fargate profile or not"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "tags" {
|
||||
description = "A map of tags to add to all resources"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# IAM Role
|
||||
################################################################################
|
||||
|
||||
variable "create_iam_role" {
|
||||
description = "Determines whether an IAM role is created or to use an existing IAM role"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "iam_role_arn" {
|
||||
description = "Existing IAM role ARN for the Fargate profile. Required if `create_iam_role` is set to `false`"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_name" {
|
||||
description = "Name to use on IAM role created"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "iam_role_use_name_prefix" {
|
||||
description = "Determines whether the IAM role name (`iam_role_name`) is used as a prefix"
|
||||
type = string
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "iam_role_path" {
|
||||
description = "IAM role path"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_description" {
|
||||
description = "Description of the role"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_permissions_boundary" {
|
||||
description = "ARN of the policy that is used to set the permissions boundary for the IAM role"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_additional_policies" {
|
||||
description = "Additional policies to be added to the IAM role"
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "iam_role_tags" {
|
||||
description = "A map of additional tags to add to the IAM role created"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Fargate Profile
|
||||
################################################################################
|
||||
|
||||
variable "cluster_name" {
|
||||
description = "Name of the EKS cluster"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "name" {
|
||||
description = "Name of the EKS Fargate Profile"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "subnet_ids" {
|
||||
description = "A list of subnet IDs for the EKS Fargate Profile"
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "selectors" {
|
||||
description = "Configuration block(s) for selecting Kubernetes Pods to execute with this Fargate Profile"
|
||||
type = any
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "timeouts" {
|
||||
description = "Create and delete timeout configurations for the Fargate Profile"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ terraform {
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = ">= 3.56"
|
||||
version = ">= 3.64"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
# EKS `fargate` submodule
|
||||
|
||||
Helper submodule to create and manage resources related to `aws_eks_fargate_profile`.
|
||||
|
||||
## `fargate_profile` keys
|
||||
|
||||
`fargate_profile` is a map of maps. Key of first level will be used as unique value for `for_each` resources and in the `aws_eks_fargate_profile` name. Inner map can take the below values.
|
||||
|
||||
## Example
|
||||
|
||||
See example code in `examples/fargate`.
|
||||
|
||||
| Name | Description | Type | Default | Required |
|
||||
|------|-------------|------|---------|:--------:|
|
||||
| name | Fargate profile name | `string` | Auto generated in the following format `[cluster_name]-fargate-[fargate_profile_map_key]`| no |
|
||||
| selectors | A list of Kubernetes selectors. See examples/fargate/main.tf for example format. | <pre>list(map({<br>namespace = string<br>labels = map(string)<br>}))</pre>| `[]` | no |
|
||||
| subnets | List of subnet IDs. Will replace the root module subnets. | `list(string)` | `var.subnets` | no |
|
||||
| timeouts | A map of timeouts for create/delete operations. | `map(string)` | Provider default behavior | no |
|
||||
| tags | Key-value map of resource tags. Will be merged with root module tags. | `map(string)` | `var.tags` | no |
|
||||
|
||||
<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
|
||||
## Requirements
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 0.13.1 |
|
||||
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 3.56 |
|
||||
|
||||
## Providers
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 3.56 |
|
||||
|
||||
## Modules
|
||||
|
||||
No modules.
|
||||
|
||||
## Resources
|
||||
|
||||
| Name | Type |
|
||||
|------|------|
|
||||
| [aws_eks_fargate_profile.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/eks_fargate_profile) | resource |
|
||||
| [aws_iam_role.eks_fargate_pod](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
|
||||
| [aws_iam_role_policy_attachment.eks_fargate_pod](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
|
||||
| [aws_iam_policy_document.eks_fargate_pod_assume_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |
|
||||
| [aws_iam_role.custom_fargate_iam_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_role) | data source |
|
||||
| [aws_partition.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/partition) | data source |
|
||||
|
||||
## Inputs
|
||||
|
||||
| Name | Description | Type | Default | Required |
|
||||
|------|-------------|------|---------|:--------:|
|
||||
| <a name="input_cluster_name"></a> [cluster\_name](#input\_cluster\_name) | Name of the EKS cluster. | `string` | `""` | no |
|
||||
| <a name="input_create_eks"></a> [create\_eks](#input\_create\_eks) | Controls if EKS resources should be created (it affects almost all resources) | `bool` | `true` | no |
|
||||
| <a name="input_create_fargate_pod_execution_role"></a> [create\_fargate\_pod\_execution\_role](#input\_create\_fargate\_pod\_execution\_role) | Controls if the the IAM Role that provides permissions for the EKS Fargate Profile should be created. | `bool` | `true` | no |
|
||||
| <a name="input_fargate_pod_execution_role_name"></a> [fargate\_pod\_execution\_role\_name](#input\_fargate\_pod\_execution\_role\_name) | The IAM Role that provides permissions for the EKS Fargate Profile. | `string` | `null` | no |
|
||||
| <a name="input_fargate_profiles"></a> [fargate\_profiles](#input\_fargate\_profiles) | Fargate profiles to create. See `fargate_profile` keys section in README.md for more details | `any` | `{}` | no |
|
||||
| <a name="input_iam_path"></a> [iam\_path](#input\_iam\_path) | IAM roles will be created on this path. | `string` | `"/"` | no |
|
||||
| <a name="input_permissions_boundary"></a> [permissions\_boundary](#input\_permissions\_boundary) | If provided, all IAM roles will be created with this permissions boundary attached. | `string` | `null` | no |
|
||||
| <a name="input_subnets"></a> [subnets](#input\_subnets) | A list of subnets for the EKS Fargate profiles. | `list(string)` | `[]` | no |
|
||||
| <a name="input_tags"></a> [tags](#input\_tags) | A map of tags to add to all resources. | `map(string)` | `{}` | no |
|
||||
|
||||
## Outputs
|
||||
|
||||
| Name | Description |
|
||||
|------|-------------|
|
||||
| <a name="output_aws_auth_roles"></a> [aws\_auth\_roles](#output\_aws\_auth\_roles) | Roles for use in aws-auth ConfigMap |
|
||||
| <a name="output_fargate_profile_arns"></a> [fargate\_profile\_arns](#output\_fargate\_profile\_arns) | Amazon Resource Name (ARN) of the EKS Fargate Profiles. |
|
||||
| <a name="output_fargate_profile_ids"></a> [fargate\_profile\_ids](#output\_fargate\_profile\_ids) | EKS Cluster name and EKS Fargate Profile names separated by a colon (:). |
|
||||
| <a name="output_iam_role_arn"></a> [iam\_role\_arn](#output\_iam\_role\_arn) | IAM role ARN for EKS Fargate pods |
|
||||
| <a name="output_iam_role_name"></a> [iam\_role\_name](#output\_iam\_role\_name) | IAM role name for EKS Fargate pods |
|
||||
<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
|
||||
@@ -1,72 +0,0 @@
|
||||
locals {
|
||||
create_eks = var.create_eks && length(var.fargate_profiles) > 0
|
||||
|
||||
pod_execution_role_arn = coalescelist(aws_iam_role.eks_fargate_pod.*.arn, data.aws_iam_role.custom_fargate_iam_role.*.arn, [""])[0]
|
||||
pod_execution_role_name = coalescelist(aws_iam_role.eks_fargate_pod.*.name, data.aws_iam_role.custom_fargate_iam_role.*.name, [""])[0]
|
||||
|
||||
fargate_profiles = { for k, v in var.fargate_profiles : k => v if var.create_eks }
|
||||
}
|
||||
|
||||
data "aws_partition" "current" {}
|
||||
|
||||
data "aws_iam_policy_document" "eks_fargate_pod_assume_role" {
|
||||
count = local.create_eks && var.create_fargate_pod_execution_role ? 1 : 0
|
||||
|
||||
statement {
|
||||
effect = "Allow"
|
||||
actions = ["sts:AssumeRole"]
|
||||
|
||||
principals {
|
||||
type = "Service"
|
||||
identifiers = ["eks-fargate-pods.amazonaws.com"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data "aws_iam_role" "custom_fargate_iam_role" {
|
||||
count = local.create_eks && !var.create_fargate_pod_execution_role ? 1 : 0
|
||||
|
||||
name = var.fargate_pod_execution_role_name
|
||||
}
|
||||
|
||||
resource "aws_iam_role" "eks_fargate_pod" {
|
||||
count = local.create_eks && var.create_fargate_pod_execution_role ? 1 : 0
|
||||
|
||||
name_prefix = format("%s-fargate", substr(var.cluster_name, 0, 24))
|
||||
assume_role_policy = data.aws_iam_policy_document.eks_fargate_pod_assume_role[0].json
|
||||
permissions_boundary = var.permissions_boundary
|
||||
tags = var.tags
|
||||
path = var.iam_path
|
||||
}
|
||||
|
||||
resource "aws_iam_role_policy_attachment" "eks_fargate_pod" {
|
||||
count = local.create_eks && var.create_fargate_pod_execution_role ? 1 : 0
|
||||
|
||||
policy_arn = "arn:${data.aws_partition.current.partition}:iam::aws:policy/AmazonEKSFargatePodExecutionRolePolicy"
|
||||
role = aws_iam_role.eks_fargate_pod[0].name
|
||||
}
|
||||
|
||||
resource "aws_eks_fargate_profile" "this" {
|
||||
for_each = local.fargate_profiles
|
||||
|
||||
cluster_name = var.cluster_name
|
||||
fargate_profile_name = lookup(each.value, "name", format("%s-fargate-%s", var.cluster_name, replace(each.key, "_", "-")))
|
||||
pod_execution_role_arn = local.pod_execution_role_arn
|
||||
subnet_ids = lookup(each.value, "subnets", var.subnets)
|
||||
|
||||
dynamic "selector" {
|
||||
for_each = each.value.selectors
|
||||
|
||||
content {
|
||||
namespace = selector.value["namespace"]
|
||||
labels = lookup(selector.value, "labels", {})
|
||||
}
|
||||
}
|
||||
|
||||
timeouts {
|
||||
create = try(each.value["timeouts"].create, null)
|
||||
delete = try(each.value["timeouts"].delete, null)
|
||||
}
|
||||
|
||||
tags = merge(var.tags, lookup(each.value, "tags", {}))
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
output "fargate_profile_ids" {
|
||||
description = "EKS Cluster name and EKS Fargate Profile names separated by a colon (:)."
|
||||
value = [for f in aws_eks_fargate_profile.this : f.id]
|
||||
}
|
||||
|
||||
output "fargate_profile_arns" {
|
||||
description = "Amazon Resource Name (ARN) of the EKS Fargate Profiles."
|
||||
value = [for f in aws_eks_fargate_profile.this : f.arn]
|
||||
}
|
||||
|
||||
output "iam_role_name" {
|
||||
description = "IAM role name for EKS Fargate pods"
|
||||
value = local.pod_execution_role_name
|
||||
}
|
||||
|
||||
output "iam_role_arn" {
|
||||
description = "IAM role ARN for EKS Fargate pods"
|
||||
value = local.pod_execution_role_arn
|
||||
}
|
||||
|
||||
output "aws_auth_roles" {
|
||||
description = "Roles for use in aws-auth ConfigMap"
|
||||
value = [
|
||||
for i in range(1) : {
|
||||
worker_role_arn = local.pod_execution_role_arn
|
||||
platform = "fargate"
|
||||
} if local.create_eks
|
||||
]
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
variable "create_eks" {
|
||||
description = "Controls if EKS resources should be created (it affects almost all resources)"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "create_fargate_pod_execution_role" {
|
||||
description = "Controls if the the IAM Role that provides permissions for the EKS Fargate Profile should be created."
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "cluster_name" {
|
||||
description = "Name of the EKS cluster."
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "iam_path" {
|
||||
description = "IAM roles will be created on this path."
|
||||
type = string
|
||||
default = "/"
|
||||
}
|
||||
|
||||
variable "fargate_pod_execution_role_name" {
|
||||
description = "The IAM Role that provides permissions for the EKS Fargate Profile."
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "fargate_profiles" {
|
||||
description = "Fargate profiles to create. See `fargate_profile` keys section in README.md for more details"
|
||||
type = any
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "permissions_boundary" {
|
||||
description = "If provided, all IAM roles will be created with this permissions boundary attached."
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "subnets" {
|
||||
description = "A list of subnets for the EKS Fargate profiles."
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "tags" {
|
||||
description = "A map of tags to add to all resources."
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
@@ -1,113 +0,0 @@
|
||||
# EKS `node_groups` submodule
|
||||
|
||||
Helper submodule to create and manage resources related to `eks_node_groups`.
|
||||
|
||||
## Node Groups' IAM Role
|
||||
|
||||
The role ARN specified in `var.default_iam_role_arn` will be used by default. In a simple configuration this will be the worker role created by the parent module.
|
||||
|
||||
`iam_role_arn` must be specified in either `var.node_groups_defaults` or `var.node_groups` if the default parent IAM role is not being created for whatever reason, for example if `manage_worker_iam_resources` is set to false in the parent.
|
||||
|
||||
## `node_groups` and `node_groups_defaults` keys
|
||||
`node_groups_defaults` is a map that can take the below keys. Values will be used if not specified in individual node groups.
|
||||
|
||||
`node_groups` is a map of maps. Key of first level will be used as unique value for `for_each` resources and in the `aws_eks_node_group` name. Inner map can take the below values.
|
||||
|
||||
| Name | Description | Type | If unset |
|
||||
|------|-------------|:----:|:-----:|
|
||||
| additional\_tags | Additional tags to apply to node group | map(string) | Only `var.tags` applied |
|
||||
| ami\_release\_version | AMI version of workers | string | Provider default behavior |
|
||||
| ami\_type | AMI Type. See Terraform or AWS docs | string | Provider default behavior |
|
||||
| ami\_id | ID of custom AMI. If you use a custom AMI, you need to set `ami_is_eks_optimized` | string | Provider default behavior |
|
||||
| ami\_is\_eks\_optimized | If the custom AMI is an EKS optimised image, ignored if `ami_id` is not set. If this is `true` then `bootstrap.sh` is called automatically (max pod logic needs to be manually set), if this is `false` you need to provide all the node configuration in `pre_userdata` | bool | `true` |
|
||||
| capacity\_type | Type of instance capacity to provision. Options are `ON_DEMAND` and `SPOT` | string | Provider default behavior |
|
||||
| create_launch_template | Create and use a default launch template | bool | `false` |
|
||||
| desired\_capacity | Desired number of workers | number | `var.workers_group_defaults[asg_desired_capacity]` |
|
||||
| disk\_encrypted | Whether the root disk will be encrypyted. Requires `create_launch_template` to be `true` and `disk_kms_key_id` to be set | bool | false |
|
||||
| disk\_kms\_key\_id | KMS Key used to encrypt the root disk. Requires both `create_launch_template` and `disk_encrypted` to be `true` | string | "" |
|
||||
| disk\_size | Workers' disk size | number | Provider default behavior |
|
||||
| disk\_type | Workers' disk type. Require `create_launch_template` to be `true`| string | Provider default behavior |
|
||||
| disk\_throughput | Workers' disk throughput. Require `create_launch_template` to be `true` and `disk_type` to be `gp3`| number | Provider default behavior |
|
||||
| disk\_iops | Workers' disk IOPS. Require `create_launch_template` to be `true` and `disk_type` to be `gp3`| number | Provider default behavior |
|
||||
| ebs\_optimized | Enables/disables EBS optimization. Require `create_launch_template` to be `true` | bool | `true` if defined `instance\_types` are not present in `var.ebs\_optimized\_not\_supported` |
|
||||
| enable_monitoring | Enables/disables detailed monitoring. Require `create_launch_template` to be `true`| bool | `true` |
|
||||
| eni_delete | Delete the Elastic Network Interface (ENI) on termination (if set to false you will have to manually delete before destroying) | bool | `true` |
|
||||
| force\_update\_version | Force version update if existing pods are unable to be drained due to a pod disruption budget issue. | bool | Provider default behavior |
|
||||
| iam\_role\_arn | IAM role ARN for workers | string | `var.default_iam_role_arn` |
|
||||
| instance\_types | Node group's instance type(s). Multiple types can be specified when `capacity_type="SPOT"`. | list | `[var.workers_group_defaults[instance_type]]` |
|
||||
| k8s\_labels | Kubernetes labels | map(string) | No labels applied |
|
||||
| key\_name | Key name for workers. Set to empty string to disable remote access | string | `var.workers_group_defaults[key_name]` |
|
||||
| bootstrap_env | Provide environment variables to customise [bootstrap.sh](https://github.com/awslabs/amazon-eks-ami/blob/master/files/bootstrap.sh). Require `create_launch_template` to be `true` | map(string) | `{}` |
|
||||
| kubelet_extra_args | Extra arguments for kubelet, this is automatically merged with `labels`. Require `create_launch_template` to be `true` | string | "" |
|
||||
| launch_template_id | The id of a aws_launch_template to use | string | No LT used |
|
||||
| launch\_template_version | The version of the LT to use | string | none |
|
||||
| max\_capacity | Max number of workers | number | `var.workers_group_defaults[asg_max_size]` |
|
||||
| min\_capacity | Min number of workers | number | `var.workers_group_defaults[asg_min_size]` |
|
||||
| update_config.max\_unavailable\_percentage | Max percentage of unavailable nodes during update. (e.g. 25, 50, etc) | number | `null` if `update_config.max_unavailable` is set |
|
||||
| update_config.max\_unavailable | Max number of unavailable nodes during update | number | `null` if `update_config.max_unavailable_percentage` is set |
|
||||
| name | Name of the node group. If you don't really need this, we recommend you to use `name_prefix` instead. | string | Will use the autogenerate name prefix |
|
||||
| name_prefix | Name prefix of the node group | string | Auto generated |
|
||||
| pre_userdata | userdata to pre-append to the default userdata. Require `create_launch_template` to be `true`| string | "" |
|
||||
| public_ip | Associate a public ip address with a worker. Require `create_launch_template` to be `true`| string | `false`
|
||||
| source\_security\_group\_ids | Source security groups for remote access to workers | list(string) | If key\_name is specified: THE REMOTE ACCESS WILL BE OPENED TO THE WORLD |
|
||||
| subnets | Subnets to contain workers | list(string) | `var.workers_group_defaults[subnets]` |
|
||||
| version | Kubernetes version | string | Provider default behavior |
|
||||
| taints | Kubernetes node taints | list(map) | empty |
|
||||
| timeouts | A map of timeouts for create/update/delete operations. | `map(string)` | Provider default behavior |
|
||||
| update_default_version | Whether or not to set the new launch template version the Default | bool | `true` |
|
||||
| metadata_http_endpoint | The state of the instance metadata service. Requires `create_launch_template` to be `true` | string | `var.workers_group_defaults[metadata_http_endpoint]` |
|
||||
| metadata_http_tokens | If session tokens are required. Requires `create_launch_template` to be `true` | string | `var.workers_group_defaults[metadata_http_tokens]` |
|
||||
| metadata_http_put_response_hop_limit | The desired HTTP PUT response hop limit for instance metadata requests. Requires `create_launch_template` to be `true` | number | `var.workers_group_defaults[metadata_http_put_response_hop_limit]` |
|
||||
|
||||
<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
|
||||
## Requirements
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 0.13.1 |
|
||||
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 3.56 |
|
||||
| <a name="requirement_cloudinit"></a> [cloudinit](#requirement\_cloudinit) | >= 2.0 |
|
||||
|
||||
## Providers
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 3.56 |
|
||||
| <a name="provider_cloudinit"></a> [cloudinit](#provider\_cloudinit) | >= 2.0 |
|
||||
|
||||
## Modules
|
||||
|
||||
No modules.
|
||||
|
||||
## Resources
|
||||
|
||||
| Name | Type |
|
||||
|------|------|
|
||||
| [aws_eks_node_group.workers](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/eks_node_group) | resource |
|
||||
| [aws_launch_template.workers](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_template) | resource |
|
||||
| [cloudinit_config.workers_userdata](https://registry.terraform.io/providers/hashicorp/cloudinit/latest/docs/data-sources/config) | data source |
|
||||
|
||||
## Inputs
|
||||
|
||||
| Name | Description | Type | Default | Required |
|
||||
|------|-------------|------|---------|:--------:|
|
||||
| <a name="input_cluster_auth_base64"></a> [cluster\_auth\_base64](#input\_cluster\_auth\_base64) | Base64 encoded CA of parent cluster | `string` | `""` | no |
|
||||
| <a name="input_cluster_endpoint"></a> [cluster\_endpoint](#input\_cluster\_endpoint) | Endpoint of parent cluster | `string` | `""` | no |
|
||||
| <a name="input_cluster_name"></a> [cluster\_name](#input\_cluster\_name) | Name of parent cluster | `string` | `""` | no |
|
||||
| <a name="input_create_eks"></a> [create\_eks](#input\_create\_eks) | Controls if EKS resources should be created (it affects almost all resources) | `bool` | `true` | no |
|
||||
| <a name="input_default_iam_role_arn"></a> [default\_iam\_role\_arn](#input\_default\_iam\_role\_arn) | ARN of the default IAM worker role to use if one is not specified in `var.node_groups` or `var.node_groups_defaults` | `string` | `""` | no |
|
||||
| <a name="input_ebs_optimized_not_supported"></a> [ebs\_optimized\_not\_supported](#input\_ebs\_optimized\_not\_supported) | List of instance types that do not support EBS optimization | `list(string)` | `[]` | no |
|
||||
| <a name="input_node_groups"></a> [node\_groups](#input\_node\_groups) | Map of maps of `eks_node_groups` to create. See "`node_groups` and `node_groups_defaults` keys" section in README.md for more details | `any` | `{}` | no |
|
||||
| <a name="input_node_groups_defaults"></a> [node\_groups\_defaults](#input\_node\_groups\_defaults) | map of maps of node groups to create. See "`node_groups` and `node_groups_defaults` keys" section in README.md for more details | `any` | `{}` | no |
|
||||
| <a name="input_tags"></a> [tags](#input\_tags) | A map of tags to add to all resources | `map(string)` | `{}` | no |
|
||||
| <a name="input_worker_additional_security_group_ids"></a> [worker\_additional\_security\_group\_ids](#input\_worker\_additional\_security\_group\_ids) | A list of additional security group ids to attach to worker instances | `list(string)` | `[]` | no |
|
||||
| <a name="input_worker_security_group_id"></a> [worker\_security\_group\_id](#input\_worker\_security\_group\_id) | If provided, all workers will be attached to this security group. If not given, a security group will be created with necessary ingress/egress to work with the EKS cluster. | `string` | `""` | no |
|
||||
| <a name="input_workers_group_defaults"></a> [workers\_group\_defaults](#input\_workers\_group\_defaults) | Workers group defaults from parent | `any` | `{}` | no |
|
||||
|
||||
## Outputs
|
||||
|
||||
| Name | Description |
|
||||
|------|-------------|
|
||||
| <a name="output_aws_auth_roles"></a> [aws\_auth\_roles](#output\_aws\_auth\_roles) | Roles for use in aws-auth ConfigMap |
|
||||
| <a name="output_node_groups"></a> [node\_groups](#output\_node\_groups) | Outputs from EKS node groups. Map of maps, keyed by `var.node_groups` keys. See `aws_eks_node_group` Terraform documentation for values |
|
||||
<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
|
||||
@@ -1,146 +0,0 @@
|
||||
data "cloudinit_config" "workers_userdata" {
|
||||
for_each = { for k, v in local.node_groups_expanded : k => v if v["create_launch_template"] }
|
||||
|
||||
gzip = false
|
||||
base64_encode = true
|
||||
boundary = "//"
|
||||
|
||||
part {
|
||||
content_type = "text/x-shellscript"
|
||||
content = templatefile("${path.module}/templates/userdata.sh.tpl",
|
||||
{
|
||||
cluster_name = var.cluster_name
|
||||
cluster_endpoint = var.cluster_endpoint
|
||||
cluster_auth_base64 = var.cluster_auth_base64
|
||||
ami_id = lookup(each.value, "ami_id", "")
|
||||
ami_is_eks_optimized = each.value["ami_is_eks_optimized"]
|
||||
bootstrap_env = each.value["bootstrap_env"]
|
||||
kubelet_extra_args = each.value["kubelet_extra_args"]
|
||||
pre_userdata = each.value["pre_userdata"]
|
||||
capacity_type = lookup(each.value, "capacity_type", "ON_DEMAND")
|
||||
append_labels = length(lookup(each.value, "k8s_labels", {})) > 0 ? ",${join(",", [for k, v in lookup(each.value, "k8s_labels", {}) : "${k}=${v}"])}" : ""
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
# This is based on the LT that EKS would create if no custom one is specified (aws ec2 describe-launch-template-versions --launch-template-id xxx)
|
||||
# there are several more options one could set but you probably dont need to modify them
|
||||
# you can take the default and add your custom AMI and/or custom tags
|
||||
#
|
||||
# Trivia: AWS transparently creates a copy of your LaunchTemplate and actually uses that copy then for the node group. If you DONT use a custom AMI,
|
||||
# then the default user-data for bootstrapping a cluster is merged in the copy.
|
||||
resource "aws_launch_template" "workers" {
|
||||
for_each = { for k, v in local.node_groups_expanded : k => v if v["create_launch_template"] }
|
||||
|
||||
name_prefix = local.node_groups_names[each.key]
|
||||
description = format("EKS Managed Node Group custom LT for %s", local.node_groups_names[each.key])
|
||||
update_default_version = lookup(each.value, "update_default_version", true)
|
||||
|
||||
block_device_mappings {
|
||||
device_name = "/dev/xvda"
|
||||
|
||||
ebs {
|
||||
volume_size = lookup(each.value, "disk_size", null)
|
||||
volume_type = lookup(each.value, "disk_type", null)
|
||||
iops = lookup(each.value, "disk_iops", null)
|
||||
throughput = lookup(each.value, "disk_throughput", null)
|
||||
encrypted = lookup(each.value, "disk_encrypted", null)
|
||||
kms_key_id = lookup(each.value, "disk_kms_key_id", null)
|
||||
delete_on_termination = true
|
||||
}
|
||||
}
|
||||
|
||||
ebs_optimized = lookup(each.value, "ebs_optimized", !contains(var.ebs_optimized_not_supported, element(each.value.instance_types, 0)))
|
||||
|
||||
instance_type = each.value["set_instance_types_on_lt"] ? element(each.value.instance_types, 0) : null
|
||||
|
||||
monitoring {
|
||||
enabled = lookup(each.value, "enable_monitoring", null)
|
||||
}
|
||||
|
||||
network_interfaces {
|
||||
associate_public_ip_address = lookup(each.value, "public_ip", null)
|
||||
delete_on_termination = lookup(each.value, "eni_delete", null)
|
||||
security_groups = compact(flatten([
|
||||
var.worker_security_group_id,
|
||||
var.worker_additional_security_group_ids,
|
||||
lookup(
|
||||
each.value,
|
||||
"additional_security_group_ids",
|
||||
null,
|
||||
),
|
||||
]))
|
||||
}
|
||||
|
||||
# if you want to use a custom AMI
|
||||
image_id = lookup(each.value, "ami_id", null)
|
||||
|
||||
# If you use a custom AMI, you need to supply via user-data, the bootstrap script as EKS DOESNT merge its managed user-data then
|
||||
# you can add more than the minimum code you see in the template, e.g. install SSM agent, see https://github.com/aws/containers-roadmap/issues/593#issuecomment-577181345
|
||||
#
|
||||
# (optionally you can use https://registry.terraform.io/providers/hashicorp/cloudinit/latest/docs/data-sources/cloudinit_config to render the script, example: https://github.com/terraform-aws-modules/terraform-aws-eks/pull/997#issuecomment-705286151)
|
||||
|
||||
user_data = data.cloudinit_config.workers_userdata[each.key].rendered
|
||||
|
||||
key_name = lookup(each.value, "key_name", null)
|
||||
|
||||
metadata_options {
|
||||
http_endpoint = lookup(each.value, "metadata_http_endpoint", null)
|
||||
http_tokens = lookup(each.value, "metadata_http_tokens", null)
|
||||
http_put_response_hop_limit = lookup(each.value, "metadata_http_put_response_hop_limit", null)
|
||||
}
|
||||
|
||||
# Supplying custom tags to EKS instances is another use-case for LaunchTemplates
|
||||
tag_specifications {
|
||||
resource_type = "instance"
|
||||
|
||||
tags = merge(
|
||||
var.tags,
|
||||
{
|
||||
Name = local.node_groups_names[each.key]
|
||||
},
|
||||
lookup(var.node_groups_defaults, "additional_tags", {}),
|
||||
lookup(var.node_groups[each.key], "additional_tags", {})
|
||||
)
|
||||
}
|
||||
|
||||
# Supplying custom tags to EKS instances root volumes is another use-case for LaunchTemplates. (doesnt add tags to dynamically provisioned volumes via PVC tho)
|
||||
tag_specifications {
|
||||
resource_type = "volume"
|
||||
|
||||
tags = merge(
|
||||
var.tags,
|
||||
{
|
||||
Name = local.node_groups_names[each.key]
|
||||
},
|
||||
lookup(var.node_groups_defaults, "additional_tags", {}),
|
||||
lookup(var.node_groups[each.key], "additional_tags", {})
|
||||
)
|
||||
}
|
||||
|
||||
# Supplying custom tags to EKS instances ENI's is another use-case for LaunchTemplates
|
||||
tag_specifications {
|
||||
resource_type = "network-interface"
|
||||
|
||||
tags = merge(
|
||||
var.tags,
|
||||
{
|
||||
Name = local.node_groups_names[each.key]
|
||||
},
|
||||
lookup(var.node_groups_defaults, "additional_tags", {}),
|
||||
lookup(var.node_groups[each.key], "additional_tags", {})
|
||||
)
|
||||
}
|
||||
|
||||
# Tag the LT itself
|
||||
tags = merge(
|
||||
var.tags,
|
||||
lookup(var.node_groups_defaults, "additional_tags", {}),
|
||||
lookup(var.node_groups[each.key], "additional_tags", {}),
|
||||
)
|
||||
|
||||
lifecycle {
|
||||
create_before_destroy = true
|
||||
}
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
locals {
|
||||
# Merge defaults and per-group values to make code cleaner
|
||||
node_groups_expanded = { for k, v in var.node_groups : k => merge(
|
||||
{
|
||||
desired_capacity = var.workers_group_defaults["asg_desired_capacity"]
|
||||
iam_role_arn = var.default_iam_role_arn
|
||||
instance_types = [var.workers_group_defaults["instance_type"]]
|
||||
key_name = var.workers_group_defaults["key_name"]
|
||||
launch_template_id = var.workers_group_defaults["launch_template_id"]
|
||||
launch_template_version = var.workers_group_defaults["launch_template_version"]
|
||||
set_instance_types_on_lt = false
|
||||
max_capacity = var.workers_group_defaults["asg_max_size"]
|
||||
min_capacity = var.workers_group_defaults["asg_min_size"]
|
||||
subnets = var.workers_group_defaults["subnets"]
|
||||
create_launch_template = false
|
||||
bootstrap_env = {}
|
||||
kubelet_extra_args = var.workers_group_defaults["kubelet_extra_args"]
|
||||
disk_size = var.workers_group_defaults["root_volume_size"]
|
||||
disk_type = var.workers_group_defaults["root_volume_type"]
|
||||
disk_iops = var.workers_group_defaults["root_iops"]
|
||||
disk_throughput = var.workers_group_defaults["root_volume_throughput"]
|
||||
disk_encrypted = var.workers_group_defaults["root_encrypted"]
|
||||
disk_kms_key_id = var.workers_group_defaults["root_kms_key_id"]
|
||||
enable_monitoring = var.workers_group_defaults["enable_monitoring"]
|
||||
eni_delete = var.workers_group_defaults["eni_delete"]
|
||||
public_ip = var.workers_group_defaults["public_ip"]
|
||||
pre_userdata = var.workers_group_defaults["pre_userdata"]
|
||||
additional_security_group_ids = var.workers_group_defaults["additional_security_group_ids"]
|
||||
taints = []
|
||||
timeouts = var.workers_group_defaults["timeouts"]
|
||||
update_default_version = true
|
||||
ebs_optimized = null
|
||||
metadata_http_endpoint = var.workers_group_defaults["metadata_http_endpoint"]
|
||||
metadata_http_tokens = var.workers_group_defaults["metadata_http_tokens"]
|
||||
metadata_http_put_response_hop_limit = var.workers_group_defaults["metadata_http_put_response_hop_limit"]
|
||||
ami_is_eks_optimized = true
|
||||
},
|
||||
var.node_groups_defaults,
|
||||
v,
|
||||
) if var.create_eks }
|
||||
|
||||
node_groups_names = { for k, v in local.node_groups_expanded : k => lookup(
|
||||
v,
|
||||
"name",
|
||||
lookup(
|
||||
v,
|
||||
"name_prefix",
|
||||
join("-", [var.cluster_name, k])
|
||||
)
|
||||
) }
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
resource "aws_eks_node_group" "workers" {
|
||||
for_each = local.node_groups_expanded
|
||||
|
||||
node_group_name_prefix = lookup(each.value, "name", null) == null ? local.node_groups_names[each.key] : null
|
||||
node_group_name = lookup(each.value, "name", null)
|
||||
|
||||
cluster_name = var.cluster_name
|
||||
node_role_arn = each.value["iam_role_arn"]
|
||||
subnet_ids = each.value["subnets"]
|
||||
|
||||
scaling_config {
|
||||
desired_size = each.value["desired_capacity"]
|
||||
max_size = each.value["max_capacity"]
|
||||
min_size = each.value["min_capacity"]
|
||||
}
|
||||
|
||||
ami_type = lookup(each.value, "ami_type", null)
|
||||
disk_size = each.value["launch_template_id"] != null || each.value["create_launch_template"] ? null : lookup(each.value, "disk_size", null)
|
||||
instance_types = !each.value["set_instance_types_on_lt"] ? each.value["instance_types"] : null
|
||||
release_version = lookup(each.value, "ami_release_version", null)
|
||||
capacity_type = lookup(each.value, "capacity_type", null)
|
||||
force_update_version = lookup(each.value, "force_update_version", null)
|
||||
|
||||
dynamic "remote_access" {
|
||||
for_each = each.value["key_name"] != "" && each.value["launch_template_id"] == null && !each.value["create_launch_template"] ? [{
|
||||
ec2_ssh_key = each.value["key_name"]
|
||||
source_security_group_ids = lookup(each.value, "source_security_group_ids", [])
|
||||
}] : []
|
||||
|
||||
content {
|
||||
ec2_ssh_key = remote_access.value["ec2_ssh_key"]
|
||||
source_security_group_ids = remote_access.value["source_security_group_ids"]
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "launch_template" {
|
||||
for_each = each.value["launch_template_id"] != null ? [{
|
||||
id = each.value["launch_template_id"]
|
||||
version = each.value["launch_template_version"]
|
||||
}] : []
|
||||
|
||||
content {
|
||||
id = launch_template.value["id"]
|
||||
version = launch_template.value["version"]
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "launch_template" {
|
||||
for_each = each.value["launch_template_id"] == null && each.value["create_launch_template"] ? [{
|
||||
id = aws_launch_template.workers[each.key].id
|
||||
version = each.value["launch_template_version"] == "$Latest" ? aws_launch_template.workers[each.key].latest_version : (
|
||||
each.value["launch_template_version"] == "$Default" ? aws_launch_template.workers[each.key].default_version : each.value["launch_template_version"]
|
||||
)
|
||||
}] : []
|
||||
|
||||
content {
|
||||
id = launch_template.value["id"]
|
||||
version = launch_template.value["version"]
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "taint" {
|
||||
for_each = each.value["taints"]
|
||||
|
||||
content {
|
||||
key = taint.value["key"]
|
||||
value = taint.value["value"]
|
||||
effect = taint.value["effect"]
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "update_config" {
|
||||
for_each = try(each.value.update_config.max_unavailable_percentage > 0, each.value.update_config.max_unavailable > 0, false) ? [true] : []
|
||||
|
||||
content {
|
||||
max_unavailable_percentage = try(each.value.update_config.max_unavailable_percentage, null)
|
||||
max_unavailable = try(each.value.update_config.max_unavailable, null)
|
||||
}
|
||||
}
|
||||
|
||||
timeouts {
|
||||
create = lookup(each.value["timeouts"], "create", null)
|
||||
update = lookup(each.value["timeouts"], "update", null)
|
||||
delete = lookup(each.value["timeouts"], "delete", null)
|
||||
}
|
||||
|
||||
version = lookup(each.value, "version", null)
|
||||
|
||||
labels = merge(
|
||||
lookup(var.node_groups_defaults, "k8s_labels", {}),
|
||||
lookup(var.node_groups[each.key], "k8s_labels", {})
|
||||
)
|
||||
|
||||
tags = merge(
|
||||
var.tags,
|
||||
lookup(var.node_groups_defaults, "additional_tags", {}),
|
||||
lookup(var.node_groups[each.key], "additional_tags", {}),
|
||||
)
|
||||
|
||||
lifecycle {
|
||||
create_before_destroy = true
|
||||
ignore_changes = [scaling_config[0].desired_size]
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
output "node_groups" {
|
||||
description = "Outputs from EKS node groups. Map of maps, keyed by `var.node_groups` keys. See `aws_eks_node_group` Terraform documentation for values"
|
||||
value = aws_eks_node_group.workers
|
||||
}
|
||||
|
||||
output "aws_auth_roles" {
|
||||
description = "Roles for use in aws-auth ConfigMap"
|
||||
value = [
|
||||
for k, v in local.node_groups_expanded : {
|
||||
worker_role_arn = lookup(v, "iam_role_arn", var.default_iam_role_arn)
|
||||
platform = "linux"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
#!/bin/bash -e
|
||||
%{ if length(ami_id) == 0 ~}
|
||||
|
||||
# Set bootstrap env
|
||||
printf '#!/bin/bash
|
||||
%{ for k, v in bootstrap_env ~}
|
||||
export ${k}="${v}"
|
||||
%{ endfor ~}
|
||||
export ADDITIONAL_KUBELET_EXTRA_ARGS="${kubelet_extra_args}"
|
||||
' > /etc/profile.d/eks-bootstrap-env.sh
|
||||
|
||||
# Source extra environment variables in bootstrap script
|
||||
sed -i '/^set -o errexit/a\\nsource /etc/profile.d/eks-bootstrap-env.sh' /etc/eks/bootstrap.sh
|
||||
|
||||
# Merge ADDITIONAL_KUBELET_EXTRA_ARGS into KUBELET_EXTRA_ARGS
|
||||
sed -i 's/^KUBELET_EXTRA_ARGS="$${KUBELET_EXTRA_ARGS:-}/KUBELET_EXTRA_ARGS="$${KUBELET_EXTRA_ARGS:-} $${ADDITIONAL_KUBELET_EXTRA_ARGS}/' /etc/eks/bootstrap.sh
|
||||
%{else ~}
|
||||
|
||||
# Set variables for custom AMI
|
||||
API_SERVER_URL=${cluster_endpoint}
|
||||
B64_CLUSTER_CA=${cluster_auth_base64}
|
||||
%{ for k, v in bootstrap_env ~}
|
||||
${k}="${v}"
|
||||
%{ endfor ~}
|
||||
KUBELET_EXTRA_ARGS='--node-labels=eks.amazonaws.com/nodegroup-image=${ami_id},eks.amazonaws.com/capacityType=${capacity_type}${append_labels} ${kubelet_extra_args}'
|
||||
%{endif ~}
|
||||
|
||||
# User supplied pre userdata
|
||||
${pre_userdata}
|
||||
%{ if length(ami_id) > 0 && ami_is_eks_optimized ~}
|
||||
|
||||
# Call bootstrap for EKS optimised custom AMI
|
||||
/etc/eks/bootstrap.sh ${cluster_name} --apiserver-endpoint "$${API_SERVER_URL}" --b64-cluster-ca "$${B64_CLUSTER_CA}" --kubelet-extra-args "$${KUBELET_EXTRA_ARGS}"
|
||||
%{ endif ~}
|
||||
@@ -1,71 +0,0 @@
|
||||
variable "create_eks" {
|
||||
description = "Controls if EKS resources should be created (it affects almost all resources)"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "cluster_name" {
|
||||
description = "Name of parent cluster"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "cluster_endpoint" {
|
||||
description = "Endpoint of parent cluster"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "cluster_auth_base64" {
|
||||
description = "Base64 encoded CA of parent cluster"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "default_iam_role_arn" {
|
||||
description = "ARN of the default IAM worker role to use if one is not specified in `var.node_groups` or `var.node_groups_defaults`"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "workers_group_defaults" {
|
||||
description = "Workers group defaults from parent"
|
||||
type = any
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "worker_security_group_id" {
|
||||
description = "If provided, all workers will be attached to this security group. If not given, a security group will be created with necessary ingress/egress to work with the EKS cluster."
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "worker_additional_security_group_ids" {
|
||||
description = "A list of additional security group ids to attach to worker instances"
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "tags" {
|
||||
description = "A map of tags to add to all resources"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "node_groups_defaults" {
|
||||
description = "map of maps of node groups to create. See \"`node_groups` and `node_groups_defaults` keys\" section in README.md for more details"
|
||||
type = any
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "node_groups" {
|
||||
description = "Map of maps of `eks_node_groups` to create. See \"`node_groups` and `node_groups_defaults` keys\" section in README.md for more details"
|
||||
type = any
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "ebs_optimized_not_supported" {
|
||||
description = "List of instance types that do not support EBS optimization"
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
199
modules/self-managed-node-group/README.md
Normal file
199
modules/self-managed-node-group/README.md
Normal file
@@ -0,0 +1,199 @@
|
||||
# Self Managed Node Group Module
|
||||
|
||||
Configuration in this directory creates a Self Managed Node Group (AutoScaling Group) along with an IAM role, security group, and launch template
|
||||
|
||||
## Usage
|
||||
|
||||
```hcl
|
||||
module "self_managed_node_group" {
|
||||
source = "terraform-aws-modules/eks/aws//modules/self-managed-node-group"
|
||||
|
||||
name = "separate-self-mng"
|
||||
cluster_name = "my-cluster"
|
||||
cluster_version = "1.21"
|
||||
cluster_endpoint = "https://012345678903AB2BAE5D1E0BFE0E2B50.gr7.us-east-1.eks.amazonaws.com"
|
||||
cluster_auth_base64 = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKbXFqQ1VqNGdGR2w3ZW5PeWthWnZ2RjROOTVOUEZCM2o0cGhVZUsrWGFtN2ZSQnZya0d6OGxKZmZEZWF2b2plTwpQK2xOZFlqdHZncmxCUEpYdHZIZmFzTzYxVzdIZmdWQ2EvamdRM2w3RmkvL1dpQmxFOG9oWUZkdWpjc0s1SXM2CnNkbk5KTTNYUWN2TysrSitkV09NT2ZlNzlsSWdncmdQLzgvRU9CYkw3eUY1aU1hS3lsb1RHL1V3TlhPUWt3ZUcKblBNcjdiUmdkQ1NCZTlXYXowOGdGRmlxV2FOditsTDhsODBTdFZLcWVNVlUxbjQyejVwOVpQRTd4T2l6L0xTNQpYV2lXWkVkT3pMN0xBWGVCS2gzdkhnczFxMkI2d1BKZnZnS1NzWllQRGFpZTloT1NNOUJkNFNPY3JrZTRYSVBOCkVvcXVhMlYrUDRlTWJEQzhMUkVWRDdCdVZDdWdMTldWOTBoL3VJUy9WU2VOcEdUOGVScE5DakszSjc2aFlsWm8KWjNGRG5QWUY0MWpWTHhiOXF0U1ROdEp6amYwWXBEYnFWci9xZzNmQWlxbVorMzd3YWM1eHlqMDZ4cmlaRUgzZgpUM002d2lCUEVHYVlGeWN5TmNYTk5aYW9DWDJVL0N1d2JsUHAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ=="
|
||||
|
||||
vpc_id = "vpc-1234556abcdef"
|
||||
subnet_ids = ["subnet-abcde012", "subnet-bcde012a", "subnet-fghi345a"]
|
||||
vpc_security_group_ids = [
|
||||
# cluster_security_group_id,
|
||||
]
|
||||
|
||||
min_size = 1
|
||||
max_size = 10
|
||||
desired_size = 1
|
||||
|
||||
launch_template_name = "separate-self-mng"
|
||||
instance_type = "m5.large"
|
||||
|
||||
tags = {
|
||||
Environment = "dev"
|
||||
Terraform = "true"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
|
||||
## Requirements
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 0.13.1 |
|
||||
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 3.64 |
|
||||
| <a name="requirement_cloudinit"></a> [cloudinit](#requirement\_cloudinit) | >= 2.0 |
|
||||
|
||||
## Providers
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 3.64 |
|
||||
|
||||
## Modules
|
||||
|
||||
| Name | Source | Version |
|
||||
|------|--------|---------|
|
||||
| <a name="module_user_data"></a> [user\_data](#module\_user\_data) | ../_user_data | n/a |
|
||||
|
||||
## Resources
|
||||
|
||||
| Name | Type |
|
||||
|------|------|
|
||||
| [aws_autoscaling_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/autoscaling_group) | resource |
|
||||
| [aws_autoscaling_schedule.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/autoscaling_schedule) | resource |
|
||||
| [aws_iam_instance_profile.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_instance_profile) | resource |
|
||||
| [aws_iam_role.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
|
||||
| [aws_iam_role_policy_attachment.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
|
||||
| [aws_launch_template.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_template) | resource |
|
||||
| [aws_security_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group) | resource |
|
||||
| [aws_security_group_rule.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group_rule) | resource |
|
||||
| [aws_ami.eks_default](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami) | data source |
|
||||
| [aws_iam_policy_document.assume_role_policy](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |
|
||||
| [aws_partition.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/partition) | data source |
|
||||
|
||||
## Inputs
|
||||
|
||||
| Name | Description | Type | Default | Required |
|
||||
|------|-------------|------|---------|:--------:|
|
||||
| <a name="input_ami_id"></a> [ami\_id](#input\_ami\_id) | The AMI from which to launch the instance | `string` | `""` | no |
|
||||
| <a name="input_availability_zones"></a> [availability\_zones](#input\_availability\_zones) | A list of one or more availability zones for the group. Used for EC2-Classic and default subnets when not specified with `subnet_ids` argument. Conflicts with `subnet_ids` | `list(string)` | `null` | no |
|
||||
| <a name="input_block_device_mappings"></a> [block\_device\_mappings](#input\_block\_device\_mappings) | Specify volumes to attach to the instance besides the volumes specified by the AMI | `any` | `{}` | no |
|
||||
| <a name="input_bootstrap_extra_args"></a> [bootstrap\_extra\_args](#input\_bootstrap\_extra\_args) | Additional arguments passed to the bootstrap script. When `platform` = `bottlerocket`; these are additional [settings](https://github.com/bottlerocket-os/bottlerocket#settings) that are provided to the Bottlerocket user data | `string` | `""` | no |
|
||||
| <a name="input_capacity_rebalance"></a> [capacity\_rebalance](#input\_capacity\_rebalance) | Indicates whether capacity rebalance is enabled | `bool` | `null` | no |
|
||||
| <a name="input_capacity_reservation_specification"></a> [capacity\_reservation\_specification](#input\_capacity\_reservation\_specification) | Targeting for EC2 capacity reservations | `any` | `null` | no |
|
||||
| <a name="input_cluster_auth_base64"></a> [cluster\_auth\_base64](#input\_cluster\_auth\_base64) | Base64 encoded CA of associated EKS cluster | `string` | `""` | no |
|
||||
| <a name="input_cluster_endpoint"></a> [cluster\_endpoint](#input\_cluster\_endpoint) | Endpoint of associated EKS cluster | `string` | `""` | no |
|
||||
| <a name="input_cluster_name"></a> [cluster\_name](#input\_cluster\_name) | Name of associated EKS cluster | `string` | `null` | no |
|
||||
| <a name="input_cluster_security_group_id"></a> [cluster\_security\_group\_id](#input\_cluster\_security\_group\_id) | Cluster control plane security group ID | `string` | `null` | no |
|
||||
| <a name="input_cluster_version"></a> [cluster\_version](#input\_cluster\_version) | Kubernetes cluster version - used to lookup default AMI ID if one is not provided | `string` | `null` | no |
|
||||
| <a name="input_cpu_options"></a> [cpu\_options](#input\_cpu\_options) | The CPU options for the instance | `map(string)` | `null` | no |
|
||||
| <a name="input_create"></a> [create](#input\_create) | Determines whether to create self managed node group or not | `bool` | `true` | no |
|
||||
| <a name="input_create_iam_instance_profile"></a> [create\_iam\_instance\_profile](#input\_create\_iam\_instance\_profile) | Determines whether an IAM instance profile is created or to use an existing IAM instance profile | `bool` | `true` | no |
|
||||
| <a name="input_create_launch_template"></a> [create\_launch\_template](#input\_create\_launch\_template) | Determines whether to create launch template or not | `bool` | `true` | no |
|
||||
| <a name="input_create_schedule"></a> [create\_schedule](#input\_create\_schedule) | Determines whether to create autoscaling group schedule or not | `bool` | `true` | no |
|
||||
| <a name="input_create_security_group"></a> [create\_security\_group](#input\_create\_security\_group) | Determines whether to create a security group | `bool` | `true` | no |
|
||||
| <a name="input_credit_specification"></a> [credit\_specification](#input\_credit\_specification) | Customize the credit specification of the instance | `map(string)` | `null` | no |
|
||||
| <a name="input_default_cooldown"></a> [default\_cooldown](#input\_default\_cooldown) | The amount of time, in seconds, after a scaling activity completes before another scaling activity can start | `number` | `null` | no |
|
||||
| <a name="input_delete_timeout"></a> [delete\_timeout](#input\_delete\_timeout) | Delete timeout to wait for destroying autoscaling group | `string` | `null` | no |
|
||||
| <a name="input_desired_size"></a> [desired\_size](#input\_desired\_size) | The number of Amazon EC2 instances that should be running in the autoscaling group | `number` | `1` | no |
|
||||
| <a name="input_disable_api_termination"></a> [disable\_api\_termination](#input\_disable\_api\_termination) | If true, enables EC2 instance termination protection | `bool` | `null` | no |
|
||||
| <a name="input_ebs_optimized"></a> [ebs\_optimized](#input\_ebs\_optimized) | If true, the launched EC2 instance will be EBS-optimized | `bool` | `null` | no |
|
||||
| <a name="input_elastic_gpu_specifications"></a> [elastic\_gpu\_specifications](#input\_elastic\_gpu\_specifications) | The elastic GPU to attach to the instance | `map(string)` | `null` | no |
|
||||
| <a name="input_elastic_inference_accelerator"></a> [elastic\_inference\_accelerator](#input\_elastic\_inference\_accelerator) | Configuration block containing an Elastic Inference Accelerator to attach to the instance | `map(string)` | `null` | no |
|
||||
| <a name="input_enable_monitoring"></a> [enable\_monitoring](#input\_enable\_monitoring) | Enables/disables detailed monitoring | `bool` | `true` | no |
|
||||
| <a name="input_enabled_metrics"></a> [enabled\_metrics](#input\_enabled\_metrics) | A list of metrics to collect. The allowed values are `GroupDesiredCapacity`, `GroupInServiceCapacity`, `GroupPendingCapacity`, `GroupMinSize`, `GroupMaxSize`, `GroupInServiceInstances`, `GroupPendingInstances`, `GroupStandbyInstances`, `GroupStandbyCapacity`, `GroupTerminatingCapacity`, `GroupTerminatingInstances`, `GroupTotalCapacity`, `GroupTotalInstances` | `list(string)` | `null` | no |
|
||||
| <a name="input_enclave_options"></a> [enclave\_options](#input\_enclave\_options) | Enable Nitro Enclaves on launched instances | `map(string)` | `null` | no |
|
||||
| <a name="input_force_delete"></a> [force\_delete](#input\_force\_delete) | Allows deleting the Auto Scaling Group without waiting for all instances in the pool to terminate. You can force an Auto Scaling Group to delete even if it's in the process of scaling a resource. Normally, Terraform drains all the instances before deleting the group. This bypasses that behavior and potentially leaves resources dangling | `bool` | `null` | no |
|
||||
| <a name="input_health_check_grace_period"></a> [health\_check\_grace\_period](#input\_health\_check\_grace\_period) | Time (in seconds) after instance comes into service before checking health | `number` | `null` | no |
|
||||
| <a name="input_health_check_type"></a> [health\_check\_type](#input\_health\_check\_type) | `EC2` or `ELB`. Controls how health checking is done | `string` | `null` | no |
|
||||
| <a name="input_hibernation_options"></a> [hibernation\_options](#input\_hibernation\_options) | The hibernation options for the instance | `map(string)` | `null` | no |
|
||||
| <a name="input_iam_instance_profile_arn"></a> [iam\_instance\_profile\_arn](#input\_iam\_instance\_profile\_arn) | Amazon Resource Name (ARN) of an existing IAM instance profile that provides permissions for the node group. Required if `create_iam_instance_profile` = `false` | `string` | `null` | no |
|
||||
| <a name="input_iam_role_additional_policies"></a> [iam\_role\_additional\_policies](#input\_iam\_role\_additional\_policies) | Additional policies to be added to the IAM role | `list(string)` | `[]` | no |
|
||||
| <a name="input_iam_role_attach_cni_policy"></a> [iam\_role\_attach\_cni\_policy](#input\_iam\_role\_attach\_cni\_policy) | Whether to attach the Amazon managed `AmazonEKS_CNI_Policy` IAM policy to the IAM IAM role. WARNING: If set `false` the permissions must be assigned to the `aws-node` DaemonSet pods via another method or nodes will not be able to join the cluster | `bool` | `true` | no |
|
||||
| <a name="input_iam_role_description"></a> [iam\_role\_description](#input\_iam\_role\_description) | Description of the role | `string` | `null` | no |
|
||||
| <a name="input_iam_role_name"></a> [iam\_role\_name](#input\_iam\_role\_name) | Name to use on IAM role created | `string` | `null` | no |
|
||||
| <a name="input_iam_role_path"></a> [iam\_role\_path](#input\_iam\_role\_path) | IAM role path | `string` | `null` | no |
|
||||
| <a name="input_iam_role_permissions_boundary"></a> [iam\_role\_permissions\_boundary](#input\_iam\_role\_permissions\_boundary) | ARN of the policy that is used to set the permissions boundary for the IAM role | `string` | `null` | no |
|
||||
| <a name="input_iam_role_tags"></a> [iam\_role\_tags](#input\_iam\_role\_tags) | A map of additional tags to add to the IAM role created | `map(string)` | `{}` | no |
|
||||
| <a name="input_iam_role_use_name_prefix"></a> [iam\_role\_use\_name\_prefix](#input\_iam\_role\_use\_name\_prefix) | Determines whether cluster IAM role name (`iam_role_name`) is used as a prefix | `string` | `true` | no |
|
||||
| <a name="input_initial_lifecycle_hooks"></a> [initial\_lifecycle\_hooks](#input\_initial\_lifecycle\_hooks) | One or more Lifecycle Hooks to attach to the Auto Scaling Group before instances are launched. The syntax is exactly the same as the separate `aws_autoscaling_lifecycle_hook` resource, without the `autoscaling_group_name` attribute. Please note that this will only work when creating a new Auto Scaling Group. For all other use-cases, please use `aws_autoscaling_lifecycle_hook` resource | `list(map(string))` | `[]` | no |
|
||||
| <a name="input_instance_initiated_shutdown_behavior"></a> [instance\_initiated\_shutdown\_behavior](#input\_instance\_initiated\_shutdown\_behavior) | Shutdown behavior for the instance. Can be `stop` or `terminate`. (Default: `stop`) | `string` | `null` | no |
|
||||
| <a name="input_instance_market_options"></a> [instance\_market\_options](#input\_instance\_market\_options) | The market (purchasing) option for the instance | `any` | `null` | no |
|
||||
| <a name="input_instance_refresh"></a> [instance\_refresh](#input\_instance\_refresh) | If this block is configured, start an Instance Refresh when this Auto Scaling Group is updated | `any` | `null` | no |
|
||||
| <a name="input_instance_type"></a> [instance\_type](#input\_instance\_type) | The type of the instance to launch | `string` | `""` | no |
|
||||
| <a name="input_kernel_id"></a> [kernel\_id](#input\_kernel\_id) | The kernel ID | `string` | `null` | no |
|
||||
| <a name="input_key_name"></a> [key\_name](#input\_key\_name) | The key name that should be used for the instance | `string` | `null` | no |
|
||||
| <a name="input_launch_template_default_version"></a> [launch\_template\_default\_version](#input\_launch\_template\_default\_version) | Default Version of the launch template | `string` | `null` | no |
|
||||
| <a name="input_launch_template_description"></a> [launch\_template\_description](#input\_launch\_template\_description) | Description of the launch template | `string` | `null` | no |
|
||||
| <a name="input_launch_template_name"></a> [launch\_template\_name](#input\_launch\_template\_name) | Launch template name - either to be created (`var.create_launch_template` = `true`) or existing (`var.create_launch_template` = `false`) | `string` | `null` | no |
|
||||
| <a name="input_launch_template_use_name_prefix"></a> [launch\_template\_use\_name\_prefix](#input\_launch\_template\_use\_name\_prefix) | Determines whether to use `launch_template_name` as is or create a unique name beginning with the `launch_template_name` as the prefix | `bool` | `true` | no |
|
||||
| <a name="input_launch_template_version"></a> [launch\_template\_version](#input\_launch\_template\_version) | Launch template version. Can be version number, `$Latest`, or `$Default` | `string` | `null` | no |
|
||||
| <a name="input_license_specifications"></a> [license\_specifications](#input\_license\_specifications) | A list of license specifications to associate with | `map(string)` | `null` | no |
|
||||
| <a name="input_max_instance_lifetime"></a> [max\_instance\_lifetime](#input\_max\_instance\_lifetime) | The maximum amount of time, in seconds, that an instance can be in service, values must be either equal to 0 or between 604800 and 31536000 seconds | `number` | `null` | no |
|
||||
| <a name="input_max_size"></a> [max\_size](#input\_max\_size) | The maximum size of the autoscaling group | `number` | `3` | no |
|
||||
| <a name="input_metadata_options"></a> [metadata\_options](#input\_metadata\_options) | Customize the metadata options for the instance | `map(string)` | <pre>{<br> "http_endpoint": "enabled",<br> "http_put_response_hop_limit": 2,<br> "http_tokens": "required"<br>}</pre> | no |
|
||||
| <a name="input_metrics_granularity"></a> [metrics\_granularity](#input\_metrics\_granularity) | The granularity to associate with the metrics to collect. The only valid value is `1Minute` | `string` | `null` | no |
|
||||
| <a name="input_min_elb_capacity"></a> [min\_elb\_capacity](#input\_min\_elb\_capacity) | Setting this causes Terraform to wait for this number of instances to show up healthy in the ELB only on creation. Updates will not wait on ELB instance number changes | `number` | `null` | no |
|
||||
| <a name="input_min_size"></a> [min\_size](#input\_min\_size) | The minimum size of the autoscaling group | `number` | `0` | no |
|
||||
| <a name="input_mixed_instances_policy"></a> [mixed\_instances\_policy](#input\_mixed\_instances\_policy) | Configuration block containing settings to define launch targets for Auto Scaling groups | `any` | `null` | no |
|
||||
| <a name="input_name"></a> [name](#input\_name) | Name of the Self managed Node Group | `string` | `""` | no |
|
||||
| <a name="input_network_interfaces"></a> [network\_interfaces](#input\_network\_interfaces) | Customize network interfaces to be attached at instance boot time | `list(any)` | `[]` | no |
|
||||
| <a name="input_placement"></a> [placement](#input\_placement) | The placement of the instance | `map(string)` | `null` | no |
|
||||
| <a name="input_placement_group"></a> [placement\_group](#input\_placement\_group) | The name of the placement group into which you'll launch your instances, if any | `string` | `null` | no |
|
||||
| <a name="input_platform"></a> [platform](#input\_platform) | Identifies if the OS platform is `bottlerocket`, `linux`, or `windows` based | `string` | `"linux"` | no |
|
||||
| <a name="input_post_bootstrap_user_data"></a> [post\_bootstrap\_user\_data](#input\_post\_bootstrap\_user\_data) | User data that is appended to the user data script after of the EKS bootstrap script. Not used when `platform` = `bottlerocket` | `string` | `""` | no |
|
||||
| <a name="input_pre_bootstrap_user_data"></a> [pre\_bootstrap\_user\_data](#input\_pre\_bootstrap\_user\_data) | User data that is injected into the user data script ahead of the EKS bootstrap script. Not used when `platform` = `bottlerocket` | `string` | `""` | no |
|
||||
| <a name="input_propagate_tags"></a> [propagate\_tags](#input\_propagate\_tags) | A list of tag blocks. Each element should have keys named `key`, `value`, and `propagate_at_launch` | `list(map(string))` | `[]` | no |
|
||||
| <a name="input_protect_from_scale_in"></a> [protect\_from\_scale\_in](#input\_protect\_from\_scale\_in) | Allows setting instance protection. The autoscaling group will not select instances with this setting for termination during scale in events. | `bool` | `false` | no |
|
||||
| <a name="input_ram_disk_id"></a> [ram\_disk\_id](#input\_ram\_disk\_id) | The ID of the ram disk | `string` | `null` | no |
|
||||
| <a name="input_schedules"></a> [schedules](#input\_schedules) | Map of autoscaling group schedule to create | `map(any)` | `{}` | no |
|
||||
| <a name="input_security_group_description"></a> [security\_group\_description](#input\_security\_group\_description) | Description for the security group created | `string` | `"EKS self-managed node group security group"` | no |
|
||||
| <a name="input_security_group_name"></a> [security\_group\_name](#input\_security\_group\_name) | Name to use on security group created | `string` | `null` | no |
|
||||
| <a name="input_security_group_rules"></a> [security\_group\_rules](#input\_security\_group\_rules) | List of security group rules to add to the security group created | `any` | `{}` | no |
|
||||
| <a name="input_security_group_tags"></a> [security\_group\_tags](#input\_security\_group\_tags) | A map of additional tags to add to the security group created | `map(string)` | `{}` | no |
|
||||
| <a name="input_security_group_use_name_prefix"></a> [security\_group\_use\_name\_prefix](#input\_security\_group\_use\_name\_prefix) | Determines whether the security group name (`security_group_name`) is used as a prefix | `string` | `true` | no |
|
||||
| <a name="input_service_linked_role_arn"></a> [service\_linked\_role\_arn](#input\_service\_linked\_role\_arn) | The ARN of the service-linked role that the ASG will use to call other AWS services | `string` | `null` | no |
|
||||
| <a name="input_subnet_ids"></a> [subnet\_ids](#input\_subnet\_ids) | A list of subnet IDs to launch resources in. Subnets automatically determine which availability zones the group will reside. Conflicts with `availability_zones` | `list(string)` | `null` | no |
|
||||
| <a name="input_suspended_processes"></a> [suspended\_processes](#input\_suspended\_processes) | A list of processes to suspend for the Auto Scaling Group. The allowed values are `Launch`, `Terminate`, `HealthCheck`, `ReplaceUnhealthy`, `AZRebalance`, `AlarmNotification`, `ScheduledActions`, `AddToLoadBalancer`. Note that if you suspend either the `Launch` or `Terminate` process types, it can prevent your Auto Scaling Group from functioning properly | `list(string)` | `null` | no |
|
||||
| <a name="input_tags"></a> [tags](#input\_tags) | A map of tags to add to all resources | `map(string)` | `{}` | no |
|
||||
| <a name="input_target_group_arns"></a> [target\_group\_arns](#input\_target\_group\_arns) | A set of `aws_alb_target_group` ARNs, for use with Application or Network Load Balancing | `list(string)` | `[]` | no |
|
||||
| <a name="input_termination_policies"></a> [termination\_policies](#input\_termination\_policies) | A list of policies to decide how the instances in the Auto Scaling Group should be terminated. The allowed values are `OldestInstance`, `NewestInstance`, `OldestLaunchConfiguration`, `ClosestToNextInstanceHour`, `OldestLaunchTemplate`, `AllocationStrategy`, `Default` | `list(string)` | `null` | no |
|
||||
| <a name="input_update_launch_template_default_version"></a> [update\_launch\_template\_default\_version](#input\_update\_launch\_template\_default\_version) | Whether to update Default Version each update. Conflicts with `launch_template_default_version` | `bool` | `true` | no |
|
||||
| <a name="input_use_mixed_instances_policy"></a> [use\_mixed\_instances\_policy](#input\_use\_mixed\_instances\_policy) | Determines whether to use a mixed instances policy in the autoscaling group or not | `bool` | `false` | no |
|
||||
| <a name="input_use_name_prefix"></a> [use\_name\_prefix](#input\_use\_name\_prefix) | Determines whether to use `name` as is or create a unique name beginning with the `name` as the prefix | `bool` | `true` | no |
|
||||
| <a name="input_user_data_template_path"></a> [user\_data\_template\_path](#input\_user\_data\_template\_path) | Path to a local, custom user data template file to use when rendering user data | `string` | `""` | no |
|
||||
| <a name="input_vpc_id"></a> [vpc\_id](#input\_vpc\_id) | ID of the VPC where the security group/nodes will be provisioned | `string` | `null` | no |
|
||||
| <a name="input_vpc_security_group_ids"></a> [vpc\_security\_group\_ids](#input\_vpc\_security\_group\_ids) | A list of security group IDs to associate | `list(string)` | `[]` | no |
|
||||
| <a name="input_wait_for_capacity_timeout"></a> [wait\_for\_capacity\_timeout](#input\_wait\_for\_capacity\_timeout) | A maximum duration that Terraform should wait for ASG instances to be healthy before timing out. (See also Waiting for Capacity below.) Setting this to '0' causes Terraform to skip all Capacity Waiting behavior. | `string` | `null` | no |
|
||||
| <a name="input_wait_for_elb_capacity"></a> [wait\_for\_elb\_capacity](#input\_wait\_for\_elb\_capacity) | Setting this will cause Terraform to wait for exactly this number of healthy instances in all attached load balancers on both create and update operations. Takes precedence over `min_elb_capacity` behavior. | `number` | `null` | no |
|
||||
| <a name="input_warm_pool"></a> [warm\_pool](#input\_warm\_pool) | If this block is configured, add a Warm Pool to the specified Auto Scaling group | `any` | `null` | no |
|
||||
|
||||
## Outputs
|
||||
|
||||
| Name | Description |
|
||||
|------|-------------|
|
||||
| <a name="output_autoscaling_group_arn"></a> [autoscaling\_group\_arn](#output\_autoscaling\_group\_arn) | The ARN for this autoscaling group |
|
||||
| <a name="output_autoscaling_group_availability_zones"></a> [autoscaling\_group\_availability\_zones](#output\_autoscaling\_group\_availability\_zones) | The availability zones of the autoscaling group |
|
||||
| <a name="output_autoscaling_group_default_cooldown"></a> [autoscaling\_group\_default\_cooldown](#output\_autoscaling\_group\_default\_cooldown) | Time between a scaling activity and the succeeding scaling activity |
|
||||
| <a name="output_autoscaling_group_desired_capacity"></a> [autoscaling\_group\_desired\_capacity](#output\_autoscaling\_group\_desired\_capacity) | The number of Amazon EC2 instances that should be running in the group |
|
||||
| <a name="output_autoscaling_group_health_check_grace_period"></a> [autoscaling\_group\_health\_check\_grace\_period](#output\_autoscaling\_group\_health\_check\_grace\_period) | Time after instance comes into service before checking health |
|
||||
| <a name="output_autoscaling_group_health_check_type"></a> [autoscaling\_group\_health\_check\_type](#output\_autoscaling\_group\_health\_check\_type) | EC2 or ELB. Controls how health checking is done |
|
||||
| <a name="output_autoscaling_group_id"></a> [autoscaling\_group\_id](#output\_autoscaling\_group\_id) | The autoscaling group id |
|
||||
| <a name="output_autoscaling_group_max_size"></a> [autoscaling\_group\_max\_size](#output\_autoscaling\_group\_max\_size) | The maximum size of the autoscaling group |
|
||||
| <a name="output_autoscaling_group_min_size"></a> [autoscaling\_group\_min\_size](#output\_autoscaling\_group\_min\_size) | The minimum size of the autoscaling group |
|
||||
| <a name="output_autoscaling_group_name"></a> [autoscaling\_group\_name](#output\_autoscaling\_group\_name) | The autoscaling group name |
|
||||
| <a name="output_autoscaling_group_schedule_arns"></a> [autoscaling\_group\_schedule\_arns](#output\_autoscaling\_group\_schedule\_arns) | ARNs of autoscaling group schedules |
|
||||
| <a name="output_autoscaling_group_vpc_zone_identifier"></a> [autoscaling\_group\_vpc\_zone\_identifier](#output\_autoscaling\_group\_vpc\_zone\_identifier) | The VPC zone identifier |
|
||||
| <a name="output_iam_instance_profile_arn"></a> [iam\_instance\_profile\_arn](#output\_iam\_instance\_profile\_arn) | ARN assigned by AWS to the instance profile |
|
||||
| <a name="output_iam_instance_profile_id"></a> [iam\_instance\_profile\_id](#output\_iam\_instance\_profile\_id) | Instance profile's ID |
|
||||
| <a name="output_iam_instance_profile_unique"></a> [iam\_instance\_profile\_unique](#output\_iam\_instance\_profile\_unique) | Stable and unique string identifying the IAM instance profile |
|
||||
| <a name="output_iam_role_arn"></a> [iam\_role\_arn](#output\_iam\_role\_arn) | The Amazon Resource Name (ARN) specifying the IAM role |
|
||||
| <a name="output_iam_role_name"></a> [iam\_role\_name](#output\_iam\_role\_name) | The name of the IAM role |
|
||||
| <a name="output_iam_role_unique_id"></a> [iam\_role\_unique\_id](#output\_iam\_role\_unique\_id) | Stable and unique string identifying the IAM role |
|
||||
| <a name="output_launch_template_arn"></a> [launch\_template\_arn](#output\_launch\_template\_arn) | The ARN of the launch template |
|
||||
| <a name="output_launch_template_id"></a> [launch\_template\_id](#output\_launch\_template\_id) | The ID of the launch template |
|
||||
| <a name="output_launch_template_latest_version"></a> [launch\_template\_latest\_version](#output\_launch\_template\_latest\_version) | The latest version of the launch template |
|
||||
| <a name="output_platform"></a> [platform](#output\_platform) | Identifies if the OS platform is `bottlerocket`, `linux`, or `windows` based |
|
||||
| <a name="output_security_group_arn"></a> [security\_group\_arn](#output\_security\_group\_arn) | Amazon Resource Name (ARN) of the security group |
|
||||
| <a name="output_security_group_id"></a> [security\_group\_id](#output\_security\_group\_id) | ID of the security group |
|
||||
<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
|
||||
554
modules/self-managed-node-group/main.tf
Normal file
554
modules/self-managed-node-group/main.tf
Normal file
@@ -0,0 +1,554 @@
|
||||
data "aws_partition" "current" {}
|
||||
|
||||
data "aws_ami" "eks_default" {
|
||||
count = var.create ? 1 : 0
|
||||
|
||||
filter {
|
||||
name = "name"
|
||||
values = ["amazon-eks-node-${var.cluster_version}-v*"]
|
||||
}
|
||||
|
||||
most_recent = true
|
||||
owners = ["amazon"]
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# User Data
|
||||
################################################################################
|
||||
|
||||
module "user_data" {
|
||||
source = "../_user_data"
|
||||
|
||||
create = var.create
|
||||
platform = var.platform
|
||||
is_eks_managed_node_group = false
|
||||
|
||||
cluster_name = var.cluster_name
|
||||
cluster_endpoint = var.cluster_endpoint
|
||||
cluster_auth_base64 = var.cluster_auth_base64
|
||||
|
||||
enable_bootstrap_user_data = true
|
||||
pre_bootstrap_user_data = var.pre_bootstrap_user_data
|
||||
post_bootstrap_user_data = var.post_bootstrap_user_data
|
||||
bootstrap_extra_args = var.bootstrap_extra_args
|
||||
user_data_template_path = var.user_data_template_path
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Launch template
|
||||
################################################################################
|
||||
|
||||
locals {
|
||||
launch_template_name_int = coalesce(var.launch_template_name, "${var.name}-node-group")
|
||||
}
|
||||
|
||||
resource "aws_launch_template" "this" {
|
||||
count = var.create && var.create_launch_template ? 1 : 0
|
||||
|
||||
name = var.launch_template_use_name_prefix ? null : local.launch_template_name_int
|
||||
name_prefix = var.launch_template_use_name_prefix ? "${local.launch_template_name_int}-" : null
|
||||
description = var.launch_template_description
|
||||
|
||||
ebs_optimized = var.ebs_optimized
|
||||
image_id = coalesce(var.ami_id, data.aws_ami.eks_default[0].image_id)
|
||||
instance_type = var.instance_type
|
||||
key_name = var.key_name
|
||||
user_data = module.user_data.user_data
|
||||
|
||||
vpc_security_group_ids = compact(concat([try(aws_security_group.this[0].id, "")], var.vpc_security_group_ids))
|
||||
|
||||
default_version = var.launch_template_default_version
|
||||
update_default_version = var.update_launch_template_default_version
|
||||
disable_api_termination = var.disable_api_termination
|
||||
instance_initiated_shutdown_behavior = var.instance_initiated_shutdown_behavior
|
||||
kernel_id = var.kernel_id
|
||||
ram_disk_id = var.ram_disk_id
|
||||
|
||||
dynamic "block_device_mappings" {
|
||||
for_each = var.block_device_mappings
|
||||
content {
|
||||
device_name = block_device_mappings.value.device_name
|
||||
no_device = lookup(block_device_mappings.value, "no_device", null)
|
||||
virtual_name = lookup(block_device_mappings.value, "virtual_name", null)
|
||||
|
||||
dynamic "ebs" {
|
||||
for_each = flatten([lookup(block_device_mappings.value, "ebs", [])])
|
||||
content {
|
||||
delete_on_termination = lookup(ebs.value, "delete_on_termination", null)
|
||||
encrypted = lookup(ebs.value, "encrypted", null)
|
||||
kms_key_id = lookup(ebs.value, "kms_key_id", null)
|
||||
iops = lookup(ebs.value, "iops", null)
|
||||
throughput = lookup(ebs.value, "throughput", null)
|
||||
snapshot_id = lookup(ebs.value, "snapshot_id", null)
|
||||
volume_size = lookup(ebs.value, "volume_size", null)
|
||||
volume_type = lookup(ebs.value, "volume_type", null)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "capacity_reservation_specification" {
|
||||
for_each = var.capacity_reservation_specification != null ? [var.capacity_reservation_specification] : []
|
||||
content {
|
||||
capacity_reservation_preference = lookup(capacity_reservation_specification.value, "capacity_reservation_preference", null)
|
||||
|
||||
dynamic "capacity_reservation_target" {
|
||||
for_each = lookup(capacity_reservation_specification.value, "capacity_reservation_target", [])
|
||||
content {
|
||||
capacity_reservation_id = lookup(capacity_reservation_target.value, "capacity_reservation_id", null)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "cpu_options" {
|
||||
for_each = var.cpu_options != null ? [var.cpu_options] : []
|
||||
content {
|
||||
core_count = cpu_options.value.core_count
|
||||
threads_per_core = cpu_options.value.threads_per_core
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "credit_specification" {
|
||||
for_each = var.credit_specification != null ? [var.credit_specification] : []
|
||||
content {
|
||||
cpu_credits = credit_specification.value.cpu_credits
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "elastic_gpu_specifications" {
|
||||
for_each = var.elastic_gpu_specifications != null ? [var.elastic_gpu_specifications] : []
|
||||
content {
|
||||
type = elastic_gpu_specifications.value.type
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "elastic_inference_accelerator" {
|
||||
for_each = var.elastic_inference_accelerator != null ? [var.elastic_inference_accelerator] : []
|
||||
content {
|
||||
type = elastic_inference_accelerator.value.type
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "enclave_options" {
|
||||
for_each = var.enclave_options != null ? [var.enclave_options] : []
|
||||
content {
|
||||
enabled = enclave_options.value.enabled
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "hibernation_options" {
|
||||
for_each = var.hibernation_options != null ? [var.hibernation_options] : []
|
||||
content {
|
||||
configured = hibernation_options.value.configured
|
||||
}
|
||||
}
|
||||
|
||||
iam_instance_profile {
|
||||
arn = var.create_iam_instance_profile ? aws_iam_instance_profile.this[0].arn : var.iam_instance_profile_arn
|
||||
}
|
||||
|
||||
dynamic "instance_market_options" {
|
||||
for_each = var.instance_market_options != null ? [var.instance_market_options] : []
|
||||
content {
|
||||
market_type = instance_market_options.value.market_type
|
||||
|
||||
dynamic "spot_options" {
|
||||
for_each = lookup(instance_market_options.value, "spot_options", null) != null ? [instance_market_options.value.spot_options] : []
|
||||
content {
|
||||
block_duration_minutes = spot_options.value.block_duration_minutes
|
||||
instance_interruption_behavior = lookup(spot_options.value, "instance_interruption_behavior", null)
|
||||
max_price = lookup(spot_options.value, "max_price", null)
|
||||
spot_instance_type = lookup(spot_options.value, "spot_instance_type", null)
|
||||
valid_until = lookup(spot_options.value, "valid_until", null)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "license_specification" {
|
||||
for_each = var.license_specifications != null ? [var.license_specifications] : []
|
||||
content {
|
||||
license_configuration_arn = license_specifications.value.license_configuration_arn
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "metadata_options" {
|
||||
for_each = var.metadata_options != null ? [var.metadata_options] : []
|
||||
content {
|
||||
http_endpoint = lookup(metadata_options.value, "http_endpoint", null)
|
||||
http_tokens = lookup(metadata_options.value, "http_tokens", null)
|
||||
http_put_response_hop_limit = lookup(metadata_options.value, "http_put_response_hop_limit", null)
|
||||
http_protocol_ipv6 = lookup(metadata_options.value, "http_protocol_ipv6", null)
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "monitoring" {
|
||||
for_each = var.enable_monitoring != null ? [1] : []
|
||||
content {
|
||||
enabled = var.enable_monitoring
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "network_interfaces" {
|
||||
for_each = var.network_interfaces
|
||||
content {
|
||||
associate_carrier_ip_address = lookup(network_interfaces.value, "associate_carrier_ip_address", null)
|
||||
associate_public_ip_address = lookup(network_interfaces.value, "associate_public_ip_address", null)
|
||||
delete_on_termination = lookup(network_interfaces.value, "delete_on_termination", null)
|
||||
description = lookup(network_interfaces.value, "description", null)
|
||||
device_index = lookup(network_interfaces.value, "device_index", null)
|
||||
ipv4_addresses = lookup(network_interfaces.value, "ipv4_addresses", null) != null ? network_interfaces.value.ipv4_addresses : []
|
||||
ipv4_address_count = lookup(network_interfaces.value, "ipv4_address_count", null)
|
||||
ipv6_addresses = lookup(network_interfaces.value, "ipv6_addresses", null) != null ? network_interfaces.value.ipv6_addresses : []
|
||||
ipv6_address_count = lookup(network_interfaces.value, "ipv6_address_count", null)
|
||||
network_interface_id = lookup(network_interfaces.value, "network_interface_id", null)
|
||||
private_ip_address = lookup(network_interfaces.value, "private_ip_address", null)
|
||||
security_groups = lookup(network_interfaces.value, "security_groups", null) != null ? network_interfaces.value.security_groups : []
|
||||
subnet_id = lookup(network_interfaces.value, "subnet_id", null)
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "placement" {
|
||||
for_each = var.placement != null ? [var.placement] : []
|
||||
content {
|
||||
affinity = lookup(placement.value, "affinity", null)
|
||||
availability_zone = lookup(placement.value, "availability_zone", null)
|
||||
group_name = lookup(placement.value, "group_name", null)
|
||||
host_id = lookup(placement.value, "host_id", null)
|
||||
spread_domain = lookup(placement.value, "spread_domain", null)
|
||||
tenancy = lookup(placement.value, "tenancy", null)
|
||||
partition_number = lookup(placement.value, "partition_number", null)
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "tag_specifications" {
|
||||
for_each = toset(["instance", "volume", "network-interface"])
|
||||
content {
|
||||
resource_type = tag_specifications.key
|
||||
tags = merge(var.tags, { Name = var.name })
|
||||
}
|
||||
}
|
||||
|
||||
lifecycle {
|
||||
create_before_destroy = true
|
||||
}
|
||||
|
||||
# Prevent premature access of security group roles and policies by pods that
|
||||
# require permissions on create/destroy that depend on nodes
|
||||
depends_on = [
|
||||
aws_security_group_rule.this,
|
||||
aws_iam_role_policy_attachment.this,
|
||||
]
|
||||
|
||||
tags = var.tags
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Node Group
|
||||
################################################################################
|
||||
|
||||
locals {
|
||||
launch_template_name = try(aws_launch_template.this[0].name, var.launch_template_name)
|
||||
# Change order to allow users to set version priority before using defaults
|
||||
launch_template_version = coalesce(var.launch_template_version, try(aws_launch_template.this[0].default_version, "$Default"))
|
||||
}
|
||||
|
||||
resource "aws_autoscaling_group" "this" {
|
||||
count = var.create ? 1 : 0
|
||||
|
||||
name = var.use_name_prefix ? null : var.name
|
||||
name_prefix = var.use_name_prefix ? "${var.name}-" : null
|
||||
|
||||
dynamic "launch_template" {
|
||||
for_each = var.use_mixed_instances_policy ? [] : [1]
|
||||
|
||||
content {
|
||||
name = local.launch_template_name
|
||||
version = local.launch_template_version
|
||||
}
|
||||
}
|
||||
|
||||
availability_zones = var.availability_zones
|
||||
vpc_zone_identifier = var.subnet_ids
|
||||
|
||||
min_size = var.min_size
|
||||
max_size = var.max_size
|
||||
desired_capacity = var.desired_size
|
||||
capacity_rebalance = var.capacity_rebalance
|
||||
min_elb_capacity = var.min_elb_capacity
|
||||
wait_for_elb_capacity = var.wait_for_elb_capacity
|
||||
wait_for_capacity_timeout = var.wait_for_capacity_timeout
|
||||
default_cooldown = var.default_cooldown
|
||||
protect_from_scale_in = var.protect_from_scale_in
|
||||
|
||||
target_group_arns = var.target_group_arns
|
||||
placement_group = var.placement_group
|
||||
health_check_type = var.health_check_type
|
||||
health_check_grace_period = var.health_check_grace_period
|
||||
|
||||
force_delete = var.force_delete
|
||||
termination_policies = var.termination_policies
|
||||
suspended_processes = var.suspended_processes
|
||||
max_instance_lifetime = var.max_instance_lifetime
|
||||
|
||||
enabled_metrics = var.enabled_metrics
|
||||
metrics_granularity = var.metrics_granularity
|
||||
service_linked_role_arn = var.service_linked_role_arn
|
||||
|
||||
dynamic "initial_lifecycle_hook" {
|
||||
for_each = var.initial_lifecycle_hooks
|
||||
content {
|
||||
name = initial_lifecycle_hook.value.name
|
||||
default_result = lookup(initial_lifecycle_hook.value, "default_result", null)
|
||||
heartbeat_timeout = lookup(initial_lifecycle_hook.value, "heartbeat_timeout", null)
|
||||
lifecycle_transition = initial_lifecycle_hook.value.lifecycle_transition
|
||||
notification_metadata = lookup(initial_lifecycle_hook.value, "notification_metadata", null)
|
||||
notification_target_arn = lookup(initial_lifecycle_hook.value, "notification_target_arn", null)
|
||||
role_arn = lookup(initial_lifecycle_hook.value, "role_arn", null)
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "instance_refresh" {
|
||||
for_each = var.instance_refresh != null ? [var.instance_refresh] : []
|
||||
content {
|
||||
strategy = instance_refresh.value.strategy
|
||||
triggers = lookup(instance_refresh.value, "triggers", null)
|
||||
|
||||
dynamic "preferences" {
|
||||
for_each = lookup(instance_refresh.value, "preferences", null) != null ? [instance_refresh.value.preferences] : []
|
||||
content {
|
||||
instance_warmup = lookup(preferences.value, "instance_warmup", null)
|
||||
min_healthy_percentage = lookup(preferences.value, "min_healthy_percentage", null)
|
||||
checkpoint_delay = lookup(preferences.value, "checkpoint_delay", null)
|
||||
checkpoint_percentages = lookup(preferences.value, "checkpoint_percentages", null)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "mixed_instances_policy" {
|
||||
for_each = var.use_mixed_instances_policy ? [var.mixed_instances_policy] : []
|
||||
content {
|
||||
dynamic "instances_distribution" {
|
||||
for_each = try([mixed_instances_policy.value.instances_distribution], [])
|
||||
content {
|
||||
on_demand_allocation_strategy = lookup(instances_distribution.value, "on_demand_allocation_strategy", null)
|
||||
on_demand_base_capacity = lookup(instances_distribution.value, "on_demand_base_capacity", null)
|
||||
on_demand_percentage_above_base_capacity = lookup(instances_distribution.value, "on_demand_percentage_above_base_capacity", null)
|
||||
spot_allocation_strategy = lookup(instances_distribution.value, "spot_allocation_strategy", null)
|
||||
spot_instance_pools = lookup(instances_distribution.value, "spot_instance_pools", null)
|
||||
spot_max_price = lookup(instances_distribution.value, "spot_max_price", null)
|
||||
}
|
||||
}
|
||||
|
||||
launch_template {
|
||||
launch_template_specification {
|
||||
launch_template_name = local.launch_template_name
|
||||
version = local.launch_template_version
|
||||
}
|
||||
|
||||
dynamic "override" {
|
||||
for_each = try(mixed_instances_policy.value.override, [])
|
||||
content {
|
||||
instance_type = lookup(override.value, "instance_type", null)
|
||||
weighted_capacity = lookup(override.value, "weighted_capacity", null)
|
||||
|
||||
dynamic "launch_template_specification" {
|
||||
for_each = lookup(override.value, "launch_template_specification", null) != null ? override.value.launch_template_specification : []
|
||||
content {
|
||||
launch_template_id = lookup(launch_template_specification.value, "launch_template_id", null)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "warm_pool" {
|
||||
for_each = var.warm_pool != null ? [var.warm_pool] : []
|
||||
content {
|
||||
pool_state = lookup(warm_pool.value, "pool_state", null)
|
||||
min_size = lookup(warm_pool.value, "min_size", null)
|
||||
max_group_prepared_capacity = lookup(warm_pool.value, "max_group_prepared_capacity", null)
|
||||
}
|
||||
}
|
||||
|
||||
timeouts {
|
||||
delete = var.delete_timeout
|
||||
}
|
||||
|
||||
lifecycle {
|
||||
create_before_destroy = true
|
||||
ignore_changes = [
|
||||
desired_capacity
|
||||
]
|
||||
}
|
||||
|
||||
tags = concat(
|
||||
[
|
||||
{
|
||||
key = "Name"
|
||||
value = var.name
|
||||
propagate_at_launch = true
|
||||
},
|
||||
{
|
||||
key = "kubernetes.io/cluster/${var.cluster_name}"
|
||||
value = "owned"
|
||||
propagate_at_launch = true
|
||||
},
|
||||
{
|
||||
key = "k8s.io/cluster/${var.cluster_name}"
|
||||
value = "owned"
|
||||
propagate_at_launch = true
|
||||
},
|
||||
],
|
||||
var.propagate_tags,
|
||||
[for k, v in var.tags :
|
||||
{
|
||||
key = k
|
||||
value = v
|
||||
propagate_at_launch = true
|
||||
}
|
||||
]
|
||||
)
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Autoscaling group schedule
|
||||
################################################################################
|
||||
|
||||
resource "aws_autoscaling_schedule" "this" {
|
||||
for_each = var.create && var.create_schedule ? var.schedules : {}
|
||||
|
||||
scheduled_action_name = each.key
|
||||
autoscaling_group_name = aws_autoscaling_group.this[0].name
|
||||
|
||||
min_size = lookup(each.value, "min_size", null)
|
||||
max_size = lookup(each.value, "max_size", null)
|
||||
desired_capacity = lookup(each.value, "desired_size", null)
|
||||
start_time = lookup(each.value, "start_time", null)
|
||||
end_time = lookup(each.value, "end_time", null)
|
||||
time_zone = lookup(each.value, "time_zone", null)
|
||||
|
||||
# [Minute] [Hour] [Day_of_Month] [Month_of_Year] [Day_of_Week]
|
||||
# Cron examples: https://crontab.guru/examples.html
|
||||
recurrence = lookup(each.value, "recurrence", null)
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Security Group
|
||||
################################################################################
|
||||
|
||||
locals {
|
||||
security_group_name = coalesce(var.security_group_name, "${var.name}-node-group")
|
||||
create_security_group = var.create && var.create_security_group
|
||||
}
|
||||
|
||||
resource "aws_security_group" "this" {
|
||||
count = local.create_security_group ? 1 : 0
|
||||
|
||||
name = var.security_group_use_name_prefix ? null : local.security_group_name
|
||||
name_prefix = var.security_group_use_name_prefix ? "${local.security_group_name}-" : null
|
||||
description = var.security_group_description
|
||||
vpc_id = var.vpc_id
|
||||
|
||||
tags = merge(
|
||||
var.tags,
|
||||
{
|
||||
"Name" = local.security_group_name
|
||||
"kubernetes.io/cluster/${var.cluster_name}" = "owned"
|
||||
},
|
||||
var.security_group_tags
|
||||
)
|
||||
}
|
||||
|
||||
resource "aws_security_group_rule" "this" {
|
||||
for_each = { for k, v in var.security_group_rules : k => v if local.create_security_group }
|
||||
|
||||
# Required
|
||||
security_group_id = aws_security_group.this[0].id
|
||||
protocol = each.value.protocol
|
||||
from_port = each.value.from_port
|
||||
to_port = each.value.to_port
|
||||
type = each.value.type
|
||||
|
||||
# Optional
|
||||
description = try(each.value.description, null)
|
||||
cidr_blocks = try(each.value.cidr_blocks, null)
|
||||
ipv6_cidr_blocks = try(each.value.ipv6_cidr_blocks, null)
|
||||
prefix_list_ids = try(each.value.prefix_list_ids, [])
|
||||
self = try(each.value.self, null)
|
||||
source_security_group_id = try(
|
||||
each.value.source_security_group_id,
|
||||
try(each.value.source_cluster_security_group, false) ? var.cluster_security_group_id : null
|
||||
)
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# IAM Role
|
||||
################################################################################
|
||||
|
||||
locals {
|
||||
iam_role_name = coalesce(var.iam_role_name, "${var.name}-node-group")
|
||||
|
||||
iam_role_policy_prefix = "arn:${data.aws_partition.current.partition}:iam::aws:policy"
|
||||
}
|
||||
|
||||
data "aws_iam_policy_document" "assume_role_policy" {
|
||||
count = var.create && var.create_iam_instance_profile ? 1 : 0
|
||||
|
||||
statement {
|
||||
sid = "EKSNodeAssumeRole"
|
||||
actions = ["sts:AssumeRole"]
|
||||
|
||||
principals {
|
||||
type = "Service"
|
||||
identifiers = ["ec2.${data.aws_partition.current.dns_suffix}"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_iam_role" "this" {
|
||||
count = var.create && var.create_iam_instance_profile ? 1 : 0
|
||||
|
||||
name = var.iam_role_use_name_prefix ? null : local.iam_role_name
|
||||
name_prefix = var.iam_role_use_name_prefix ? "${local.iam_role_name}-" : null
|
||||
path = var.iam_role_path
|
||||
description = var.iam_role_description
|
||||
|
||||
assume_role_policy = data.aws_iam_policy_document.assume_role_policy[0].json
|
||||
permissions_boundary = var.iam_role_permissions_boundary
|
||||
force_detach_policies = true
|
||||
|
||||
tags = merge(var.tags, var.iam_role_tags)
|
||||
}
|
||||
|
||||
resource "aws_iam_role_policy_attachment" "this" {
|
||||
for_each = var.create && var.create_iam_instance_profile ? toset(compact(distinct(concat([
|
||||
"${local.iam_role_policy_prefix}/AmazonEKSWorkerNodePolicy",
|
||||
"${local.iam_role_policy_prefix}/AmazonEC2ContainerRegistryReadOnly",
|
||||
var.iam_role_attach_cni_policy ? "${local.iam_role_policy_prefix}/AmazonEKS_CNI_Policy" : "",
|
||||
], var.iam_role_additional_policies)))) : toset([])
|
||||
|
||||
policy_arn = each.value
|
||||
role = aws_iam_role.this[0].name
|
||||
}
|
||||
|
||||
# Only self-managed node group requires instance profile
|
||||
resource "aws_iam_instance_profile" "this" {
|
||||
count = var.create && var.create_iam_instance_profile ? 1 : 0
|
||||
|
||||
role = aws_iam_role.this[0].name
|
||||
|
||||
name = var.iam_role_use_name_prefix ? null : local.iam_role_name
|
||||
name_prefix = var.iam_role_use_name_prefix ? "${local.iam_role_name}-" : null
|
||||
path = var.iam_role_path
|
||||
|
||||
lifecycle {
|
||||
create_before_destroy = true
|
||||
}
|
||||
|
||||
tags = merge(var.tags, var.iam_role_tags)
|
||||
}
|
||||
147
modules/self-managed-node-group/outputs.tf
Normal file
147
modules/self-managed-node-group/outputs.tf
Normal file
@@ -0,0 +1,147 @@
|
||||
################################################################################
|
||||
# Launch template
|
||||
################################################################################
|
||||
|
||||
output "launch_template_id" {
|
||||
description = "The ID of the launch template"
|
||||
value = try(aws_launch_template.this[0].id, "")
|
||||
}
|
||||
|
||||
output "launch_template_arn" {
|
||||
description = "The ARN of the launch template"
|
||||
value = try(aws_launch_template.this[0].arn, "")
|
||||
}
|
||||
|
||||
output "launch_template_latest_version" {
|
||||
description = "The latest version of the launch template"
|
||||
value = try(aws_launch_template.this[0].latest_version, "")
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# autoscaling group
|
||||
################################################################################
|
||||
|
||||
output "autoscaling_group_arn" {
|
||||
description = "The ARN for this autoscaling group"
|
||||
value = try(aws_autoscaling_group.this[0].arn, "")
|
||||
}
|
||||
|
||||
output "autoscaling_group_id" {
|
||||
description = "The autoscaling group id"
|
||||
value = try(aws_autoscaling_group.this[0].id, "")
|
||||
}
|
||||
|
||||
output "autoscaling_group_name" {
|
||||
description = "The autoscaling group name"
|
||||
value = try(aws_autoscaling_group.this[0].name, "")
|
||||
}
|
||||
|
||||
output "autoscaling_group_min_size" {
|
||||
description = "The minimum size of the autoscaling group"
|
||||
value = try(aws_autoscaling_group.this[0].min_size, "")
|
||||
}
|
||||
|
||||
output "autoscaling_group_max_size" {
|
||||
description = "The maximum size of the autoscaling group"
|
||||
value = try(aws_autoscaling_group.this[0].max_size, "")
|
||||
}
|
||||
|
||||
output "autoscaling_group_desired_capacity" {
|
||||
description = "The number of Amazon EC2 instances that should be running in the group"
|
||||
value = try(aws_autoscaling_group.this[0].desired_capacity, "")
|
||||
}
|
||||
|
||||
output "autoscaling_group_default_cooldown" {
|
||||
description = "Time between a scaling activity and the succeeding scaling activity"
|
||||
value = try(aws_autoscaling_group.this[0].default_cooldown, "")
|
||||
}
|
||||
|
||||
output "autoscaling_group_health_check_grace_period" {
|
||||
description = "Time after instance comes into service before checking health"
|
||||
value = try(aws_autoscaling_group.this[0].health_check_grace_period, "")
|
||||
}
|
||||
|
||||
output "autoscaling_group_health_check_type" {
|
||||
description = "EC2 or ELB. Controls how health checking is done"
|
||||
value = try(aws_autoscaling_group.this[0].health_check_type, "")
|
||||
}
|
||||
|
||||
output "autoscaling_group_availability_zones" {
|
||||
description = "The availability zones of the autoscaling group"
|
||||
value = try(aws_autoscaling_group.this[0].availability_zones, "")
|
||||
}
|
||||
|
||||
output "autoscaling_group_vpc_zone_identifier" {
|
||||
description = "The VPC zone identifier"
|
||||
value = try(aws_autoscaling_group.this[0].vpc_zone_identifier, "")
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# autoscaling group schedule
|
||||
################################################################################
|
||||
|
||||
output "autoscaling_group_schedule_arns" {
|
||||
description = "ARNs of autoscaling group schedules"
|
||||
value = { for k, v in aws_autoscaling_schedule.this : k => v.arn }
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Security Group
|
||||
################################################################################
|
||||
|
||||
output "security_group_arn" {
|
||||
description = "Amazon Resource Name (ARN) of the security group"
|
||||
value = try(aws_security_group.this[0].arn, "")
|
||||
}
|
||||
|
||||
output "security_group_id" {
|
||||
description = "ID of the security group"
|
||||
value = try(aws_security_group.this[0].id, "")
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# IAM Role
|
||||
################################################################################
|
||||
|
||||
output "iam_role_name" {
|
||||
description = "The name of the IAM role"
|
||||
value = try(aws_iam_role.this[0].name, "")
|
||||
}
|
||||
|
||||
output "iam_role_arn" {
|
||||
description = "The Amazon Resource Name (ARN) specifying the IAM role"
|
||||
value = try(aws_iam_role.this[0].arn, "")
|
||||
}
|
||||
|
||||
output "iam_role_unique_id" {
|
||||
description = "Stable and unique string identifying the IAM role"
|
||||
value = try(aws_iam_role.this[0].unique_id, "")
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# IAM Instance Profile
|
||||
################################################################################
|
||||
|
||||
output "iam_instance_profile_arn" {
|
||||
description = "ARN assigned by AWS to the instance profile"
|
||||
value = try(aws_iam_instance_profile.this[0].arn, "")
|
||||
}
|
||||
|
||||
output "iam_instance_profile_id" {
|
||||
description = "Instance profile's ID"
|
||||
value = try(aws_iam_instance_profile.this[0].id, "")
|
||||
}
|
||||
|
||||
output "iam_instance_profile_unique" {
|
||||
description = "Stable and unique string identifying the IAM instance profile"
|
||||
value = try(aws_iam_instance_profile.this[0].unique_id, "")
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Additional
|
||||
################################################################################
|
||||
|
||||
output "platform" {
|
||||
description = "Identifies if the OS platform is `bottlerocket`, `linux`, or `windows` based"
|
||||
value = var.platform
|
||||
}
|
||||
579
modules/self-managed-node-group/variables.tf
Normal file
579
modules/self-managed-node-group/variables.tf
Normal file
@@ -0,0 +1,579 @@
|
||||
variable "create" {
|
||||
description = "Determines whether to create self managed node group or not"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "tags" {
|
||||
description = "A map of tags to add to all resources"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "platform" {
|
||||
description = "Identifies if the OS platform is `bottlerocket`, `linux`, or `windows` based"
|
||||
type = string
|
||||
default = "linux"
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# User Data
|
||||
################################################################################
|
||||
|
||||
variable "cluster_name" {
|
||||
description = "Name of associated EKS cluster"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "cluster_endpoint" {
|
||||
description = "Endpoint of associated EKS cluster"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "cluster_auth_base64" {
|
||||
description = "Base64 encoded CA of associated EKS cluster"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "pre_bootstrap_user_data" {
|
||||
description = "User data that is injected into the user data script ahead of the EKS bootstrap script. Not used when `platform` = `bottlerocket`"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "post_bootstrap_user_data" {
|
||||
description = "User data that is appended to the user data script after of the EKS bootstrap script. Not used when `platform` = `bottlerocket`"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "bootstrap_extra_args" {
|
||||
description = "Additional arguments passed to the bootstrap script. When `platform` = `bottlerocket`; these are additional [settings](https://github.com/bottlerocket-os/bottlerocket#settings) that are provided to the Bottlerocket user data"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "user_data_template_path" {
|
||||
description = "Path to a local, custom user data template file to use when rendering user data"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Launch template
|
||||
################################################################################
|
||||
|
||||
variable "create_launch_template" {
|
||||
description = "Determines whether to create launch template or not"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "launch_template_name" {
|
||||
description = "Launch template name - either to be created (`var.create_launch_template` = `true`) or existing (`var.create_launch_template` = `false`)"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "launch_template_use_name_prefix" {
|
||||
description = "Determines whether to use `launch_template_name` as is or create a unique name beginning with the `launch_template_name` as the prefix"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "launch_template_description" {
|
||||
description = "Description of the launch template"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "launch_template_default_version" {
|
||||
description = "Default Version of the launch template"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "update_launch_template_default_version" {
|
||||
description = "Whether to update Default Version each update. Conflicts with `launch_template_default_version`"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "disable_api_termination" {
|
||||
description = "If true, enables EC2 instance termination protection"
|
||||
type = bool
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "instance_initiated_shutdown_behavior" {
|
||||
description = "Shutdown behavior for the instance. Can be `stop` or `terminate`. (Default: `stop`)"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "kernel_id" {
|
||||
description = "The kernel ID"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "ram_disk_id" {
|
||||
description = "The ID of the ram disk"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "block_device_mappings" {
|
||||
description = "Specify volumes to attach to the instance besides the volumes specified by the AMI"
|
||||
type = any
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "capacity_reservation_specification" {
|
||||
description = "Targeting for EC2 capacity reservations"
|
||||
type = any
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "cpu_options" {
|
||||
description = "The CPU options for the instance"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "credit_specification" {
|
||||
description = "Customize the credit specification of the instance"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "elastic_gpu_specifications" {
|
||||
description = "The elastic GPU to attach to the instance"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "elastic_inference_accelerator" {
|
||||
description = "Configuration block containing an Elastic Inference Accelerator to attach to the instance"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "enclave_options" {
|
||||
description = "Enable Nitro Enclaves on launched instances"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "hibernation_options" {
|
||||
description = "The hibernation options for the instance"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "instance_market_options" {
|
||||
description = "The market (purchasing) option for the instance"
|
||||
type = any
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "license_specifications" {
|
||||
description = "A list of license specifications to associate with"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "network_interfaces" {
|
||||
description = "Customize network interfaces to be attached at instance boot time"
|
||||
type = list(any)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "placement" {
|
||||
description = "The placement of the instance"
|
||||
type = map(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "ebs_optimized" {
|
||||
description = "If true, the launched EC2 instance will be EBS-optimized"
|
||||
type = bool
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "ami_id" {
|
||||
description = "The AMI from which to launch the instance"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "cluster_version" {
|
||||
description = "Kubernetes cluster version - used to lookup default AMI ID if one is not provided"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "instance_type" {
|
||||
description = "The type of the instance to launch"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "key_name" {
|
||||
description = "The key name that should be used for the instance"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "vpc_security_group_ids" {
|
||||
description = "A list of security group IDs to associate"
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "enable_monitoring" {
|
||||
description = "Enables/disables detailed monitoring"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "metadata_options" {
|
||||
description = "Customize the metadata options for the instance"
|
||||
type = map(string)
|
||||
default = {
|
||||
http_endpoint = "enabled"
|
||||
http_tokens = "required"
|
||||
http_put_response_hop_limit = 2
|
||||
}
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Autoscaling group
|
||||
################################################################################
|
||||
|
||||
variable "name" {
|
||||
description = "Name of the Self managed Node Group"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "use_name_prefix" {
|
||||
description = "Determines whether to use `name` as is or create a unique name beginning with the `name` as the prefix"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "launch_template_version" {
|
||||
description = "Launch template version. Can be version number, `$Latest`, or `$Default`"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "availability_zones" {
|
||||
description = "A list of one or more availability zones for the group. Used for EC2-Classic and default subnets when not specified with `subnet_ids` argument. Conflicts with `subnet_ids`"
|
||||
type = list(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "subnet_ids" {
|
||||
description = "A list of subnet IDs to launch resources in. Subnets automatically determine which availability zones the group will reside. Conflicts with `availability_zones`"
|
||||
type = list(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "min_size" {
|
||||
description = "The minimum size of the autoscaling group"
|
||||
type = number
|
||||
default = 0
|
||||
}
|
||||
|
||||
variable "max_size" {
|
||||
description = "The maximum size of the autoscaling group"
|
||||
type = number
|
||||
default = 3
|
||||
}
|
||||
|
||||
variable "desired_size" {
|
||||
description = "The number of Amazon EC2 instances that should be running in the autoscaling group"
|
||||
type = number
|
||||
default = 1
|
||||
}
|
||||
|
||||
variable "capacity_rebalance" {
|
||||
description = "Indicates whether capacity rebalance is enabled"
|
||||
type = bool
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "min_elb_capacity" {
|
||||
description = "Setting this causes Terraform to wait for this number of instances to show up healthy in the ELB only on creation. Updates will not wait on ELB instance number changes"
|
||||
type = number
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "wait_for_elb_capacity" {
|
||||
description = "Setting this will cause Terraform to wait for exactly this number of healthy instances in all attached load balancers on both create and update operations. Takes precedence over `min_elb_capacity` behavior."
|
||||
type = number
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "wait_for_capacity_timeout" {
|
||||
description = "A maximum duration that Terraform should wait for ASG instances to be healthy before timing out. (See also Waiting for Capacity below.) Setting this to '0' causes Terraform to skip all Capacity Waiting behavior."
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "default_cooldown" {
|
||||
description = "The amount of time, in seconds, after a scaling activity completes before another scaling activity can start"
|
||||
type = number
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "protect_from_scale_in" {
|
||||
description = "Allows setting instance protection. The autoscaling group will not select instances with this setting for termination during scale in events."
|
||||
type = bool
|
||||
default = false
|
||||
}
|
||||
|
||||
variable "target_group_arns" {
|
||||
description = "A set of `aws_alb_target_group` ARNs, for use with Application or Network Load Balancing"
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "placement_group" {
|
||||
description = "The name of the placement group into which you'll launch your instances, if any"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "health_check_type" {
|
||||
description = "`EC2` or `ELB`. Controls how health checking is done"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "health_check_grace_period" {
|
||||
description = "Time (in seconds) after instance comes into service before checking health"
|
||||
type = number
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "force_delete" {
|
||||
description = "Allows deleting the Auto Scaling Group without waiting for all instances in the pool to terminate. You can force an Auto Scaling Group to delete even if it's in the process of scaling a resource. Normally, Terraform drains all the instances before deleting the group. This bypasses that behavior and potentially leaves resources dangling"
|
||||
type = bool
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "termination_policies" {
|
||||
description = "A list of policies to decide how the instances in the Auto Scaling Group should be terminated. The allowed values are `OldestInstance`, `NewestInstance`, `OldestLaunchConfiguration`, `ClosestToNextInstanceHour`, `OldestLaunchTemplate`, `AllocationStrategy`, `Default`"
|
||||
type = list(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "suspended_processes" {
|
||||
description = "A list of processes to suspend for the Auto Scaling Group. The allowed values are `Launch`, `Terminate`, `HealthCheck`, `ReplaceUnhealthy`, `AZRebalance`, `AlarmNotification`, `ScheduledActions`, `AddToLoadBalancer`. Note that if you suspend either the `Launch` or `Terminate` process types, it can prevent your Auto Scaling Group from functioning properly"
|
||||
type = list(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "max_instance_lifetime" {
|
||||
description = "The maximum amount of time, in seconds, that an instance can be in service, values must be either equal to 0 or between 604800 and 31536000 seconds"
|
||||
type = number
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "enabled_metrics" {
|
||||
description = "A list of metrics to collect. The allowed values are `GroupDesiredCapacity`, `GroupInServiceCapacity`, `GroupPendingCapacity`, `GroupMinSize`, `GroupMaxSize`, `GroupInServiceInstances`, `GroupPendingInstances`, `GroupStandbyInstances`, `GroupStandbyCapacity`, `GroupTerminatingCapacity`, `GroupTerminatingInstances`, `GroupTotalCapacity`, `GroupTotalInstances`"
|
||||
type = list(string)
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "metrics_granularity" {
|
||||
description = "The granularity to associate with the metrics to collect. The only valid value is `1Minute`"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "service_linked_role_arn" {
|
||||
description = "The ARN of the service-linked role that the ASG will use to call other AWS services"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "initial_lifecycle_hooks" {
|
||||
description = "One or more Lifecycle Hooks to attach to the Auto Scaling Group before instances are launched. The syntax is exactly the same as the separate `aws_autoscaling_lifecycle_hook` resource, without the `autoscaling_group_name` attribute. Please note that this will only work when creating a new Auto Scaling Group. For all other use-cases, please use `aws_autoscaling_lifecycle_hook` resource"
|
||||
type = list(map(string))
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "instance_refresh" {
|
||||
description = "If this block is configured, start an Instance Refresh when this Auto Scaling Group is updated"
|
||||
type = any
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "use_mixed_instances_policy" {
|
||||
description = "Determines whether to use a mixed instances policy in the autoscaling group or not"
|
||||
type = bool
|
||||
default = false
|
||||
}
|
||||
|
||||
variable "mixed_instances_policy" {
|
||||
description = "Configuration block containing settings to define launch targets for Auto Scaling groups"
|
||||
type = any
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "warm_pool" {
|
||||
description = "If this block is configured, add a Warm Pool to the specified Auto Scaling group"
|
||||
type = any
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "delete_timeout" {
|
||||
description = "Delete timeout to wait for destroying autoscaling group"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "propagate_tags" {
|
||||
description = "A list of tag blocks. Each element should have keys named `key`, `value`, and `propagate_at_launch`"
|
||||
type = list(map(string))
|
||||
default = []
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Autoscaling group schedule
|
||||
################################################################################
|
||||
|
||||
variable "create_schedule" {
|
||||
description = "Determines whether to create autoscaling group schedule or not"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "schedules" {
|
||||
description = "Map of autoscaling group schedule to create"
|
||||
type = map(any)
|
||||
default = {}
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Security Group
|
||||
################################################################################
|
||||
|
||||
variable "create_security_group" {
|
||||
description = "Determines whether to create a security group"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "security_group_name" {
|
||||
description = "Name to use on security group created"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "security_group_use_name_prefix" {
|
||||
description = "Determines whether the security group name (`security_group_name`) is used as a prefix"
|
||||
type = string
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "security_group_description" {
|
||||
description = "Description for the security group created"
|
||||
type = string
|
||||
default = "EKS self-managed node group security group"
|
||||
}
|
||||
|
||||
variable "vpc_id" {
|
||||
description = "ID of the VPC where the security group/nodes will be provisioned"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "security_group_rules" {
|
||||
description = "List of security group rules to add to the security group created"
|
||||
type = any
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "cluster_security_group_id" {
|
||||
description = "Cluster control plane security group ID"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "security_group_tags" {
|
||||
description = "A map of additional tags to add to the security group created"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# IAM Role
|
||||
################################################################################
|
||||
|
||||
variable "create_iam_instance_profile" {
|
||||
description = "Determines whether an IAM instance profile is created or to use an existing IAM instance profile"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "iam_instance_profile_arn" {
|
||||
description = "Amazon Resource Name (ARN) of an existing IAM instance profile that provides permissions for the node group. Required if `create_iam_instance_profile` = `false`"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_name" {
|
||||
description = "Name to use on IAM role created"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_use_name_prefix" {
|
||||
description = "Determines whether cluster IAM role name (`iam_role_name`) is used as a prefix"
|
||||
type = string
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "iam_role_path" {
|
||||
description = "IAM role path"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_description" {
|
||||
description = "Description of the role"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_permissions_boundary" {
|
||||
description = "ARN of the policy that is used to set the permissions boundary for the IAM role"
|
||||
type = string
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "iam_role_attach_cni_policy" {
|
||||
description = "Whether to attach the Amazon managed `AmazonEKS_CNI_Policy` IAM policy to the IAM IAM role. WARNING: If set `false` the permissions must be assigned to the `aws-node` DaemonSet pods via another method or nodes will not be able to join the cluster"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "iam_role_additional_policies" {
|
||||
description = "Additional policies to be added to the IAM role"
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "iam_role_tags" {
|
||||
description = "A map of additional tags to add to the IAM role created"
|
||||
type = map(string)
|
||||
default = {}
|
||||
}
|
||||
14
modules/self-managed-node-group/versions.tf
Normal file
14
modules/self-managed-node-group/versions.tf
Normal file
@@ -0,0 +1,14 @@
|
||||
terraform {
|
||||
required_version = ">= 0.13.1"
|
||||
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = ">= 3.64"
|
||||
}
|
||||
cloudinit = {
|
||||
source = "hashicorp/cloudinit"
|
||||
version = ">= 2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user