I am new to terraform and trying out few things.
here is my script.
resource "aws_s3_bucket" "abt_tfstate" {
bucket = "abt-tfstate"
# acl = "private"
}
resource "aws_s3_bucket_acl" "abt_acl" {
bucket = aws_s3_bucket.abt_tfstate.id
acl = "private"
}
resource "aws_s3_bucket_object" "s3_object_DevQa" {
bucket = aws_s3_bucket.abt_tfstate.id
for_each = fileset("C:\\Users\\SHETTSX18\\Desktop\\Terraform\\S3_bucket\\statefiles\\DevQa","*")
key = "${var.folder_name_dev}/${each.value}"
source = "C:\\Users\\SHETTSX18\\Desktop\\Terraform\\S3_bucket\\statefiles\\DevQa\\${each.value}"
}
resource "aws_s3_bucket_object" "s3_object_Prod" {
bucket = aws_s3_bucket.abt_tfstate.id
for_each = fileset("C:\\Users\\SHETTSX18\\Desktop\\Terraform\\S3_bucket\\statefiles\\Prod","*")
key = "${var.folder_name_prod}/${each.value}"
source = "C:\\Users\\SHETTSX18\\Desktop\\Terraform\\S3_bucket\\statefiles\\Prod\\${each.value}"
}
here is my variable file:
variable "folder_name_dev" {
type = string
default = "DevQa"
}
variable "folder_name_prod" {
type = string
default = "Prod"
}
for some reason only the s3_object_DevQa is being populating into the S3 bucket and there is no object with s3_object_Prod.
Also I would like to handle the variable in a single variable may be like folder_name. Not able to figure these two things out.
Could you please help me out with this?
CodePudding user response:
For the first point, I would use the resource 'aws_s3_object'.
This configuration seemed to work:
resource "aws_s3_bucket" "abt_tfstate" {
bucket = "lt-abt-tfstate"
}
resource "aws_s3_bucket_acl" "abt_acl" {
bucket = aws_s3_bucket.abt_tfstate.id
acl = "private"
}
resource "aws_s3_object" "s3_object_DevQa" {
bucket = aws_s3_bucket.abt_tfstate.id
for_each = fileset("DevQa/","*")
key = "${var.folder_name_dev}/${each.value}"
source = "DevQa/${each.value}"
}
resource "aws_s3_object" "s3_object_Prod" {
bucket = aws_s3_bucket.abt_tfstate.id
for_each = fileset("Prod/","*")
key = "${var.folder_name_prod}/${each.value}"
source = "Prod/${each.value}"
}
Now to refactor this so you can use a single 'folder_name' variable for both 'DevQa' and 'Prod', you could move the objects into a reusable module.
├── DevQa
│ ├── hello1
│ └── hello2
├── Prod
│ ├── hello3
│ └── hello4
├── backend.tf
├── main.tf
├── modules
│ └── s3_objects
│ ├── outputs.tf
│ ├── resources.tf
│ └── variables.tf
├── resources.tf
└── variables.tf
./variables.tf:
variable "region" {
type = string
description = "AWS Region"
default = "eu-west-1"
}
./resources.tf:
resource "aws_s3_bucket" "abt_tfstate" {
bucket = "abt-tfstate-20220822"
}
resource "aws_s3_bucket_acl" "abt_acl" {
bucket = aws_s3_bucket.abt_tfstate.id
acl = "private"
}
module "abt_tfstate_objects_dev" {
source = "modules/s3_objects"
folder_name = "DevQa"
}
module "abt_tfstate_objects_prd" {
source = "modules/s3_objects"
folder_name = "Prod"
}
modules/s3_objects/variables.tf:
variable "folder_name" {
type = string
description = "The folder name for the environment. Can be DevQa or Prod."
}
modules/s3_objects/resources.tf:
resource "aws_s3_object" "s3_object" {
bucket = aws_s3_bucket.abt_tfstate.id
for_each = fileset("${var.folder_name}/","*")
key = "${var.folder_name}/${each.value}"
source = "${var.folder_name}/${each.value}"
}
