Giter VIP home page Giter VIP logo

terraform-aws-alb's Introduction

terraform-aws-alb

Latest ReleaseLast UpdatedSlack Community

Terraform module to create an ALB, default ALB listener(s), and a default ALB target and related security groups.

Tip

๐Ÿ‘ฝ Use Atmos with Terraform

Cloud Posse uses atmos to easily orchestrate multiple environments using Terraform.
Works with Github Actions, Atlantis, or Spacelift.

Watch demo of using Atmos with Terraform
Example of running atmos to manage infrastructure from our Quick Start tutorial.

Usage

For a complete example, see examples/complete.

For automated test of the complete example using bats and Terratest, see test.

provider "aws" {
  region = var.region
}

module "vpc" {
  source  = "cloudposse/vpc/aws"
  # Cloud Posse recommends pinning every module to a specific version
  # version = "x.x.x"

  namespace  = var.namespace
  stage      = var.stage
  name       = var.name
  delimiter  = var.delimiter
  attributes = var.attributes

  ipv4_primary_cidr_block = "10.0.0.0/16"
  assign_generated_ipv6_cidr_block = true

  tags = var.tags
}

module "subnets" {
  source  = "cloudposse/dynamic-subnets/aws"
  # Cloud Posse recommends pinning every module to a specific version
  # version = "x.x.x"

  namespace  = var.namespace
  stage      = var.stage
  name       = var.name
  attributes = var.attributes
  delimiter  = var.delimiter

  availability_zones   = var.availability_zones
  vpc_id               = module.vpc.vpc_id
  igw_id               = module.vpc.igw_id
  cidr_block           = module.vpc.vpc_cidr_block
  nat_gateway_enabled  = false
  nat_instance_enabled = false

  tags = var.tags
}

module "alb" {
  source = "cloudposse/alb/aws"
  # Cloud Posse recommends pinning every module to a specific version
  # version = "x.x.x"

  namespace  = var.namespace
  stage      = var.stage
  name       = var.name
  attributes = var.attributes
  delimiter  = var.delimiter

  vpc_id                                  = module.vpc.vpc_id
  security_group_ids                      = [module.vpc.vpc_default_security_group_id]
  subnet_ids                              = module.subnets.public_subnet_ids
  internal                                = var.internal
  http_enabled                            = var.http_enabled
  http_redirect                           = var.http_redirect
  access_logs_enabled                     = var.access_logs_enabled
  cross_zone_load_balancing_enabled       = var.cross_zone_load_balancing_enabled
  http2_enabled                           = var.http2_enabled
  idle_timeout                            = var.idle_timeout
  ip_address_type                         = var.ip_address_type
  deletion_protection_enabled             = var.deletion_protection_enabled
  deregistration_delay                    = var.deregistration_delay
  health_check_path                       = var.health_check_path
  health_check_timeout                    = var.health_check_timeout
  health_check_healthy_threshold          = var.health_check_healthy_threshold
  health_check_unhealthy_threshold        = var.health_check_unhealthy_threshold
  health_check_interval                   = var.health_check_interval
  health_check_matcher                    = var.health_check_matcher
  target_group_port                       = var.target_group_port
  target_group_target_type                = var.target_group_target_type
  stickiness                              = var.stickiness

  alb_access_logs_s3_bucket_force_destroy         = var.alb_access_logs_s3_bucket_force_destroy
  alb_access_logs_s3_bucket_force_destroy_enabled = var.alb_access_logs_s3_bucket_force_destroy_enabled

  tags = var.tags
}

Important

In Cloud Posse's examples, we avoid pinning modules to specific versions to prevent discrepancies between the documentation and the latest released versions. However, for your own projects, we strongly advise pinning each module to the exact version you're using. This practice ensures the stability of your infrastructure. Additionally, we recommend implementing a systematic approach for updating versions to avoid unexpected changes.

Makefile Targets

Available targets:

  help                                Help screen
  help/all                            Display help for all targets
  help/short                          This help short screen
  lint                                Lint terraform code

Requirements

Name Version
terraform >= 1.3
aws >= 4.0

Providers

Name Version
aws >= 4.0

Modules

Name Source Version
access_logs cloudposse/lb-s3-bucket/aws 0.19.0
default_load_balancer_label cloudposse/label/null 0.25.0
default_target_group_label cloudposse/label/null 0.25.0
this cloudposse/label/null 0.25.0

Resources

Name Type
aws_lb.default resource
aws_lb_listener.http_forward resource
aws_lb_listener.http_redirect resource
aws_lb_listener.https resource
aws_lb_listener_certificate.https_sni resource
aws_lb_target_group.default resource
aws_security_group.default resource
aws_security_group_rule.egress resource
aws_security_group_rule.http_ingress resource
aws_security_group_rule.https_ingress resource

Inputs

