Coder Social home page Coder Social logo

cloudposse / terraform-aws-vpc Goto Github PK

View Code? Open in Web Editor NEW
218.0 27.0 189.0 1.3 MB

Terraform Module that defines a VPC with public/private subnets across multiple AZs with Internet Gateways

Home Page: https://cloudposse.com/accelerate

License: Apache License 2.0

HCL 78.86% Makefile 4.32% Go 16.83%
terraform terraform-modules vpc aws hcl2

terraform-aws-vpc's Introduction

Project Banner

Last UpdatedLatest ReleaseLast UpdatedSlack Community

Terraform module to provision a VPC with Internet Gateway. Contains a submodule for provisioning Interface and/or Gateway VPC Endpoints. This module also supports provisioning additional CIDR blocks for the VPC, with or without using IPAM.

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.

Examples

module "vpc" {
  source = "cloudposse/vpc/aws"
  # Cloud Posse recommends pinning every module to a specific version
  # version = "x.x.x"
  namespace = "eg"
  stage     = "test"
  name      = "app"

  ipv4_primary_cidr_block = "10.0.0.0/16"

  assign_generated_ipv6_cidr_block = true
}

Full example with terraform-aws-dynamic-subnets:

module "vpc" {
  source = "cloudposse/vpc/aws"
  # Cloud Posse recommends pinning every module to a specific version
  # version     = "x.x.x"
  namespace = "eg"
  stage     = "test"
  name      = "app"

  ipv4_primary_cidr_block = "10.0.0.0/16"

  assign_generated_ipv6_cidr_block = false
}

module "dynamic_subnets" {
  source = "cloudposse/dynamic-subnets/aws"
  # Cloud Posse recommends pinning every module to a specific version
  # version     = "x.x.x"
  namespace          = "eg"
  stage              = "test"
  name               = "app"
  availability_zones = ["us-west-2a","us-west-2b","us-west-2c"]
  vpc_id             = module.vpc.vpc_id
  igw_id             = [module.vpc.igw_id]
  cidr_block         = "10.0.0.0/16"
}

Submodule for provisioning VPC Endpoints:

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

  vpc_id = module.vpc.vpc_id

  gateway_vpc_endpoints = {
    "s3" = {
      name = "s3"
      policy = jsonencode({
        Version = "2012-10-17"
        Statement = [
          {
            Action = [
              "s3:*",
            ]
            Effect    = "Allow"
            Principal = "*"
            Resource  = "*"
          },
        ]
      })
    }
  }
  interface_vpc_endpoints = {
    "ec2" = {
      name                = "ec2"
      security_group_ids  = ["sg-12341234123412345"]
      subnet_ids          = module.dynamic_subnets.private_subnet_ids
      policy              = null
      private_dns_enabled = false
    }
  }
}

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.0.0
aws >= 4.9.0

Providers

Name Version
aws >= 4.9.0

Modules

Name Source Version
label cloudposse/label/null 0.25.0
this cloudposse/label/null 0.25.0

Resources

Name Type
aws_default_network_acl.default resource
aws_default_route_table.default resource
aws_default_security_group.default resource
aws_egress_only_internet_gateway.default resource
aws_internet_gateway.default resource
aws_vpc.default resource
aws_vpc_ipv4_cidr_block_association.default resource
aws_vpc_ipv6_cidr_block_association.default resource

Inputs

