Skip to content

Commit 31f84ac

Browse files
authored
Merge pull request #75 from trussworks/aws-4
Provide an upgrade path to AWS provider 4.0
2 parents d87e3ef + 81d7ed2 commit 31f84ac

File tree

5 files changed

+75
-15
lines changed

5 files changed

+75
-15
lines changed

.pre-commit-config.yaml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
repos:
2-
- repo: git://github.com/pre-commit/pre-commit-hooks
3-
rev: v3.4.0
2+
- repo: https://github.com/pre-commit/pre-commit-hooks
3+
rev: v4.2.0
44
hooks:
55
- id: check-merge-conflict
66
- id: check-yaml
77
- id: detect-private-key
88
- id: trailing-whitespace
99

10-
- repo: git://github.com/igorshubovych/markdownlint-cli
11-
rev: v0.27.1
10+
- repo: https://github.com/igorshubovych/markdownlint-cli
11+
rev: v0.31.1
1212
hooks:
1313
- id: markdownlint
1414

15-
- repo: git://github.com/antonbabenko/pre-commit-terraform
16-
rev: v1.48.0
15+
- repo: https://github.com/antonbabenko/pre-commit-terraform
16+
rev: v1.71.0
1717
hooks:
18-
- id: terraform_fmt
18+
- id: terraform_fmt