Name Description Type Default Required
access_logs_enabled A boolean flag to enable/disable access_logs bool true no
access_logs_prefix The S3 log bucket prefix string "" no
access_logs_s3_bucket_id An external S3 Bucket name to store access logs in. If specified, no logging bucket will be created. string null no
additional_certs A list of additonal certs to add to the https listerner list(string) [] no
additional_tag_map Additional key-value pairs to add to each map in tags_as_list_of_maps. Not added to tags or id.
This is for some rare cases where resources want additional configuration of tags
and therefore take a list of maps with tag key, value, and additional configuration.
map(string) {} no
alb_access_logs_s3_bucket_force_destroy A boolean that indicates all objects should be deleted from the ALB access logs S3 bucket so that the bucket can be destroyed without error bool false no
allow_ssl_requests_only Set to true to require requests to use Secure Socket Layer (HTTPS/SSL) on the access logs S3 bucket. This will explicitly deny access to HTTP requests bool false no
attributes ID element. Additional attributes (e.g. workers or cluster) to add to id,
in the order they appear in the list. New attributes are appended to the
end of the list. The elements of the list are joined by the delimiter
and treated as a single ID element.
list(string) [] no
certificate_arn The ARN of the default SSL certificate for HTTPS listener string "" no
context Single object for setting entire context at once.
See description of individual variables for details.
Leave string and numeric variables as null to use default value.
Individual variable settings (non-null) override settings in context object,
except for attributes, tags, and additional_tag_map, which are merged.
any
{
"additional_tag_map": {},
"attributes": [],
"delimiter": null,
"descriptor_formats": {},
"enabled": true,
"environment": null,
"id_length_limit": null,
"label_key_case": null,
"label_order": [],
"label_value_case": null,
"labels_as_tags": [
"unset"
],
"name": null,
"namespace": null,
"regex_replace_chars": null,
"stage": null,
"tags": {},
"tenant": null
}
no
cross_zone_load_balancing_enabled A boolean flag to enable/disable cross zone load balancing bool true no
default_target_group_enabled Whether the default target group should be created or not. bool true no
deletion_protection_enabled A boolean flag to enable/disable deletion protection for ALB bool false no
delimiter Delimiter to be used between ID elements.
Defaults to - (hyphen). Set to "" to use no delimiter at all.
string null no
deregistration_delay The amount of time to wait in seconds before changing the state of a deregistering target to unused number 15 no
descriptor_formats Describe additional descriptors to be output in the descriptors output map.
Map of maps. Keys are names of descriptors. Values are maps of the form
{<br> format = string<br> labels = list(string)<br>}
(Type is any so the map values can later be enhanced to provide additional options.)
format is a Terraform format string to be passed to the format() function.
labels is a list of labels, in order, to pass to format() function.
Label values will be normalized before being passed to format() so they will be
identical to how they appear in id.
Default is {} (descriptors output will be empty).
any {} no
drop_invalid_header_fields Indicates whether HTTP headers with header fields that are not valid are removed by the load balancer (true) or routed to targets (false). bool false no
enable_glacier_transition (Deprecated, use lifecycle_configuration_rules instead)
Enables the transition to AWS Glacier which can cause unnecessary costs for huge amount of small files
bool true no
enabled Set to false to prevent the module from creating any resources bool null no
environment ID element. Usually used for region e.g. 'uw2', 'us-west-2', OR role 'prod', 'staging', 'dev', 'UAT' string null no
expiration_days (Deprecated, use lifecycle_configuration_rules instead)
Number of days after which to expunge the objects
number 90 no
glacier_transition_days (Deprecated, use lifecycle_configuration_rules instead)
Number of days after which to move the data to the Glacier Flexible Retrieval storage tier
number 60 no
health_check_healthy_threshold The number of consecutive health checks successes required before considering an unhealthy target healthy number 2 no
health_check_interval The duration in seconds in between health checks number 15 no
health_check_matcher The HTTP response codes to indicate a healthy check string "200-399" no
health_check_path The destination for the health check request string "/" no
health_check_port The port to use for the healthcheck string "traffic-port" no
health_check_protocol The protocol to use for the healthcheck. If not specified, same as the traffic protocol string null no
health_check_timeout The amount of time to wait in seconds before failing a health check request number 10 no
health_check_unhealthy_threshold The number of consecutive health check failures required before considering the target unhealthy number 2 no
http2_enabled A boolean flag to enable/disable HTTP/2 bool true no
http_enabled A boolean flag to enable/disable HTTP listener bool true no
http_ingress_cidr_blocks List of CIDR blocks to allow in HTTP security group list(string)
[
"0.0.0.0/0"
]
no
http_ingress_prefix_list_ids List of prefix list IDs for allowing access to HTTP ingress security group list(string) [] no
http_port The port for the HTTP listener number 80 no
http_redirect A boolean flag to enable/disable HTTP redirect to HTTPS bool false no
https_enabled A boolean flag to enable/disable HTTPS listener bool false no
https_ingress_cidr_blocks List of CIDR blocks to allow in HTTPS security group list(string)
[
"0.0.0.0/0"
]
no
https_ingress_prefix_list_ids List of prefix list IDs for allowing access to HTTPS ingress security group list(string) [] no
https_port The port for the HTTPS listener number 443 no
https_ssl_policy The name of the SSL Policy for the listener string "ELBSecurityPolicy-2015-05" no
id_length_limit Limit id to this many characters (minimum 6).
Set to 0 for unlimited length.
Set to null for keep the existing setting, which defaults to 0.
Does not affect id_full.
number null no
idle_timeout The time in seconds that the connection is allowed to be idle number 60 no
internal A boolean flag to determine whether the ALB should be internal bool false no
ip_address_type The type of IP addresses used by the subnets for your load balancer. The possible values are ipv4 and dualstack. string "ipv4" no
label_key_case Controls the letter case of the tags keys (label names) for tags generated by this module.
Does not affect keys of tags passed in via the tags input.
Possible values: lower, title, upper.
Default value: title.
string null no
label_order The order in which the labels (ID elements) appear in the id.
Defaults to ["namespace", "environment", "stage", "name", "attributes"].
You can omit any of the 6 labels ("tenant" is the 6th), but at least one must be present.
list(string) null no
label_value_case Controls the letter case of ID elements (labels) as included in id,
set as tag values, and output by this module individually.
Does not affect values of tags passed in via the tags input.
Possible values: lower, title, upper and none (no transformation).
Set this to title and set delimiter to "" to yield Pascal Case IDs.
Default value: lower.
string null no
labels_as_tags Set of labels (ID elements) to include as tags in the tags output.
Default is to include all labels.
Tags with empty values will not be included in the tags output.
Set to [] to suppress all generated tags.
Notes:
The value of the name tag, if included, will be the id, not the name.
Unlike other null-label inputs, the initial setting of labels_as_tags cannot be
changed in later chained modules. Attempts to change it will be silently ignored.
set(string)
[
"default"
]
no
lifecycle_configuration_rules A list of S3 bucket v2 lifecycle rules, as specified in terraform-aws-s3-bucket"
These rules are not affected by the deprecated lifecycle_rule_enabled flag.
NOTE: Unless you also set lifecycle_rule_enabled = false you will also get the default deprecated rules set on your bucket.
list(object({
enabled = bool
id = string

abort_incomplete_multipart_upload_days = number

# filter_and is the and configuration block inside the filter configuration.
# This is the only place you should specify a prefix.
filter_and = any
expiration = any
transition = list(any)

noncurrent_version_expiration = any
noncurrent_version_transition = list(any)
}))
[] no
lifecycle_rule_enabled DEPRECATED: Defaults to false, use lifecycle_configuration_rules instead.
When true, configures lifecycle events on this bucket using individual (now deprecated) variables."
bool false no
listener_additional_tags The additional tags to apply to all listeners map(string) {} no
listener_http_fixed_response Have the HTTP listener return a fixed response for the default action.
object({
content_type = string
message_body = string
status_code = string
})
null no
listener_https_fixed_response Have the HTTPS listener return a fixed response for the default action.
object({
content_type = string
message_body = string
status_code = string
})
null no
load_balancer_name The name for the default load balancer, uses a module label name if left empty string "" no
load_balancer_name_max_length The max length of characters for the load balancer. number 32 no
load_balancing_algorithm_type Determines how the load balancer selects targets when routing requests. Only applicable for Application Load Balancer Target Groups string "round_robin" no
name ID element. Usually the component or solution name, e.g. 'app' or 'jenkins'.
This is the only ID element not also included as a tag.
The "name" tag is set to the full id string. There is no tag with the value of the name input.
string null no
namespace ID element. Usually an abbreviation of your organization name, e.g. 'eg' or 'cp', to help ensure generated IDs are globally unique string null no
noncurrent_version_expiration_days (Deprecated, use lifecycle_configuration_rules instead)
Specifies when non-current object versions expire (in days)
number 90 no
noncurrent_version_transition_days (Deprecated, use lifecycle_configuration_rules instead)
Specifies (in days) when noncurrent object versions transition to Glacier Flexible Retrieval
number 30 no
preserve_host_header Indicates whether the Application Load Balancer should preserve the Host header in the HTTP request and send it to the target without any change. bool false no
regex_replace_chars Terraform regular expression (regex) string.
Characters matching the regex will be removed from the ID elements.
If not set, "/[^a-zA-Z0-9-]/" is used to remove all characters other than hyphens, letters and digits.
string null no
security_group_enabled Enables the security group bool true no
security_group_ids A list of additional security group IDs to allow access to ALB list(string) [] no
slow_start The amount of time (30-900 seconds) until a healthy target receives its full share of requests from the load balancer. 0 to disable. number null no
stage ID element. Usually used to indicate role, e.g. 'prod', 'staging', 'source', 'build', 'test', 'deploy', 'release' string null no
standard_transition_days (Deprecated, use lifecycle_configuration_rules instead)
Number of days to persist in the standard storage tier before moving to the infrequent access tier
number 30 no
stickiness Target group sticky configuration
object({
cookie_duration = number
enabled = bool
})
null no
subnet_ids A list of subnet IDs to associate with ALB list(string) n/a yes
tags Additional tags (e.g. {'BusinessUnit': 'XYZ'}).
Neither the tag keys nor the tag values will be modified by this module.
map(string) {} no
target_group_additional_tags The additional tags to apply to the target group map(string) {} no
target_group_name The name for the default target group, uses a module label name if left empty string "" no
target_group_name_max_length The max length of characters for the target group. number 32 no
target_group_port The port for the default target group number 80 no
target_group_protocol The protocol for the default target group HTTP or HTTPS string "HTTP" no
target_group_protocol_version The protocol version for the default target group HTTP1 or HTTP2 or GRPC string "HTTP1" no
target_group_target_type The type (instance, ip or lambda) of targets that can be registered with the target group string "ip" no
tenant ID element _(Rarely used, not included by default)_. A customer identifier, indicating who this instance of a resource is for string null no
vpc_id VPC ID to associate with ALB string n/a yes
xff_header_processing_mode Determines how the load balancer modifies the X-Forwarded-For header in the HTTP request before sending the request to the target. The possible values are append, preserve, and remove. Only valid for Load Balancers of type application. The default is append string "append" no