Name Description Type Default Required
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
assign_generated_ipv6_cidr_block When true, assign AWS generated IPv6 CIDR block to the VPC. Conflicts with ipv6_ipam_pool_id. bool true 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
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
default_network_acl_deny_all When true, manage the default network acl and remove all rules, disabling all ingress and egress.
When false, do not mange the default networking acl, allowing it to be managed by another component.
bool false no
default_route_table_no_routes When true, manage the default route table and remove all routes, disabling all ingress and egress.
When false, do not mange the default route table, allowing it to be managed by another component.
Conflicts with Terraform resource aws_main_route_table_association.
bool false no
default_security_group_deny_all When true, manage the default security group and remove all rules, disabling all ingress and egress.
When false, do not manage the default security group, allowing it to be managed by another component.
bool true no
delimiter Delimiter to be used between ID elements.
Defaults to - (hyphen). Set to "" to use no delimiter at all.
string null 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
dns_hostnames_enabled Set true to enable DNS hostnames in the VPC bool true no
dns_support_enabled Set true to enable DNS resolution in the VPC through the Amazon provided DNS server 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
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
instance_tenancy A tenancy option for instances launched into the VPC string "default" no
internet_gateway_enabled Set true to create an Internet Gateway for the VPC bool true no
ipv4_additional_cidr_block_associations IPv4 CIDR blocks to assign to the VPC.
ipv4_cidr_block can be set explicitly, or set to null with the CIDR block derived from ipv4_ipam_pool_id using ipv4_netmask_length.
Map keys must be known at plan time, and are only used to track changes.
map(object({
ipv4_cidr_block = string
ipv4_ipam_pool_id = string
ipv4_netmask_length = number
}))
{} no
ipv4_cidr_block_association_timeouts Timeouts (in go duration format) for creating and destroying IPv4 CIDR block associations
object({
create = string
delete = string
})
null no
ipv4_primary_cidr_block The primary IPv4 CIDR block for the VPC.
Either ipv4_primary_cidr_block or ipv4_primary_cidr_block_association must be set, but not both.
string null no
ipv4_primary_cidr_block_association Configuration of the VPC's primary IPv4 CIDR block via IPAM. Conflicts with ipv4_primary_cidr_block.
One of ipv4_primary_cidr_block or ipv4_primary_cidr_block_association must be set.
Additional CIDR blocks can be set via ipv4_additional_cidr_block_associations.
object({
ipv4_ipam_pool_id = string
ipv4_netmask_length = number
})
null no
ipv6_additional_cidr_block_associations IPv6 CIDR blocks to assign to the VPC (in addition to the autogenerated one).
ipv6_cidr_block can be set explicitly, or set to null with the CIDR block derived from ipv6_ipam_pool_id using ipv6_netmask_length.
Map keys must be known at plan time and are used solely to prevent unnecessary changes.
map(object({
ipv6_cidr_block = string
ipv6_ipam_pool_id = string
ipv6_netmask_length = number
}))
{} no
ipv6_cidr_block_association_timeouts Timeouts (in go duration format) for creating and destroying IPv6 CIDR block associations
object({
create = string
delete = string
})
null no
ipv6_cidr_block_network_border_group Set this to restrict advertisement of public addresses to a specific Network Border Group such as a LocalZone.
Requires assign_generated_ipv6_cidr_block to be set to true.
string null no
ipv6_egress_only_internet_gateway_enabled Set true to create an IPv6 Egress-Only Internet Gateway for the VPC bool false no
ipv6_primary_cidr_block_association Primary IPv6 CIDR block to assign to the VPC. Conflicts with assign_generated_ipv6_cidr_block.
ipv6_cidr_block can be set explicitly, or set to null with the CIDR block derived from ipv6_ipam_pool_id using ipv6_netmask_length.
object({
ipv6_cidr_block = string
ipv6_ipam_pool_id = string
ipv6_netmask_length = number
})
null 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
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
network_address_usage_metrics_enabled Set true to enable Network Address Usage Metrics for the VPC 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
stage ID element. Usually used to indicate role, e.g. 'prod', 'staging', 'source', 'build', 'test', 'deploy', 'release' string null no
tags Additional tags (e.g. {'BusinessUnit': 'XYZ'}).
Neither the tag keys nor the tag values will be modified by this module.
map(string) {} 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

Outputs

Name Description
additional_cidr_blocks A list of the additional IPv4 CIDR blocks associated with the VPC
additional_cidr_blocks_to_association_ids A map of the additional IPv4 CIDR blocks to VPC CIDR association IDs
additional_ipv6_cidr_blocks A list of the additional IPv6 CIDR blocks associated with the VPC
additional_ipv6_cidr_blocks_to_association_ids A map of the additional IPv6 CIDR blocks to VPC CIDR association IDs
igw_id The ID of the Internet Gateway
ipv6_cidr_block_network_border_group The IPv6 Network Border Group Zone name
ipv6_egress_only_igw_id The ID of the egress-only Internet Gateway
vpc_arn The ARN of the VPC
vpc_cidr_block The primary IPv4 CIDR block of the VPC
vpc_default_network_acl_id The ID of the network ACL created by default on VPC creation
vpc_default_route_table_id The ID of the route table created by default on VPC creation
vpc_default_security_group_id The ID of the security group created by default on VPC creation
vpc_id The ID of the VPC
vpc_ipv6_association_id The association ID for the primary IPv6 CIDR block
vpc_ipv6_cidr_block The primary IPv6 CIDR block
vpc_main_route_table_id The ID of the main route table associated with this VPC

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 together with your team.
โœ… Your team owns everything.
โœ… 100% Open Source and backed by fanatical support.

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-vpc's People

