As part of the upgrading from v3 to v4 of the Terraform AWS Provider, I needed to see all the places where I needed to do
some work. The standard ouput from Terraform doesn't show all the places where work is required. But, luckily, using the
-json option, you get access to all of the information.
The following shell script (written and tested in bash, but should be OK as really, it's only terraform, jq, column,
and | that's being used) will output a nicely formatted table showing you the
terraform validate -json | jq -r '
# Create an array of objects from the following logic
[
# Delete any diagnostics whose detail starts with "Experimental features"
del(.diagnostics[] | select(.detail | startswith("Experimental features")))
|
# Extract just the diagnostics that remain
.diagnostics[]
|
# Extract the required elements from each diagnostic into an object
{Detail:.detail, Address:.address, Filename:.range.filename, Line:.range.start.line}
]
|
if (.[0] | length) == 0 then
"No validation issues"
else
# Generate the column headings for the resultant table.
(
# Use the first diagnostic
.[0]
|
# Get the keys in their defined order
keys_unsorted
|
# For each key, create an underline and have these underlines in a new array (so, keys, then underlines).
(
.,
map(length*"-")
)
),
# Join on the diagnostics to the set of column headings.
.[]
|
# Get just the values.
map(.)
|
# Output everything using tab separation which is the picked up by the column command that follows to make a nice
# tabular output.
@tsv
end
' | column -ts $'\t' This script will output something resembling this.
Detail Address Filename Line
------ ------- -------- ----
Use the aws_s3_bucket_website_configuration resource instead module.api_doc_website.aws_s3_bucket.cf_s3_bucket modules/cf_s3_website/main.tf 45
Use the aws_s3_bucket_cors_configuration resource instead module.api_doc_website.aws_s3_bucket.cf_s3_bucket modules/cf_s3_website/main.tf 45
Use the aws_s3_bucket_server_side_encryption_configuration resource instead module.api_doc_website.aws_s3_bucket.cf_s3_bucket modules/cf_s3_website/main.tf 45
Use the aws_s3_bucket_server_side_encryption_configuration resource instead module.beta_epos_website.aws_s3_bucket.cf_s3_bucket modules/cf_s3_website/main.tf 45
Use the aws_s3_bucket_cors_configuration resource instead module.beta_epos_website.aws_s3_bucket.cf_s3_bucket modules/cf_s3_website/main.tf 45
Use the aws_s3_bucket_website_configuration resource instead module.beta_epos_website.aws_s3_bucket.cf_s3_bucket modules/cf_s3_website/main.tf 45
Use the aws_s3_bucket_server_side_encryption_configuration resource instead aws_s3_bucket.userfiles_bucket s3.tf 1
Use the aws_s3_bucket_acl resource instead aws_s3_bucket.userfiles_bucket s3.tf 3
Use the aws_s3_bucket_server_side_encryption_configuration resource instead module.epos_website.aws_s3_bucket.cf_s3_bucket modules/cf_s3_website/main.tf 45
Use the aws_s3_bucket_cors_configuration resource instead module.epos_website.aws_s3_bucket.cf_s3_bucket modules/cf_s3_website/main.tf 45
Use the aws_s3_bucket_website_configuration resource instead module.epos_website.aws_s3_bucket.cf_s3_bucket modules/cf_s3_website/main.tf 45
Use the aws_s3_bucket_cors_configuration resource instead module.queue_assets_website.aws_s3_bucket.cf_s3_bucket modules/cf_s3_website/main.tf 45
Use the aws_s3_bucket_website_configuration resource instead module.queue_assets_website.aws_s3_bucket.cf_s3_bucket modules/cf_s3_website/main.tf 45
Use the aws_s3_bucket_server_side_encryption_configuration resource instead module.queue_assets_website.aws_s3_bucket.cf_s3_bucket modules/cf_s3_website/main.tf 45