Outputs

Name Description
access_logs_bucket_id The S3 bucket ID for access logs
alb_arn The ARN of the ALB
alb_arn_suffix The ARN suffix of the ALB
alb_dns_name DNS name of ALB
alb_name The ARN suffix of the ALB
alb_zone_id The ID of the zone which ALB is provisioned
default_target_group_arn The default target group ARN
default_target_group_arn_suffix The default target group ARN suffix
http_listener_arn The ARN of the HTTP forwarding listener
http_redirect_listener_arn The ARN of the HTTP to HTTPS redirect listener
https_listener_arn The ARN of the HTTPS listener
listener_arns A list of all the listener ARNs
security_group_id The security group ID of the ALB

Related Projects

Check out these related projects.

Tip

Use Terraform Reference Architectures for AWS

Use Cloud Posse's ready-to-go terraform architecture blueprints for AWS to get up and running quickly.

โœ… We build it with you.
โœ… You own everything.
โœ… Your team wins.

Request Quote

๐Ÿ“š Learn More

Cloud Posse is the leading DevOps Accelerator for funded startups and enterprises.

Your team can operate like a pro today.

Ensure that your team succeeds by using Cloud Posse's proven process and turnkey blueprints. Plus, we stick around until you succeed.

Day-0: Your Foundation for Success

  • Reference Architecture. You'll get everything you need from the ground up built using 100% infrastructure as code.
  • Deployment Strategy. Adopt a proven deployment strategy with GitHub Actions, enabling automated, repeatable, and reliable software releases.
  • Site Reliability Engineering. Gain total visibility into your applications and services with Datadog, ensuring high availability and performance.
  • Security Baseline. Establish a secure environment from the start, with built-in governance, accountability, and comprehensive audit logs, safeguarding your operations.
  • GitOps. Empower your team to manage infrastructure changes confidently and efficiently through Pull Requests, leveraging the full power of GitHub Actions.