Contributors

1david5 avatar actions-user avatar aknysh avatar alexpls avatar bazbremner avatar cdobbyn avatar cloudpossebot avatar dboesswetter avatar drama17 avatar gabel7r avatar goruha avatar gowiem avatar jbouse avatar korenyoni avatar lanzrein avatar makeshift avatar max-lobur avatar maximmi avatar morton avatar mrostanski avatar ngoyal16 avatar nitrocode avatar nuru avatar osterman avatar renovate[bot] avatar solairerove avatar sweetops avatar vadim-hleif avatar vanastassiou avatar woz5999 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  avatar  avatar  avatar  avatar  avatar  avatar

terraform-aws-vpc's Issues

Remove classiclink support

Describe the Bug

New versions of the AWS provider are now warning about the deprecated setting enable_classiclink as this functionality no longer exists within AWS.

Expected Behavior

No warning appears.

Steps to Reproduce

  1. Update your AWS provider to the latest version
  2. Try to run a terraform plan for a new or existing VPC.

Screenshots

n/a - see additional context

Environment (please complete the following information):

terraform 1.2.x
aws provider 4.29.0

Additional Context

Fixing this issue will reduce backwards compatibility with older aws providers which required this setting.

Example output:

โ•ท
โ”‚ Warning: Argument is deprecated
โ”‚ 
โ”‚   with module.access_vpc_01.module.this_vpc.aws_vpc.default,
โ”‚   on .terraform/modules/access_vpc_01.this_vpc/main.tf line 40, in resource "aws_vpc" "default":
โ”‚   40:   enable_classiclink               = local.classiclink_enabled
โ”‚ 
โ”‚ With the retirement of EC2-Classic the enable_classiclink attribute has
โ”‚ been deprecated and will be removed in a future version.
โ”‚ 
โ”‚ (and 7 more similar warnings elsewhere)
โ•ต

Removes any rules associated with a default SG

According to the docs

When Terraform first adopts the Default Security Group, it immediately removes all ingress and egress rules in the Security Group. It then proceeds to create any rules specified in the configuration. This step is required so that only the rules specified in the configuration are created.

ipv6 conflicts

Receiving the following error:

* module.vpc.output.vpc_ipv6_association_id: Resource 'aws_vpc.default' does not have attribute 'ipv6_association_id' for variable 'aws_vpc.default.ipv6_association_id'
* module.vpc.output.ipv6_cidr_block: Resource 'aws_vpc.default' does not have attribute 'ipv6_cidr_block' for variable 'aws_vpc.default.ipv6_cidr_block'

Config:

module "vpc" {
  source     = "git::https://github.com/cloudposse/terraform-aws-vpc.git?ref=master"
  namespace  = "${var.namespace}"
  name       = "vpc"
  stage      = "${var.stage}"
  cidr_block = "${var.cidr_block}"
}

module "dynamic_subnets" {
  source             = "git::https://github.com/cloudposse/terraform-aws-dynamic-subnets.git?ref=master"
  availability_zones = "${var.availability_zones}"
  namespace          = "${var.namespace}"
  name               = "${var.name}"
  stage              = "${var.stage}"
  region             = "${var.aws_region}"
  vpc_id             = "${module.vpc.vpc_id}"
  igw_id             = "${module.vpc.igw_id}"
  cidr_block         = "${module.vpc.vpc_cidr_block}"
}

Set default value for instance_tenancy

conditions

  • Use s3 backend for .tfstate file
  • Do terraform apply on the one host
  • Do terraform plan on another host
  • VPC is going to be recreated because instance_tenancy is going to be changed

image

cidr_block required for vpc module

Hello,

I'm looking for some clarification in the documentation regarding the cidr_block input for the vpc module. The documentation says it's required but the examples don't include the input. I tried to deploy a vpc using the dynamic_subnets module and got an error stating the cidr_block was required for the vpc module. Maybe there's more going on than is evident from the documents? I was able to deploy a vpc by including the cidr_block input on the vpc module. Thanks for your time.

Dependency Dashboard

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

This repository currently has no open or pending branches.

Detected dependencies

