diff --git a/data.tf b/data.tf index 54331a9..b244405 100644 --- a/data.tf +++ b/data.tf @@ -13,7 +13,7 @@ data "aws_ami" "amazon_linux_2023" { filter { name = "architecture" - values = ["x86_64"] + values = [var.architecture] } filter { diff --git a/main.tf b/main.tf index 792ba37..3d9df3c 100644 --- a/main.tf +++ b/main.tf @@ -1,3 +1,25 @@ +locals { + # Validate that only 'arm64' architecture is used with 'g' processor instances to ensure compatibility. + # https://docs.aws.amazon.com/ec2/latest/instancetypes/instance-type-names.html + is_instance_compatible = ( + # True if does not contain 'g' when architecture is x86_64 + (var.architecture == "x86_64" && !can(regex("g", var.instance_type))) || + # True if contains 'g' when architecture is arm64 + (var.architecture == "arm64" && can(regex("g", var.instance_type))) + ) +} + +resource "null_resource" "validate_instance_type" { + count = local.is_instance_compatible ? 0 : 1 + + lifecycle { + precondition { + condition = local.is_instance_compatible + error_message = "The instance_type must be compatible with the specified architecture. For x86_64, you cannot use instance types with ARM processors (e.g., t3, m5, c5). For arm64, use instance types with 'g' indicating ARM processor (e.g., t4g, c6g, m6g)." + } + } +} + module "role_label" { source = "cloudposse/label/null" version = "0.25.0" diff --git a/variables.tf b/variables.tf index 26b4a32..9f16f98 100644 --- a/variables.tf +++ b/variables.tf @@ -30,6 +30,12 @@ variable "ami" { description = "The AMI to use for the SSM Agent EC2 Instance. If not provided, the latest Amazon Linux 2023 AMI will be used. Note: This will update periodically as AWS releases updates to their AL2023 AMI. Pin to a specific AMI if you would like to avoid these updates." } +variable "architecture" { + description = "The architecture of the AMI (e.g., x86_64, arm64)" + type = string + default = "arm64" +} + variable "user_data" { default = <