Request Quote

Day-2: Your Operational Mastery

  • Training. Equip your team with the knowledge and skills to confidently manage the infrastructure, ensuring long-term success and self-sufficiency.
  • Support. Benefit from a seamless communication over Slack with our experts, ensuring you have the support you need, whenever you need it.
  • Troubleshooting. Access expert assistance to quickly resolve any operational challenges, minimizing downtime and maintaining business continuity.
  • Code Reviews. Enhance your teamโ€™s code quality with our expert feedback, fostering continuous improvement and collaboration.
  • Bug Fixes. Rely on our team to troubleshoot and resolve any issues, ensuring your systems run smoothly.
  • Migration Assistance. Accelerate your migration process with our dedicated support, minimizing disruption and speeding up time-to-value.
  • Customer Workshops. Engage with our team in weekly workshops, gaining insights and strategies to continuously improve and innovate.

Request Quote

โœจ Contributing

This project is under active development, and we encourage contributions from our community.

Many thanks to our outstanding contributors:

For ๐Ÿ› bug reports & feature requests, please use the issue tracker.

In general, PRs are welcome. We follow the typical "fork-and-pull" Git workflow.

  1. Review our Code of Conduct and Contributor Guidelines.
  2. Fork the repo on GitHub
  3. Clone the project to your own machine
  4. Commit changes to your own branch
  5. Push your work back up to your fork
  6. Submit a Pull Request so that we can review your changes

NOTE: Be sure to merge the latest changes from "upstream" before making a pull request!

๐ŸŒŽ Slack Community

Join our Open Source Community on Slack. It's FREE for everyone! Our "SweetOps" community is where you get to talk with others who share a similar vision for how to rollout and manage infrastructure. This is the best place to talk shop, ask questions, solicit feedback, and work together as a community to build totally sweet infrastructure.

๐Ÿ“ฐ Newsletter

Sign up for our newsletter and join 3,000+ DevOps engineers, CTOs, and founders who get insider access to the latest DevOps trends, so you can always stay in the know. Dropped straight into your Inbox every week โ€” and usually a 5-minute read.

๐Ÿ“† Office Hours

Join us every Wednesday via Zoom for your weekly dose of insider DevOps trends, AWS news and Terraform insights, all sourced from our SweetOps community, plus a live Q&A that you canโ€™t find anywhere else. It's FREE for everyone!

License

License

Preamble to the Apache License, Version 2.0

Complete license is available in the LICENSE file.

Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.

Trademarks

All other trademarks referenced herein are the property of their respective owners.


Copyright ยฉ 2017-2024 Cloud Posse, LLC

README footer

Beacon

terraform-aws-alb's People

Contributors

adamantike avatar aknysh avatar cloudpossebot avatar deadlysyn avatar dependabot[bot] avatar dylanbannon avatar gowiem avatar jamengual avatar johncblandii avatar joshuabalduff avatar jwstric2 avatar kevcube avatar linhkikuchi avatar martincanovas avatar max-lobur avatar maximmi avatar msmagoo87 avatar nitrocode avatar nuru avatar oblatespheroid avatar osterman avatar renovate[bot] avatar rryke avatar sarkis avatar scream314 avatar stangles avatar tbpoetke avatar tirumerla avatar vadim-hleif avatar welderpb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

terraform-aws-alb's Issues

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Ignored or Blocked

These are blocked by an existing closed PR and will not be recreated unless you click a checkbox below.

Detected dependencies

terraform
examples/complete/main.tf
  • cloudposse/dynamic-subnets/aws 2.4.1
  • cloudposse/vpc/aws 2.2.0
examples/complete/versions.tf
  • aws >= 4.0
  • hashicorp/terraform >= 1.3
main.tf
  • cloudposse/lb-s3-bucket/aws 0.19.0
  • cloudposse/label/null 0.25.0
  • cloudposse/label/null 0.25.0
versions.tf
  • aws >= 4.0
  • hashicorp/terraform >= 1.3

  • Check this box to trigger a request for Renovate to run again on this repository

"Error: Invalid count argument" when enabled = false

Found a bug? Maybe our Slack Community can help.

Slack Community

Describe the Bug

When enabled = false is set on this module, it produces the following error:

Error: Invalid count argument

  on .terraform/modules/alb.access_logs.s3_bucket/main.tf line 163, in resource "aws_s3_bucket_policy" "default":
 163:   count      = module.this.enabled && (var.allow_ssl_requests_only || var.allow_encrypted_uploads_only || var.policy != "") ? 1 : 0

Expected Behavior

It should produce a valid plan

Steps to Reproduce

Steps to reproduce the behavior:

  1. Run init and apply on the .tf file below
  2. The first time this runs, it says there are no changes, but each subsequent apply, will yield the error above
  3. Run apply again
  4. See error

Screenshots

If applicable, add screenshots or logs to help explain your problem.

Environment (please complete the following information):

  • This fails on terraform 0.13.7
  • It seems to work on 0.14.x and above