terraform
main.tf
  • cloudposse/label/null 0.25.0
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
modules/vpc-endpoints/main.tf
  • cloudposse/label/null 0.25.0
  • cloudposse/label/null 0.25.0
  • undefined no version found
  • undefined no version found
modules/vpc-endpoints/versions.tf
  • hashicorp/terraform >= 0.13.0
  • aws >= 2.0
versions.tf
  • hashicorp/terraform >= 0.13.0
  • aws >= 3.0

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

Add Example Usage

what

  • Add example invocation

why

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

Known Only After Apply on Terraform Import

Describe the Bug

Only when trying to perform a terraform import I run into the following:

Error: Invalid for_each argument
โ”‚ 
โ”‚   on .terraform/modules/vpc_endpoints/modules/vpc-endpoints/main.tf line 72, in module "gateway_endpoint_label":
โ”‚   72:   for_each   = local.enabled ? data.aws_vpc_endpoint_service.gateway_endpoint_service : {}
โ”‚     โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ”‚     โ”‚ data.aws_vpc_endpoint_service.gateway_endpoint_service will be known only after apply
โ”‚     โ”‚ local.enabled is true
โ”‚ 
โ”‚ The "for_each" 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 for_each depends on.

My VPC endpoint does not contain a gateway_vpc_endpoints. I think this is because the module uses local.enabled for the existence of either a gateway or interface VPC endpoint rather than toggling them on individually. Or I'm doing it completely wrong. I'm doing:

module "vpc_endpoints" {
  source  = "cloudposse/vpc/aws//modules/vpc-endpoints"
  version = "2.0.0"

  context = module.vpc_endpoints_role_label.context

  vpc_id = data.aws_vpc.vpc.id

  gateway_vpc_endpoints = {}
  interface_vpc_endpoints = {
    "kinesis-streams" = {
      name                = "kinesis-streams"
      security_group_ids  = [module.dms_security_group.id]
      subnet_ids          = local.private_subnet_ids
      policy              = null
      private_dns_enabled = true
    }
  }
}

Expected Behavior

No error on import

Steps to Reproduce

Steps to reproduce the behavior:

  1. Add some resource to import. I added resource "aws_s3_bucket" "test_bucket" {bucket=test_name}. It doesn't even have to exist, you just need a resource to target
  2. terraform import aws_s3_bucket.test_bucket something-that-doesnt-exist-and-thats-ok

Environment (please complete the following information):

  • TF version 1.1.7
  • Module version 2.0.0

Egress only internet gateway

Describe the Feature

This module can create aws_internet_gateway resource. For ipv6 workflows, it would be nice if it could also create aws_egress_only_internet_gateway

Expected Behavior

Create aws_egress_only_internet_gateway resource if enable_egress_only_internet_gateway var is true.
Output egress_only_gw_id

Use Case

I like to have VPC that provides full ipv6 support. Resources deployed in private subnets could have internet access.

`cidr_block` is not a valid option anymore.. it's `ipv4_cidr_block` now

Describe the Bug

The option:

cidr_block         = "10.0.0.0/16"

is not valid anymore.. it has been changed to ipv4_cidr_block now and it's a list of strings, not one string.

Expected Behavior

cidr_block         = "10.0.0.0/16"

should work as per docs and examples

Steps to Reproduce

try to use latest main branch version of the module

Screenshots

No response

Environment

  • Module: latest main branch commit
  • TF version: tested with v1.4.5

Additional Context

No response

creating EC2 VPC: MissingParameter: Either 'cidrBlock' or 'ipv4IpamPoolId' should be provided.

Describe the Bug

I believe I've followed the documentation properly, however I can't get past this error when trying to create a VPC:

Plan: 3 to add, 0 to change, 0 to destroy.
module.vpc.aws_vpc.default[0]: Creating...

 Error: creating EC2 VPC: MissingParameter: Either 'cidrBlock' or 'ipv4IpamPoolId' should be provided.
       status code: 400, request id: d0e8e1a1-a19c-4d2a-9b33-cf89c5d207be
 
   with module.vpc.aws_vpc.default[0],
   on .terraform/modules/vpc/main.tf line 30, in resource "aws_vpc" "default":
   30: resource "aws_vpc" "default" {
 

Releasing state lock. This may take a few moments...

Expected Behavior

When declaring variables according to the documentation, I would expect the module to create a VPC using my IPAM pool & CIDR I specified in my .tfvars file:

ipv4_additional_cidr_block_associations = {
    ipv4_cidr = {
      ipv4_cidr_block = null
      ipv4_ipam_pool_id = "ipam-pool-<REDACTED>"
      ipv4_netmask_length = 20
    }
}

Steps to Reproduce

Steps to reproduce the behavior:
Using the VPC module as so, you should be able to replicate this:

main.tf

module "vpc" {
  source  = "cloudposse/vpc/aws"
  version = "2.0.0"
  // https://github.com/cloudposse/terraform-aws-vpc

  namespace = var.namespace
  stage     = var.stage
  name      = var.name

  internet_gateway_enabled                = false
  ipv4_additional_cidr_block_associations = var.ipv4_additional_cidr_block_associations
  assign_generated_ipv6_cidr_block        = false

}

<some-prefix>.tfvar:

region = "<REDACTED>"

stage = "<REDACTED>"

name = "<REDACTED>"

ipv4_additional_cidr_block_associations = {
    ipv4_cidr = {
      ipv4_cidr_block = null
      ipv4_ipam_pool_id = "ipam-pool-<REDACTED>"
      ipv4_netmask_length = 20
    }
}

provider.tf:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "4.58.0"
    }
  }
}

provider "aws" {
  region                   = var.region
  shared_credentials_files = ["<REDACTED>"]
  profile                  = "<REDACTED>"
}

backend.tf:

terraform {
  required_version = "~> 1.4.6"

  backend "s3" {
    region         = "<REDACTED>"
    bucket         = "<REDACTED>"
    key            = "terraform.tfstate"
    dynamodb_table = "<REDACTED>-state-lock"
    profile        = "<REDACTED>"
    role_arn       = ""
    encrypt        = "true"
  }
}

variables.tf:

variable "region" {
  description = "The region in AWS we're working on"
  default = null
}

variable "namespace" {
  description = "ID element. Usually an abbreviation of your organization name, e.g. 'eg' or 'cp', to help ensure generated IDs are globally unique"
  default     = "<REDACTED>"
}

variable "stage" {
  description = "ID element. Usually used to indicate role, e.g. 'prod', 'staging', 'source', 'build', 'test', 'deploy', 'release'"
  default = null
}

variable "name" {
  description = <<EOF
    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.
  EOF
  default = null
}

variable "ipv4_additional_cidr_block_associations" {
  description = <<EOF
   IPv4 CIDR blocks to assign to the VPC.
   Ipv4_cidr_block can be set explicitly, or set to null with the CIDR block derived from ipv4_ipam_pool_id using ipv4_netmask_length.
   Map keys must be known at plan time, and are only used to track changes.
  EOF
  type = map(object({
    ipv4_cidr_block     = string
    ipv4_ipam_pool_id   = string
    ipv4_netmask_length = number
  }))
  default = null
}

Screenshots

I think the code snippets above should be just fine

Environment:

[] adam ~ $ tfenv list
* 1.4.6 (set by /opt/homebrew/Cellar/tfenv/3.0.0/version)
  1.3.6
  1.2.9
  1.1.9
