Terraform Variables

setup.tf

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

  backend "s3" {
    region         = "eu-west-2"
    bucket         = "statefiles"
    key            = "tsg/plan-apply.tfstate"
    dynamodb_table = "tsg-plan-apply-lockfiles"
  }
}

variables.tf

variable "regionName"{
  description = "Key for looking up region code"
  type = string
  default = "London"
}

variable "aws_region" {
  type = map    # Note! TF variable type lower case
  default = {
    "Dublin"   = "eu-west-1"
    "London"   = "eu-west-2"
    "Broadway" = "eu-west-6"
  }
}

resource "aws_ssm_parameter" "regioncode" {
  name  = "region_code"
  type  = "String"   # NOTE! Quotes + Capital - AWS resource Type
  value = var.aws_region[var.regionName]
}


variable "iterator" {
  type = number  # NOTE! just word for Terraform var type
  default = 1
  description = "iterator"
}

variable "cidr_blocks" {
  description = "CIDR blocks"
  type = list(string)
  default = [
    "192.168.100.0/24",
    "192.168.101.0/24",
    "192.168.102.0/24",
  ]
}

resource "aws_ssm_parameter" "cidr_block" {
  name = "CIDR_block"
  type = "String"
  value = var.cidr_blocks[var.iterator]  # 0 is 1st position
}

data-variables.tf

data "aws_iam_policy" "common_pb" {
  name = "pb-Common"
}

resource "aws_ssm_parameter" "permissionsboundary" {
  name = "PermissionsBoundaryARN"
  type = "String"
  value = data.aws_iam_policy.common_pb.arn
}

parameters.tf

resource "aws_ssm_parameter" "just_a_parameter" {
  name = "just_a_parameter"
  type = "String"
  description = "Just a test"
  tags = {
    email = "andrew.2.stringer@bt.com"
  }
  value = "random_value"
}

resource "aws_ssm_parameter" "SaiSecureRepoSourceBucket" {
  name = "SaiSecureRepoSourceBucket"
  type = "String"
  value = jsonencode(file("buckets.json"))
}

buckets.json

{
    "secure_repo_centos":  "sai-secure-repo-development",
    "secure_repo_rocky":   "rocky_secure_repo_bucket",
    "secure_repo_ubuntu":  "ubuntu-secure-repo-bucket"
}

copy_file.py

import json
import boto3
 
# Paths to parameters in Parameter store.
Parameter_source_bucket = 'SaiSecureRepoSourceBucket'
 
def read_parameter(parameter):
    parameter_client = boto3.client('ssm')
    if not parameter:
        sys.exit("read_parameter variable 'parameter' is not set, so exiting.")
    parameter_response = parameter_client.get_parameter(
        Name=parameter,
    )
    if not parameter_response:
        sys.exit("Parameter Store value is not set, so exiting.")
    logger.debug('Value of %s is %s', parameter, parameter_response['Parameter']['Value'])
    return parameter_response
 
def handler(event, context):
 
    # username and filename are now invoked through event data, this will be supplied
    # from the cli invocation, test event example below:-
    """{
    "filename": "1008926332-catbert.gif",
    "user_name": "secure_repo_centos/rocky/ubuntu (etc...)", 
    "bucket_ref": "secure_repo_centos"
    }"""
    # Just for testing
    event = {
        "user_name": "secure_repo_ubuntu",
        "filename": "1008926332-catbert.gif",
        "bucket_ref": "secure_repo_ubuntu"
    }
 
    # 'bucket_ref' (from event data) is used as a key to select the value from the
    # returned Parameter Store dictionary.
    # This is done to allow a user to control which bucket is used for upload
    # whilst not allowing an arbitrary bucket to be specified, or allowing users access to Parameter Store.
    # This is designed to prevent an unauthorised bucket being used as the source.
    username = event['user_name']
    file_to_copy = event['filename']
    bucket_ref = event['bucket_ref']
 
    source_bucket_raw = read_parameter(Parameter_source_bucket)
 
    # Parameter store returns strings, need to convert to dict.
    source_bucket_dict = json.loads(source_bucket_raw['Parameter']['Value'])
    source_bucket = source_bucket_dict[bucket_ref]
    print("Source Bucket is:-", source_bucket)
 
terraform/terraform-variables.txt · Last modified: 21/12/2022 14:48 by andrew