Anything that will help us triage the bug will help. Here are some ideas:

  • OS: OSX
  • Version 11.5.2

Additional Context

Here's a simple .tf file to reproduce the issue

variable "vpc_id" {
  type        = string
  description = "The VPC ID"
}

variable "subnet_ids" {
  type        = list(string)
  description = "The Subnet IDs"
  default     = []
}

module "label" {
  source    = "cloudposse/label/null"
  version   = "0.25.0"
  namespace = "my"
  name      = "alb"
  stage     = "test"
}

module "alb" {
  source  = "cloudposse/alb/aws"
  version = "0.35.3"

  enabled = false
  context = module.label.context

  vpc_id                      = var.vpc_id
  subnet_ids                  = var.subnet_ids
  https_enabled               = false
  access_logs_enabled         = false
  http2_enabled               = false
  deletion_protection_enabled = false
}

Boolean to ignore tags

Describe the Feature

Boolean to enable a lifecycle to ignore tags changes outside terraform

Expected Behavior

Boolean to enable a lifecycle to ignore tags changes outside terraform

Use Case

When working with shared load balacners in elastic beanstalk, eb change tags in ALB outside terraform. If you re-apply the code the changes made by elastic beanstalk is deleted. This feature would be only useful when working with shared load balancers in beanstalk

Describe Ideal Solution

A simple boolean to enable the feature to ignore tag changes outside terraform

Alternatives Considered

No response

Additional Context

No response

Add Example Usage

what

  • Add example invocation

why

  • We need this so we can soon enable automated continuous integration testing of module

Please make is possible to not create this resource by setting a flag

Have a question? Please checkout our Slack Community or visit our Slack Archive.

Slack Community

Describe the Feature

It should be possible to say "do not create this resource if a flag is passed to the module much like the aws elb resource which allows this by way of its create_elb variable, which sets count to 0 or 1 depending. This would allow you to decide to deploy or not deploy the resource based on the config flag.

Expected Behavior

Set enabled or create flag to false and no resource should be created, the default should be true.

Use Case

We have environments where people want some resources and not others deployed for various reasons, this means in some cases we don't want albs deployed because there are no machines deployed for that (usually a sandbox environment where only a few resources from the script are required), at the moment this module only allows for the creation, there is no way to turn that off.

Describe Ideal Solution

The flag should be implemented to disable the creation of the resource.

Alternatives Considered

There are no alternatives I can't set a count parameter on a module right now.

Additional Context

I feel It's a small but worthwhile thing to implement and ultimately makes the module more flexible allowing a default of true will not impact users who currently use the module.

Dependabot can't parse your main.tf

Dependabot couldn't parse the main.tf found at /main.tf.

The error Dependabot encountered was:

unable to parse HCL: At 3:16: Unknown token: 3:16 IDENT var.attributes

Add default_target_group_arn_suffix Output

Describe the Feature

Add default_target_group_arn_suffix as an output.

Expected Behavior

Simplified Terraform code.

Use Case

We use cloudposse/alb-target-group-cloudwatch-sns-alarms/aws along with this module and have to use a data source to build the target_group_arn_suffix input to that module. By having this module output the data, there should be no need for the data source.

data "aws_lb_target_group" "mytg" {
  arn = module.alb.default_target_group_arn
}

module "alb_alarms" {
  source  = "cloudposse/alb-target-group-cloudwatch-sns-alarms/aws"
  version = "0.15.0"

  alb_arn_suffix          = module.alb.alb_arn_suffix
  target_group_arn_suffix = data.aws_lb_target_group.mytg.arn_suffix # This can be simplified.
}

Describe Ideal Solution

output "default_target_group_arn_suffix" {
  description = "The default target group ARN suffix"
  value       = join("", aws_lb_target_group.default.*.arn_suffix)
}

Use central logging bucket rather then create a new one.

Have a question? Please checkout our Slack Community or visit our Slack Archive.

Slack Community

Describe the Feature

We would like to have our ALB's log to a single bucket rather then individual ones. Similar to the S3 pattern.

Expected Behavior

Pass a logging bucket in on creation.

Use Case

Centralizing logging for a given env.

Describe Ideal Solution

Extention of the module to support the current default but also accept an existing bucket like the s3 module does.

Alternatives Considered

Writing our own as a fork from yours with this feature.

Additional Context

Add any other context or screenshots about the feature request here.

A target group ARN must be specified when disabling the default target group

Describe the Bug

I am creating an Application Load Balancer and I am setting default_target_group_enabled = false. However, when trying to apply my changes, Terraform outputs:

Error: creating ELBv2 Listener (arn:aws:elasticloadbalancing:us-east-1:xxx:loadbalancer/app/my-alb/f3a3728915895e61): ValidationError: A target group ARN must be specified

Checking the code it seems that a Target Group is required by the https listener.

Expected Behavior

I expected to create an Application Load Balancer without a Target Group. I didn't want to create a TG to make the https listener to work.

Additional Context

I am creating an ALB for redirect purposes.

module "alb" {
  source  = "cloudposse/alb/aws"
  version = "1.7.0"

  namespace   = "my-namespace"
  environment = "my-environment"

  load_balancer_name           = "my-alb-name"
  vpc_id                       = var.vpc_id
  subnet_ids                   = var.subnet_ids
  internal                     = false
  http_enabled                 = true
  https_enabled                = true
  http_redirect                = true
  https_ssl_policy             = "ELBSecurityPolicy-TLS-1-2-2017-01"
  access_logs_enabled          = false
  default_target_group_enabled = false
}

variable "rules" {
  description = "The redirect rules"
  type = map(object({
    host = string
  }))
}