[] adam ~ $
terraform {
  required_version = "~> 1.4.6"

(I also tried terraform versions 1.2.9 & 1.1.9, same error)

      source  = "hashicorp/aws"
      version = "4.58.0"

Additional Context

I can't seem to figure this out. I've enabled export TF_LOG=DEBUG too, however that didn't give anymore information besides the error above.

I very well could be using map(object) incorrectly, however I've troubleshot this quite a bit and I'm out of ideas. I looked locally in the .terraform/modules directory too, to see what the modules doing but again.. just stuck on this. Any help would be greatly appreciated.

Thank you!

Default VPC option?

Is there a way to set this VPC as the default VPC? I couldn't seem to find it in the module.

Default security group behavior change

Describe the Bug

Feature commit f875913 looked to use the terraform-aws-security-group module rather than the base resource.

However, this change makes a new group and just calls it the default group, but doesn't actually manage / reference the default security group in the VPC, as was done previously.

Expected Behavior

VPC creation has hooks for managing the default security group, not creating a non-default security group and calling it default.

Steps to Reproduce

Steps to reproduce the behavior:

  1. Follow the complete example in this repository
  2. Behold you end up with two security groups, with the one flagged not named default is labeled "Default Security Group"

Additional Context

This is a regression on previous behavior.

Appears unintentional.

Region is required for `provider aws`

Executing it with terraform 0.12 gives me

Error: Missing required argument

  on .terraform/modules/vpc/versions.tf line 8, in provider "aws":
   8: provider "aws" {

The argument "region" is required, but no definition was found.

Updated behavior, features, and variable names

Motivation

Cloud Posse is undertaking an effort to modernize and standardize its open source AWS Terraform modules with respect to handling AWS Security Groups, optional inputs, and certain other things. This module, terraform-aws-vpc is schedule for such modernization, and Cloud Posse is taking this opportunity to introduce breaking changes if needed. Changes that have been or would have been rejected earlier as nice but breaking are now being considered, and after this revision, this module will again go back to resisting breaking changes. This is the time to get those fixes in.

Please propose or comment on proposed breaking changes you would like to advocate for or against.

Changes (with decisions in [brackets])

Standardized input names, part 1: provider inputs.

Cloud Posse standard is that boolean inputs have names that end with _enabled. However, Cloud Posse seeks to use the same input names as the related Terraform AWS Resource to provide consistency with the documentation. The vpc resource provides a challenge in this regard. The resource, and the current version of this module, provide inputs named:

  • enable_dns_hostnames

  • enable_dns_support

  • enable_classiclink

  • enable_classiclink_dns_support

  • assign_generated_ipv6_cidr_block

    1. Should we keep these variables with these name? [Yes, but mark them deprecated]

    2. Should rename these variables according to Cloud Posse naming conventions: [Yes]

    • enable_dns_hostnames -> dns_hostnames_enabled
    • enable_dns_support -> dns_support_enabled
    • enable_classiclink -> classiclink_enabled
    • enable_classiclink_dns_support -> classiclink_dns_support_enabled
    • assign_generated_ipv6_cidr_block -> ipv6_enabled
    1. Should we keep the old names and add the new names as aliases? [Yes. Create new file variables-deprecated.tf and put deprecated variables in it.]

Standardized input names, part 2: other inputs.

  1. The input enable_internet_gateway is not a standard Terraform input, but follows the naming convention of the other inputs. Should we treat it like the above inputs and either leave it, rename it to internet_gateway_enabled, or alias it? [treat as above]

  2. There is a Feature Request (#93) and a PR (#94) requesting that we add to this module the ability to create an Egress-only Internet Gateway. Such a gateway provides the same general security benefit for IPv6 that a NAT gateway provides for IPv4, but does not actually do Network Address Translation. This is because there is no such thing in an AWS VPC as a "private" IPv6 subnet; all IPv6 addresses are public. Because the IPv6 address space is big enough, there is no need for Network Address Translation, but since all the addresses are public, there is still a need for a way to block initiation of inbound connections: that is what the Egress-Only Gateway does. If we implement the feature, what should we name the input, given the decisions above. Should it be egress_only_internet_gateway_enabled? Or, given that it is a mistake to provision both a bidirectional internet gateway an an egress-only gateway at the same time, should we create a flag like internet_gateway_is_egress_only and have it toggle the kind of gateway created when internet_gateway_enabled is true?

[It is not necessarily a mistake to have both an internet gateway and an egress-only IPv6 network, since you can use routing tables and network ACLs to cordon off some servers to egress only. Add new flag ipv6_egress_only_internet_gateway_enabled]

Default Security Group

The input enable_default_security_group_with_custom_rules should be replaced as part of the security group upgrade. Probably the terraform-aws-security-group module should be enhanced to take the same rule sets and apply them to the default security group, so that we have consistent input formats for security group rules and no duplication of code parsing them. However, given the Bridegcrew recommendation that the default security group should prohibit all ingress and egress, perhaps we should just enforce that and encourage people to use non-default security groups.

If we are going to allow custom configuration of the default security group, then we should do it by accepting rules in the format of terraform-aws-security-group and using that module to manage them.

[Replace enable_default_security_group_with_custom_rules with default_security_group_deny_all. When true (the default), manage the default security group and remove all rules, disabling all ingress and egress. When false, do not manage the default security group, allowing it to be managed by another component.]

PrivateLink support

Describe the Feature

It would be great to have the vpc-endpoints submodule support AWS PrivateLink services as well. In general, any non-standard service that is supported by AWS' VPC Endpoints service.

Use Case

When partnering with external services, they often expose an AWS PrivateLink that customers can use. Since the vpc-endpoints submodule already supports the official AWS services, it would be prudent to support non-official services as well.

Describe Ideal Solution

The vpc-endpoints submodule supports the service_name in

data "aws_vpc_endpoint_service" "interface_endpoint_service" {

We could expose a new input, say, service_type that might accept 'internal' or 'external' as values. Based on that input, we could decide whether to use the service or service_name arguments in the aws_vpc_endpoint_service data source.

Alternatives Considered

I hacked my local vendored module to change service to service_name to experiment whether it would work.

diff --git a/modules/vpc-endpoints/main.tf b/modules/vpc-endpoints/main.tf
 data "aws_vpc_endpoint_service" "interface_endpoint_service" {
   for_each     = local.enabled ? var.interface_vpc_endpoints : {}
-  service      = var.interface_vpc_endpoints[each.key].name
+  service_name = var.interface_vpc_endpoints[each.key].name
   service_type = "Interface"
 }

It worked straight-forward with no other change to the vendored module. That is why I thought that this might be easy to implement.

cidr_block required for vpc module

Hello,

I'm looking for some clarification in the documentation regarding the cidr_block input for the vpc module. The documentation says it's required but the examples don't include the input. I tried to deploy a vpc using the dynamic_subnets module and got an error stating the cidr_block was required for the vpc module. Maybe there's more going on than is evident from the documents? I was able to deploy a vpc by including the cidr_block input on the vpc module. Thanks for your time.

Single Nat Gateway

Is there any way to restrict the number of Nat Gateways created?
would be useful for a single_nat_gateway input?

Manage default route table created by this module

Describe the Feature

This module should manage the default route table that is created by the VPC.

Expected Behavior

After the VPC is created, another resource is added that takes ownership of the default route table. This can be accomplished via the aws_default_route_table resource (that is this resource's only role).

Use Case

Because this route table is not under management it does not contain any identifying tags to clearly identify it without looking at it's parent VPC.

Describe Ideal Solution

This resource is managed and is tagged so that it can visibly indicate it's use case without extra clicks.

Alternatives Considered

This is a fairly simple use case, the alternative is to click through the VPC link.

Additional Context

n/a

Implement CI/CD with Codefresh

what

preparation

  1. Create examples/ folder with working examples. one per subdirectory.
  2. Use this as a test case
module "vpc" {
  source    = "...relateive path..."
  namespace = "eg"
  stage     = "testing"
  name      = "app"
}

CI/CD

  1. use codefresh to run a temporary container with tf module code
    e.g.
docker run -v examples/:/conf/ testing.cloudposse.co

Then for each project in examples/, do the following:
2. run init-terraform to set remote state
3. run terraform plan
4. use github-commenter to paste output to github PR
5. run terraform apply if previous steps succeeded
6. use github-commenter to paste output to github PR
7. run terraform destroy if previous steps succeeded
8. run github-commenter to paste output to github PR

why

  • Ensure module is functioning

Error: module "vpc": "assign_generated_ipv6_cidr_block" is not a valid argument

terraform init
Initializing modules...

  • module.jenkins
  • module.vpc
  • module.subnets
  • module.jenkins.elastic_beanstalk_application
  • module.jenkins.elastic_beanstalk_environment
  • module.jenkins.ecr
  • module.jenkins.efs
  • module.jenkins.efs_backup
  • module.jenkins.cicd
  • module.jenkins.label_slaves
  • module.jenkins.efs.label
  • module.jenkins.efs.dns
  • module.jenkins.efs_backup.sns_label
  • module.jenkins.efs_backup.datapipeline_label
  • module.jenkins.efs_backup.resource_role_label
  • module.jenkins.efs_backup.role_label
  • module.jenkins.efs_backup.label
  • module.jenkins.efs_backup.logs_label
  • module.jenkins.efs_backup.backups_label
  • module.jenkins.cicd.label
  • module.jenkins.cicd.build
  • module.jenkins.cicd.build.label
  • module.jenkins.elastic_beanstalk_application.label
  • module.jenkins.elastic_beanstalk_environment.label
  • module.jenkins.elastic_beanstalk_environment.tld
  • module.jenkins.ecr.label
  • module.vpc.label
  • module.subnets.private_label
  • module.subnets.private_subnet_label
  • module.subnets.public_subnet_label
  • module.subnets.public_label

Error: module "vpc": "assign_generated_ipv6_cidr_block" is not a valid argument

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.