diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2537f2f..6f64b5a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -15,8 +15,8 @@ # Cloud Posse must review any changes to standard context definition, # but some changes can be rubber-stamped. -**/*.tf @cloudposse/engineering @cloudposse/approvers -README.yaml @cloudposse/engineering @cloudposse/approvers +**/*.tf @cloudposse/engineering @cloudposse/contributors @cloudposse/approvers +README.yaml @cloudposse/engineering @cloudposse/contributors @cloudposse/approvers README.md @cloudposse/engineering @cloudposse/contributors @cloudposse/approvers docs/*.md @cloudposse/engineering @cloudposse/contributors @cloudposse/approvers diff --git a/.github/auto-release.yml b/.github/auto-release.yml index c78a4d8..39a7f1e 100644 --- a/.github/auto-release.yml +++ b/.github/auto-release.yml @@ -46,7 +46,7 @@ template: | replacers: # Remove irrelevant information from Renovate bot -- search: '/---\s+^#.*Renovate configuration(?:.|\n)*?This PR has been generated .*/gm' +- search: '/(?<=---\s+)+^#.*(Renovate configuration|Configuration)(?:.|\n)*?This PR has been generated .*/gm' replace: '' # Remove Renovate bot banner image - search: '/\[!\[[^\]]*Renovate\][^\]]*\](\([^)]*\))?\s*\n+/gm' diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml index 9e9379d..375d0fd 100644 --- a/.github/workflows/auto-format.yml +++ b/.github/workflows/auto-format.yml @@ -29,6 +29,8 @@ jobs: - name: Auto Format if: github.event.pull_request.state == 'open' shell: bash + env: + GITHUB_TOKEN: "${{ secrets.PUBLIC_REPO_ACCESS_TOKEN }}" run: make BUILD_HARNESS_PATH=/build-harness PACKAGES_PREFER_HOST=true -f /build-harness/templates/Makefile.build-harness pr/auto-format/host # Commit changes (if any) to the PR branch diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml index 3f48017..1d06d9b 100644 --- a/.github/workflows/auto-release.yml +++ b/.github/workflows/auto-release.yml @@ -3,17 +3,25 @@ name: auto-release on: push: branches: - - master + - main + - master + - production jobs: publish: runs-on: ubuntu-latest steps: - # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: release-drafter/release-drafter@v5 - with: - publish: true - prerelease: false - config-name: auto-release.yml - env: - GITHUB_TOKEN: ${{ secrets.PUBLIC_REPO_ACCESS_TOKEN }} + # Get PR from merged commit to master + - uses: actions-ecosystem/action-get-merged-pull-request@v1 + id: get-merged-pull-request + with: + github_token: ${{ secrets.PUBLIC_REPO_ACCESS_TOKEN }} + # Drafts your next Release notes as Pull Requests are merged into "main" + - uses: release-drafter/release-drafter@v5 + if: "!contains(steps.get-merged-pull-request.outputs.labels, 'no-release')" + with: + publish: true + prerelease: false + config-name: auto-release.yml + env: + GITHUB_TOKEN: ${{ secrets.PUBLIC_REPO_ACCESS_TOKEN }} diff --git a/.github/workflows/validate-codeowners.yml b/.github/workflows/validate-codeowners.yml index 386eb28..c5193b6 100644 --- a/.github/workflows/validate-codeowners.yml +++ b/.github/workflows/validate-codeowners.yml @@ -1,5 +1,7 @@ name: Validate Codeowners on: + workflow_dispatch: + pull_request: jobs: diff --git a/README.md b/README.md index 14e7671..d5e4a4f 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,24 @@ The table below correctly indicates which inputs are required. +Note: Terraform requires that all the elements of the `rules` list be exactly +the same type. This means you must supply all the same keys and, for each key, +all the values for that key must be the same type. Any optional key, such as +`ipv6_cidr_blocks`, can be omitted from all the rules without problem. However, +if some rules have a key and other rules would omit the key if that were allowed +(e.g one rule has `cidr_blocks` and another rule has `self = true`, and neither +rule can include both `cidr_blocks` and `self`), instead of omitting the key, +include the key with value of `null`, unless the value is a list type, in which case +set the value to `[]` (an empty list). + +Although `description` is optional, if you do not include a description, +the rule will be deleted and recreated if the index of the rule in the `rules` +list changes, which usually happens as a result of adding or removing a rule. Rules +that include a description will only be modified if the rule itself changes. +Also, if 2 rules specify the same `type`, `protocol`, `from_port`, and `to_port`, +they must not also have the same `description` (although if one or both rules +have no description supplied, that will work). + ```hcl module "label" { source = "cloudposse/label/null" @@ -124,6 +142,7 @@ module "sg" { source = "cloudposse/security-group/aws" # Cloud Posse recommends pinning every module to a specific version # version = "x.x.x" + rules = [ { type = "ingress" @@ -131,13 +150,27 @@ module "sg" { to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] + self = null + description = "Allow SSH from anywhere" + }, + { + type = "ingress" + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = [] + self = true + description = "Allow HTTP from inside the security group" }, + { type = "egress" from_port = 0 to_port = 65535 protocol = "all" cidr_blocks = ["0.0.0.0/0"] + self = null + description = "Allow egress to anywhere" } ] @@ -151,7 +184,7 @@ module "sg" { ## Examples Here is an example of using this module: -- [`examples/complete`](https://github.com/cloudposse/terraform-aws-security-group/) - complete example of using this module +- [`examples/complete`](https://github.com/cloudposse/terraform-aws-security-group/examples/complete) - complete example of using this module @@ -172,7 +205,7 @@ Available targets: | Name | Version | |------|---------| -| [terraform](#requirement\_terraform) | >= 0.14.0 | +| [terraform](#requirement\_terraform) | >= 0.13.0 | | [aws](#requirement\_aws) | >= 2.0 | ## Providers @@ -239,6 +272,7 @@ Like this project? Please give it a ★ on [our GitHub](https://github.com/cloud Are you using this project or any of our other projects? Consider [leaving a testimonial][testimonial]. =) + ## Related Projects Check out these related projects. @@ -246,8 +280,6 @@ Check out these related projects. - [terraform-null-label](https://github.com/cloudposse/terraform-null-label) - Terraform module designed to generate consistent names and tags for resources. Use terraform-null-label to implement a strict naming convention. - - ## References For additional context, refer to some of these links. diff --git a/README.yaml b/README.yaml index adc3486..c97f2ae 100644 --- a/README.yaml +++ b/README.yaml @@ -61,6 +61,24 @@ description: |- # How to use this module. Should be an easy example to copy and paste. usage: |- + Note: Terraform requires that all the elements of the `rules` list be exactly + the same type. This means you must supply all the same keys and, for each key, + all the values for that key must be the same type. Any optional key, such as + `ipv6_cidr_blocks`, can be omitted from all the rules without problem. However, + if some rules have a key and other rules would omit the key if that were allowed + (e.g one rule has `cidr_blocks` and another rule has `self = true`, and neither + rule can include both `cidr_blocks` and `self`), instead of omitting the key, + include the key with value of `null`, unless the value is a list type, in which case + set the value to `[]` (an empty list). + + Although `description` is optional, if you do not include a description, + the rule will be deleted and recreated if the index of the rule in the `rules` + list changes, which usually happens as a result of adding or removing a rule. Rules + that include a description will only be modified if the rule itself changes. + Also, if 2 rules specify the same `type`, `protocol`, `from_port`, and `to_port`, + they must not also have the same `description` (although if one or both rules + have no description supplied, that will work). + ```hcl module "label" { source = "cloudposse/label/null" @@ -91,6 +109,7 @@ usage: |- source = "cloudposse/security-group/aws" # Cloud Posse recommends pinning every module to a specific version # version = "x.x.x" + rules = [ { type = "ingress" @@ -98,13 +117,27 @@ usage: |- to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] + self = null + description = "Allow SSH from anywhere" }, + { + type = "ingress" + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = [] + self = true + description = "Allow HTTP from inside the security group" + }, + { type = "egress" from_port = 0 to_port = 65535 protocol = "all" cidr_blocks = ["0.0.0.0/0"] + self = null + description = "Allow egress to anywhere" } ] @@ -115,7 +148,7 @@ usage: |- # Example usage examples: |- Here is an example of using this module: - - [`examples/complete`](https://github.com/cloudposse/terraform-aws-security-group/) - complete example of using this module + - [`examples/complete`](https://github.com/cloudposse/terraform-aws-security-group/examples/complete) - complete example of using this module # How to get started quickly #quickstart: |- @@ -131,4 +164,4 @@ contributors: - name: "Erik Osterman" github: "osterman" - name: "Vladimir" - github: "SweetOps" \ No newline at end of file + github: "SweetOps" diff --git a/docs/terraform.md b/docs/terraform.md index 030229e..0faa366 100644 --- a/docs/terraform.md +++ b/docs/terraform.md @@ -3,7 +3,7 @@ | Name | Version | |------|---------| -| [terraform](#requirement\_terraform) | >= 0.14.0 | +| [terraform](#requirement\_terraform) | >= 0.13.0 | | [aws](#requirement\_aws) | >= 2.0 | ## Providers diff --git a/examples/complete/main.tf b/examples/complete/main.tf index 7181fea..90aa4b7 100644 --- a/examples/complete/main.tf +++ b/examples/complete/main.tf @@ -24,8 +24,21 @@ module "new_security_group" { to_port = 22 protocol = "tcp" cidr_blocks = [] + ipv6_cidr_blocks = null source_security_group_id = aws_security_group.external.id - description = "Allow SSH access form the external SG" + description = "Allow SSH access from the external SG" + self = false + }, + { + type = "ingress" + from_port = 22 + to_port = 22 + protocol = "tcp" + cidr_blocks = [] + ipv6_cidr_blocks = null + source_security_group_id = null + description = "Allow SSH access from our own SG" + self = true }, { type = "ingress" @@ -33,8 +46,10 @@ module "new_security_group" { to_port = 443 protocol = "all" cidr_blocks = ["0.0.0.0/0"] + ipv6_cidr_blocks = null source_security_group_id = null description = null + self = null }, { type = "egress" @@ -42,8 +57,10 @@ module "new_security_group" { to_port = 65535 protocol = "all" cidr_blocks = ["0.0.0.0/0"] + ipv6_cidr_blocks = null source_security_group_id = null description = "Allow all outbound traffic" + self = null } ] diff --git a/examples/complete/versions.tf b/examples/complete/versions.tf index 678142c..5b2c49b 100644 --- a/examples/complete/versions.tf +++ b/examples/complete/versions.tf @@ -1,5 +1,5 @@ terraform { - required_version = ">= 0.14.0" + required_version = ">= 0.13.0" required_providers { aws = { diff --git a/main.tf b/main.tf index b47a254..30d9a02 100644 --- a/main.tf +++ b/main.tf @@ -8,70 +8,13 @@ locals { name = local.is_external ? join("", data.aws_security_group.external.*.name) : join("", aws_security_group.default.*.name) rules = module.this.enabled && var.rules != null ? { for indx, rule in flatten(var.rules) : - format("%s-%s-%s-%s-%s", + format("%v-%v-%v-%v-%s", rule.type, rule.protocol, rule.from_port, rule.to_port, - lookup(rule, "description", null) == null ? md5(format("Managed by Terraform #%d", indx)) : md5(rule.description) - ) => { - type = rule.type - protocol = rule.protocol - from_port = rule.from_port - to_port = rule.to_port - description = try(rule.description, format("Managed by Terraform #%d", indx)) - } - } : {} - source_security_group_id = module.this.enabled && var.rules != null ? { - for indx, rule in flatten(var.rules) : - format("%s-%s-%s-%s-%s", - rule.type, - rule.protocol, - rule.from_port, - rule.to_port, - lookup(rule, "description", null) == null ? md5(format("Managed by Terraform #%d", indx)) : md5(rule.description) - ) => try(rule.source_security_group_id, null) - } : {} - - cidr_blocks = module.this.enabled && var.rules != null ? { - for indx, rule in flatten(var.rules) : - format("%s-%s-%s-%s-%s", - rule.type, - rule.protocol, - rule.from_port, - rule.to_port, - lookup(rule, "description", null) == null ? md5(format("Managed by Terraform #%d", indx)) : md5(rule.description) - ) => try(rule.cidr_blocks, null) != null ? (length(rule.cidr_blocks) > 0 ? rule.cidr_blocks : null) : null - } : {} - ipv6_cidr_blocks = module.this.enabled && var.rules != null ? { - for indx, rule in flatten(var.rules) : - format("%s-%s-%s-%s-%s", - rule.type, - rule.protocol, - rule.from_port, - rule.to_port, - lookup(rule, "description", null) == null ? md5(format("Managed by Terraform #%d", indx)) : md5(rule.description) - ) => try(rule.ipv6_cidr_blocks, null) != null ? (length(rule.ipv6_cidr_blocks) > 0 ? rule.ipv6_cidr_blocks : null) : null - } : {} - prefix_list_ids = module.this.enabled && var.rules != null ? { - for indx, rule in flatten(var.rules) : - format("%s-%s-%s-%s-%s", - rule.type, - rule.protocol, - rule.from_port, - rule.to_port, - lookup(rule, "description", null) == null ? md5(format("Managed by Terraform #%d", indx)) : md5(rule.description) - ) => try(rule.prefix_list_ids, null) != null ? (length(rule.prefix_list_ids) > 0 ? rule.prefix_list_ids : null) : null - } : {} - self = module.this.enabled && var.rules != null ? { - for indx, rule in flatten(var.rules) : - format("%s-%s-%s-%s-%s", - rule.type, - rule.protocol, - rule.from_port, - rule.to_port, - lookup(rule, "description", null) == null ? md5(format("Managed by Terraform #%d", indx)) : md5(rule.description) - ) => try(rule.self, null) + try(rule["description"], null) == null ? md5(format("Managed by Terraform #%d", indx)) : md5(rule.description) + ) => rule } : {} } @@ -98,15 +41,17 @@ resource "aws_security_group" "default" { resource "aws_security_group_rule" "default" { for_each = local.rules - security_group_id = local.id - type = each.value.type - from_port = each.value.from_port - to_port = each.value.to_port - protocol = each.value.protocol - description = each.value.description - cidr_blocks = lookup(local.cidr_blocks, each.key, null) - ipv6_cidr_blocks = lookup(local.ipv6_cidr_blocks, each.key, null) - prefix_list_ids = lookup(local.prefix_list_ids, each.key, null) - source_security_group_id = lookup(local.source_security_group_id, each.key, null) - self = lookup(local.self, each.key, null) + security_group_id = local.id + type = each.value.type + from_port = each.value.from_port + to_port = each.value.to_port + protocol = each.value.protocol + description = lookup(each.value, "description", "Managed by Terraform") + # Convert any of a missing key, a value of null, or a value of empty list to null + cidr_blocks = try(length(lookup(each.value, "cidr_blocks", [])), 0) > 0 ? each.value["cidr_blocks"] : null + ipv6_cidr_blocks = try(length(lookup(each.value, "ipv6_cidr_blocks", [])), 0) > 0 ? each.value["ipv6_cidr_blocks"] : null + prefix_list_ids = try(length(lookup(each.value, "prefix_list_ids", [])), 0) > 0 ? each.value["prefix_list_ids"] : null + self = coalesce(lookup(each.value, "self", null), false) ? true : null + + source_security_group_id = lookup(each.value, "source_security_group_id", null) } diff --git a/test/src/examples_complete_test.go b/test/src/examples_complete_test.go index b70ece2..b92023d 100644 --- a/test/src/examples_complete_test.go +++ b/test/src/examples_complete_test.go @@ -12,7 +12,8 @@ import ( // Test the Terraform module in examples/complete using Terratest. func TestExamplesComplete(t *testing.T) { - t.Parallel() + // Cannot run in parallel with InitAndApply (parallel inits clobber each other) or default statefile name + //t.Parallel() rand.Seed(time.Now().UnixNano()) randID := strconv.Itoa(rand.Intn(100000)) diff --git a/test/src/go.sum b/test/src/go.sum index 5026177..2947f4b 100644 --- a/test/src/go.sum +++ b/test/src/go.sum @@ -58,11 +58,14 @@ github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= +github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0= github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= +github.com/apparentlymart/go-textseg/v12 v12.0.0 h1:bNEQyAGak9tojivJNkoqWErVCQbjdL7GzRt3F8NvfJ0= github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= @@ -212,18 +215,23 @@ github.com/gruntwork-io/terratest v0.28.15 h1:in1DRBq8/RjxMyb6Amr1SRrczOK/hGnPi+ github.com/gruntwork-io/terratest v0.28.15/go.mod h1:PkVylPuUNmItkfOTwSiFreYA4FkanK8AluBuNeGxQOw= github.com/gruntwork-io/terratest v0.32.8 h1:ccIRFH+e6zhSB5difg7baJec4FeOZNXpeIFlZZlKW2M= github.com/gruntwork-io/terratest v0.32.8/go.mod h1:FckR+7ks472IJfSKUPfPvnJfSxV1LKGWGMJ9m/LHegE= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl/v2 v2.8.2 h1:wmFle3D1vu0okesm8BTLVDyJ6/OL9DCLUwn0b2OptiY= github.com/hashicorp/hcl/v2 v2.8.2/go.mod h1:bQTN5mpo+jewjJgh8jr0JUguIi7qPHUF6yIfAEN3jqY= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o= github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= @@ -267,6 +275,7 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -357,6 +366,7 @@ github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6Ac github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/zclconf/go-cty v1.2.0 h1:sPHsy7ADcIZQP3vILvTjrh74ZA175TFP5vqiNK1UmlI= github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= @@ -476,6 +486,7 @@ golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fq golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/versions.tf b/versions.tf index 678142c..5b2c49b 100644 --- a/versions.tf +++ b/versions.tf @@ -1,5 +1,5 @@ terraform { - required_version = ">= 0.14.0" + required_version = ">= 0.13.0" required_providers { aws = {