resource "aws_lb_listener_rule" "this" {
  for_each = var.rules

  listener_arn = module.alb.https_listener_arn

  condition {
    host_header {
      values = [each.key]
    }
  }

  action {
    type = "redirect"
    redirect {
      host        = each.value.host
      path        = "/#{path}"
      query       = "#{query}"
      port        = 443
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

Terraform version:

$ tf --version
Terraform v1.3.1
on linux_amd64

How to create a TDD approach to the resources

We need to make sure the terraform scripts we use are working.
ttps://github.com/cloudposse/terraform-aws-alb/blob/master/main.tf

how can we know this one working before pulling it to our repo ?

Error: Invalid count argument when using access_logs_s3_bucket_id = mybucket.id

Found a bug? Maybe our Slack Community can help.

Slack Community

Describe the Bug

When specifying custom bucket for ALB logging:

access_logs_s3_bucket_id = aws_s3_bucket.alb_s3_logging.id

The terraform apply fails with the following error:

Error: Invalid count argument
โ”‚ 
โ”‚   on .terraform/modules/alb.access_logs/main.tf line 2, in data "aws_elb_service_account" "default":
โ”‚    2:   count = module.this.enabled ? 1 : 0
โ”‚ 
โ”‚ The "count" value depends on resource attributes that cannot be determined
โ”‚ until apply, so Terraform cannot predict how many instances will be
โ”‚ created. To work around this, use the -target argument to first apply only
โ”‚ the resources that the count depends on.

Expected Behavior

I expect terraform plan to complete successfully.

Steps to Reproduce

Steps to reproduce the behavior:

I've been using this module for while. All working fine. I then enabled logging using a custom bucket and get the above error.

  • it works fine if I don't specify a custom bucket (access_logs_s3_bucket_id = aws_s3_bucket.alb_s3_logging.id). However, I need to be able to give the bucket a specific name as opposed to having the name derived from the labels. Is there a way to specify the bucket name when not using access_logs_s3_bucket_id = aws_s3_bucket.alb_s3_logging.id?
ALB configuration
###
module "alb" {
  source        = "https://github.com/cloudposse/terraform-aws-alb.git?ref=1.0.0"
  context       = module.alb-web-label
  vpc_id        = data.aws_vpc.selected.id
  subnet_ids    = [for s in data.aws_subnet.public : s.id]
  internal      = var.alb_internal
  http_enabled  = var.alb_http_enabled
  http_redirect = var.alb_http_redirect
  
  #access_logs_prefix = "alb-web"
  access_logs_enabled = true
  access_logs_s3_bucket_id = aws_s3_bucket.alb_s3_logging.id

  cross_zone_load_balancing_enabled       = var.alb_cross_loadbalancing_enabled
  http2_enabled                           = var.alb_http2_enabled
  health_check_path                       = var.alb_health_check_path
  health_check_matcher                    = var.alb_health_check_matcher
  target_group_port                       = var.alb_target_port
  target_group_target_type                = "ip"
  certificate_arn                         = module.acm_cert.certificate_arn
  security_group_ids = [
    "${data.aws_security_group.common.id}",
    "${data.aws_security_group.specific.id}"
  ]
  security_group_enabled    = var.alb_sg_enabled
  https_enabled             = var.alb_https_enabled
  https_ingress_cidr_blocks = var.https_ingress_cidr_blocks
  target_group_name         = "${module.alb-web-label.id}-tg"
}

S3 bucket configuration
###
resource "aws_s3_bucket" "alb_s3_logging" {
  bucket = "${var.environment}-${data.aws_region.current.name}-alb-s3-logging"
}

resource "aws_s3_bucket_acl" "alb_s3_logging_acl" {
  bucket = aws_s3_bucket.alb_s3_logging.id
  acl    = "private"
}

resource "aws_s3_bucket_policy" "alb_s3_logging_policy" {
  bucket = aws_s3_bucket.alb_s3_logging.id
  policy = templatefile("templates/alb-logging-s3-bucket-policy.tpl", {
    aws_elb_service_account = data.aws_elb_service_account.current.arn,
    s3_bucket = "${var.environment}-${data.aws_region.current.name}-alb-s3-logging"
  })
}

Screenshots

Not applicable here. See error above.

Environment (please complete the following information):

Terraform v1.1.6
on linux_amd64
Initializing plugins and modules...

Additional Context

Add any other context about the problem here.

WSS support

Hey ๐Ÿ‘‹

This ALB module is awesome, but for our GraphQL server (with subscriptions ๐Ÿ˜Ž ), it'd be essential to have WS target group & security group rule.

Describe the Feature

Add TLS target group & Security Group Rule for TCP access. A simple solution would use the same port for both HTTP and WS

Expected Behavior

Connections from both HTTP, HTTPS, and TCP allowed in through the ALB.

Use Case

Any service that requires both REST & Websocket support on the same endpoint

Describe Ideal Solution

variable "wss_enabled" {
  type        = bool
  description = "Enables WSS target group for ALB"
  default     = false
}

Using variable wss_enabled to add said target group and security group rule

resource "aws_lb_target_group" "wss" {
  count = var.wss_enabled ? 1 : 0

  name                 = var.target_group_name == "" ? module.default_target_group_label.id : var.target_group_name
  port                 = var.target_group_port
  protocol             = "TLS"
  vpc_id               = var.vpc_id
  target_type          = var.target_group_target_type
  deregistration_delay = var.deregistration_delay

  health_check {
    path                = var.health_check_path
  }

  dynamic "stickiness" {
    for_each = var.stickiness == null ? [] : [var.stickiness]
    content {
      type            = "lb_cookie"
      cookie_duration = stickiness.value.cookie_duration
      enabled         = var.target_group_protocol == "TCP" ? false : stickiness.value.enabled
    }
  }

  lifecycle {
    create_before_destroy = true
  }

  tags = merge(
    module.default_target_group_label.tags,
    var.target_group_additional_tags
  )
}

This is my first feature request on terraform modules, please advise if my request is not pertinent. ๐Ÿ™‡

Thanks ๐Ÿ‘‹

Module can't be destroyed with enabled = false

There is one resource that's stays up and prevents it.

count = var.http_enabled && var.http_redirect != true ? 1 : 0

โ”‚ Error: error creating ELBv2 Listener (): ValidationError: A load balancer ARN must be specified
โ”‚       status code: 400, request id: f12c688c-df3a-4018-a5ae-1d2b6ac52036
โ”‚ 

Fixing it would require adding module.context.enabled to count

Naming conflict when modifying target groups

The Bug

When modifying target group parameters and the target group has to be replaced, terraform apply fails.

Error: error creating LB Target Group: DuplicateTargetGroupName: A target group with the same name 'test-web-application-default' exists, but with different settings
        status code: 400, request id: [redacted]

Expected Behavior

The target group should be replaced without errors

Steps to Reproduce

  1. Provision module
  2. Update any target group parameters that will force the target group to be replaced ( target_group_port, target_group_protocol, target_group_target_type )
  3. terraform apply

Relevant Output

terraform apply
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place
-/+ destroy and then create replacement
+/- create replacement and then destroy

Terraform will perform the following actions:

  # module.test_web_application.aws_security_group_rule.ingress must be replaced
-/+ resource "aws_security_group_rule" "ingress" {
      - cidr_blocks              = [] -> null
      ~ from_port                = 80 -> 8080 # forces replacement
      ~ id                       = "sgrule-19963884" -> (known after apply)
      - ipv6_cidr_blocks         = [] -> null
      - prefix_list_ids          = [] -> null
      ~ to_port                  = 80 -> 8080 # forces replacement
        # (5 unchanged attributes hidden)
    }

  # module.test_web_application.module.web_application.aws_lb_listener.https[0] will be updated in-place
  ~ resource "aws_lb_listener" "https" {
        id                = "arn:aws:elasticloadbalancing:[redacted-region:redacted-account-id]:listener/app/test-web-application/9414d30cd6743a52/264e2cdfabc4d33a"
        tags              = {}
        # (7 unchanged attributes hidden)

      ~ default_action {
          ~ target_group_arn = "arn:aws:elasticloadbalancing:[redacted-region:redacted-account-id]:targetgroup/test-web-application-default/ba3a15c19f97afcc" -> (known after apply)
            # (2 unchanged attributes hidden)
        }
    }

  # module.test_web_application.module.web_application.aws_lb_target_group.default[0] must be replaced
+/- resource "aws_lb_target_group" "default" {
      ~ arn                                = "arn:aws:elasticloadbalancing:[redacted-region:redacted-account-id]:targetgroup/test-web-application-default/ba3a15c19f97afcc" -> (known after apply)
      ~ arn_suffix                         = "targetgroup/test-web-application-default/ba3a15c19f97afcc" -> (known after apply)
      ~ id                                 = "arn:aws:elasticloadbalancing:[redacted-region:redacted-account-id]:targetgroup/test-web-application-default/ba3a15c19f97afcc" -> (known after apply)
      ~ load_balancing_algorithm_type      = "round_robin" -> (known after apply)
        name                               = "test-web-application-default"
      ~ port                               = 80 -> 8080 # forces replacement
      + preserve_client_ip                 = (known after apply)
      ~ protocol_version                   = "HTTP1" -> (known after apply)
        tags                               = {
            "Attributes"  = "default"
            "Environment" = "test"
            "Name"        = "test-web-application-default"
        }
        # (8 unchanged attributes hidden)


      ~ stickiness {
            # (3 unchanged attributes hidden)
        }
        # (1 unchanged block hidden)
    }

Plan: 2 to add, 1 to change, 2 to destroy.

module.test_web_application.aws_security_group_rule.ingress: Destroying... [id=sgrule-19963884]
module.test_web_application.module.web_application.aws_lb_target_group.default[0]: Creating...
module.test_web_application.aws_security_group_rule.ingress: Destruction complete after 1s
module.test_web_application.aws_security_group_rule.ingress: Creating...
module.test_web_application.aws_security_group_rule.ingress: Creation complete after 1s [id=sgrule-1287932633]

Error: error creating LB Target Group: DuplicateTargetGroupName: A target group with the same name 'test-web-application-default' exists, but with different settings
        status code: 400, request id: [redacted]

Environment

  • OS: macOS 12.0.1
  • Terraform Version : v0.14.5
  • Module Version : 0.35.3

Additional Context

I suspect this happens because the resource has a create_before_destroy lifecycle and uses a name argument when it should be using a name_prefix.

Tons of s3 "argument is deprecated" warnings

Describe the Bug

Create an ALB and plan it, and you will get 15 warnings about deprecated S3 arguments. Example:

Warning: Argument is deprecated
with module.project_module.module.alb.module.access_logs.module.s3_bucket.aws_s3_bucket.default
on .terraform/modules/project_module.alb.access_logs.s3_bucket/main.tf line 1, in resource "aws_s3_bucket" "default":

resource "aws_s3_bucket" "default" {

Use the aws_s3_bucket_lifecycle_configuration resource instead

Expected Behavior

No warnings.

Steps to Reproduce

provider "aws" {
  region = var.region
}

# Fetch the pre-existing domain certificate
data "aws_acm_certificate" "domain_cert" {
  domain      = var.domain
  statuses    = ["ISSUED"]
  most_recent = true
}

module "alb" {
  source  = "cloudposse/alb/aws"
  version = "1.1.0"

  attributes = ["alb"]
  tags       = { "declaration" : "alb" }

  vpc_id             = module.vpc.vpc_id
  security_group_ids = [module.vpc.vpc_default_security_group_id]
  subnet_ids         = module.subnets.public_subnet_ids
  internal           = false

  target_group_port = 5000
  http2_enabled   = true
  https_enabled   = true
  certificate_arn = data.aws_acm_certificate.domain_cert.arn
  http_redirect   = true

  access_logs_enabled                     = true
  alb_access_logs_s3_bucket_force_destroy = true
  cross_zone_load_balancing_enabled       = true
  deletion_protection_enabled             = false

  health_check_interval = 30

  context = module.this.context
}

Screenshots

Screenshot 2022-05-12 at 12 40 42

Environment (please complete the following information):

I'm using Terraform Cloud with Terraform 1.1.9

Additional Context

This is presumably related to the changes to the AWS 4 provider. terraform-aws-s3-bucket has been updated (latest version 2.0.1) but the module this module relies upon (aws-lb-s3-bucket) hasn't been updated.

S3 log bucket lifecycle

First, awesome module! Given how much it does, I was wondering if it'd be useful to add support for applying basic lifecycle management to the s3 bucket created for ALB logs.

On the one hand, this feels natural to manage in one place since the module is already creating the bucket. On the other hand, given the options for storage tiers/retention/etc it might be a clumsy interface.

Just tossing it out for consideration... If this isn't something you want to include, do you handle this in a common way? Perhaps a one-off resource operating on the module's bucket arn containing only the lifecycle policy?

aws_lb_listener.http_redirect Invalid Attribute Combination

Describe the Bug

In AWS provider 5.35.0 released 2/1/24 if you have a target group arn on a listener with type 'redirect' it will give this warning:

โ”‚ Warning: Invalid Attribute Combination
โ”‚
โ”‚   with module.alb.aws_lb_listener.http_redirect[0],
โ”‚   on .terraform/modules/alb/main.tf line 183, in resource "aws_lb_listener" "http_redirect":
โ”‚  183:     target_group_arn = one(aws_lb_target_group.default[*].arn)
โ”‚
โ”‚ Attribute "default_action[0].target_group_arn" cannot be specified when "default_action[0].type" is "redirect".
โ”‚
โ”‚ This will be an error in a future release.

Expected Behavior

No warnings (or future errors) when deploying a redirect listener.

Steps to Reproduce

Upgrade to AWS provider 5.35.0 and attempt to deploy an ALB with a redirect listener.

Screenshots

No response

Environment

No response

Additional Context

No response

"Error: Invalid count argument" when access_logs_s3_bucket_id is set

Describe the Bug

Similar to #103. When access_logs_s3_bucket_id = "bucketname" is set on this module, it produces the following error:

Error: Invalid count argument

  on .terraform/modules/alb.access_logs.s3_bucket/main.tf line 163, in resource "aws_s3_bucket_policy" "default":
 163:   count      = module.this.enabled && (var.allow_ssl_requests_only || var.allow_encrypted_uploads_only || var.policy != "") ? 1 : 0

The "count" value depends on resource attributes that cannot be determined
until apply, so Terraform cannot predict how many instances will be created.
To work around this, use the -target argument to first apply only the
resources that the count depends on.

Expected Behavior

It should produce a valid plan.

Steps to Reproduce

Steps to reproduce the behavior:

  1. Run init and apply on the .tf file below
  2. The first time this runs, it says there are no changes, but each subsequent apply, will yield the error above
  3. Run apply again
  4. See error

Environment (please complete the following information):

$ terraform version
Terraform v0.13.7
+ provider registry.terraform.io/hashicorp/aws v3.74.2

Additional Context

Here's a simple .tf file to reproduce the issue

variable "vpc_id" {
  type        = string
  description = "The VPC ID"
}

variable "subnet_ids" {
  type        = list(string)
  description = "The Subnet IDs"
  default     = []
}

variable "bucket_id" {
  type        = string
  description = "The S3 Bucket ID"
}

variable "security_group_ids" {
  type        = list(string)
  description = "The Security Group IDs"
}

module "label" {
  source    = "cloudposse/label/null"
  version   = "0.25.0"
  namespace = "my"
  name      = "alb"
  stage     = "test"
}

module "alb" {
  source  = "cloudposse/alb/aws"
  version = "1.0.0"

  context    = module.label.context
  subnet_ids = var.subnet_ids
  vpc_id     = var.vpc_id

  access_logs_s3_bucket_id                = var.bucket_id
  access_logs_prefix                      = "${module.label.namespace}"
  alb_access_logs_s3_bucket_force_destroy = true
  deletion_protection_enabled             = true
  target_group_port                       = 8080
  internal                                = true
  health_check_path                       = "/health"
  target_group_name                       = module.label.id # Needed as our default name is too long.
  drop_invalid_header_fields              = true
  security_group_enabled                  = false
  security_group_ids                      = var.security_group_ids
}

support terraform 0.12

on init with the new terraform version i receive the following error:

Error: Unsupported Terraform Core version

This configuration does not support Terraform version 0.12.1. To proceed,
either choose another supported Terraform version or update the root module's
version constraint. Version constraints are normally set for good reason, so
updating the constraint may lead to other errors or unexpected behavior.

is there any plan to support version 0.12 and above?

Limit hit when passing CloudFront CIDRs to ALB security group

Describe the Feature

Apply fails since there are over 100 CIDRs to set on a single security group as it is now.

Expected Behavior

Rules should be split in groups of 50 let's say and multiple security groups created and assigned then to the ALB.

Use Case

Restrict ALB ingress to CloudFront IPs.

Describe Ideal Solution

Create multiple security groups based on limit of 60 rules per security group.

Alternatives Considered

Create separate security groups based on chunklist(data.aws_ip_ranges.cloudfront.cidr_blocks, 50) and pass them as list to security_group_ids.

Additional Context

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.