README.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,50 @@ terraform {
138138

139139
## Upgrade Path
140140

141+
### Release v3.0.0
142+
143+
Version 3.x.x enables the use of version 4 of the AWS provider. Terraform provided [an upgrade path](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade) for this. To support the upgrade path, this module now includes the following additional resources:
144+
145+
* `module.terraform_state_bucket.aws_s3_bucket_policy.private_bucket`
146+
* `module.terraform_state_bucket.aws_s3_bucket_acl.private_bucket`
147+
* `module.terraform_state_bucket.aws_s3_bucket_versioning.private_bucket`
148+
* `module.terraform_state_bucket.aws_s3_bucket_lifecycle_configuration.private_bucket`
149+
* `module.terraform_state_bucket.aws_s3_bucket_logging.private_bucket`
150+
* `module.terraform_state_bucket.aws_s3_bucket_server_side_encryption_configuration.private_bucket`
151+
* `module.terraform_state_bucket_logs.aws_s3_bucket_policy.aws_logs`
152+
* `module.terraform_state_bucket_logs.aws_s3_bucket_acl.aws_logs`
153+
* `module.terraform_state_bucket_logs.aws_s3_bucket_lifecycle_configuration.aws_logs`
154+
* `module.terraform_state_bucket_logs.aws_s3_bucket_server_side_encryption_configuration.aws_logs`
155+
* `module.terraform_state_bucket_logs.aws_s3_bucket_logging.aws_logs`
156+
* `module.terraform_state_bucket_logs.aws_s3_bucket_versioning.aws_logs`
157+
158+
This module version changes the `log_bucket_versioning` variable from a boolean to a string. There are three possible values for this variable: `Enabled`, `Disabled`, and `Suspended`. If at one point versioning was enabled on your bucket, but has since been turned off, you will need to set `log_bucket_versioning` to `Suspended` rather than `Disabled`.
159+
160+
Additionally, this version of the module requires a minimum AWS provider version of 3.75, so that you can remain on the 3.x AWS provider while still gaining the ability to utilize the new S3 resources introduced in the 4.x AWS provider.
161+
162+
There are two general approaches to performing this upgrade:
163+
164+
1. Upgrade the module version and run `terraform plan` followed by `terraform apply`, which will create the new Terraform resources.
165+
1. Perform `terraform import` commands, which accomplishes the same thing without running `terraform apply`. This is the more cautious route.
166+
167+
If you choose to take the route of running `terraform import`, you will need to perform the following imports. Replace `example` with the name you're using when calling this module and replace `your-bucket-name-here` with the name of your bucket (as opposed to an S3 bucket ARN). Replace `your-logging-bucket-name-here` with the name of your logging bucket. Also note the inclusion of `,private` when importing the new `module.terraform_state_bucket.aws_s3_bucket_acl.private_bucket` Terraform resource and the inclusion of `,log-delivery-write` when importing the new `module.terraform_state_bucket_logs.aws_s3_bucket_acl.aws_logs` Terraform resource.
168+
169+
```sh
170+
terraform import module.example.module.terraform_state_bucket.aws_s3_bucket_policy.private_bucket your-bucket-name-here
171+
terraform import module.example.module.terraform_state_bucket.aws_s3_bucket_acl.private_bucket your-bucket-name-here,private
172+
terraform import module.example.module.terraform_state_bucket.aws_s3_bucket_versioning.private_bucket your-bucket-name-here
173+
terraform import module.example.module.terraform_state_bucket.aws_s3_bucket_lifecycle_configuration.private_bucket your-bucket-name-here
174+
terraform import module.example.module.terraform_state_bucket.aws_s3_bucket_server_side_encryption_configuration.private_bucket your-bucket-name-here
175+
terraform import 'module.example.module.terraform_state_bucket.aws_s3_bucket_logging.private_bucket[0]' your-bucket-name-here
176+
terraform import module.example.module.terraform_state_bucket_logs.aws_s3_bucket_policy.aws_logs your-logging-bucket-name-here
177+
terraform import module.example.module.terraform_state_bucket_logs.aws_s3_bucket_acl.aws_logs your-logging-bucket-name-here,log-delivery-write
178+
terraform import module.example.module.terraform_state_bucket_logs.aws_s3_bucket_lifecycle_configuration.aws_logs your-logging-bucket-name-here
179+
terraform import module.example.module.terraform_state_bucket_logs.aws_s3_bucket_server_side_encryption_configuration.aws_logs your-logging-bucket-name-here
180+
terraform import module.example.module.terraform_state_bucket_logs.aws_s3_bucket_versioning.aws_logs your-logging-bucket-name-here
181+
```
182+
183+
After this, you will need to run a `terraform plan` and `terraform apply` to apply some non-functional changes to lifecycle rule IDs.
184+
141185
### Release v2.0.0
142186

143187
When upgrading from v1.6.1 to v2.0.0 the terraform state must be modified to move the account alias resource:

main.tf

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,19 @@ resource "aws_iam_account_alias" "alias" {
1414

1515
module "terraform_state_bucket" {
1616
source = "trussworks/s3-private-bucket/aws"
17-
version = "~> 3.7.0"
17+
version = "~> 4.0.0"
1818

1919
bucket = local.state_bucket
20-
logging_bucket = module.terraform_state_bucket_logs.aws_logs_bucket
20+
logging_bucket = local.logging_bucket
2121

2222
use_account_alias_prefix = false
2323

2424
enable_s3_public_access_block = var.enable_s3_public_access_block
2525
tags = var.state_bucket_tags
26+
27+
depends_on = [
28+
module.terraform_state_bucket_logs
29+
]
2630
}
2731

2832
#
@@ -31,12 +35,14 @@ module "terraform_state_bucket" {
3135

3236
module "terraform_state_bucket_logs" {
3337
source = "trussworks/logs/aws"
34-
version = "~> 11.0.0"
38+
version = "~> 13.0.0"
3539

3640
s3_bucket_name = local.logging_bucket
3741
default_allow = false
3842
s3_log_bucket_retention = var.log_retention
39-
enable_versioning = var.log_bucket_versioning
43+
versioning_status = var.log_bucket_versioning
44+
45+
tags = var.log_bucket_tags
4046
}
4147

4248
#

variables.tf

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,13 @@ variable "log_name" {
4242
}
4343

4444
variable "log_bucket_versioning" {
45-
description = "Bool for toggling versioning for log bucket"
46-
type = bool
47-
default = false
45+
description = "A string that indicates the versioning status for the log bucket."
46+
default = "Disabled"
47+
type = string
48+
validation {
49+
condition = contains(["Enabled", "Disabled", "Suspended"], var.log_bucket_versioning)
50+
error_message = "Valid values for versioning_status are Enabled, Disabled, or Suspended."
51+
}
4852
}
4953

5054
variable "state_bucket_tags" {
@@ -53,6 +57,12 @@ variable "state_bucket_tags" {
5357
description = "Tags to associate with the bucket storing the Terraform state files"
5458
}
5559

60+
variable "log_bucket_tags" {
61+
type = map(string)
62+
default = { Automation : "Terraform" }
63+
description = "Tags to associate with the bucket storing the Terraform state bucket logs"
64+
}
65+
5666
variable "enable_s3_public_access_block" {
5767
description = "Bool for toggling whether the s3 public access block resource should be enabled."
5868
type = bool

versions.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ terraform {
22
required_version = ">= 0.13.0"
33

44
required_providers {
5-
aws = ">= 3.0, < 4.0"
5+
aws = ">= 3.75.0"
66
}
77
}

0 commit comments

Comments
 (0)