mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-30 13:10:47 +00:00
terrform files
This commit is contained in:
parent
95dff50455
commit
507ecfb8a1
6 changed files with 170 additions and 24 deletions
|
|
@ -1,3 +1,30 @@
|
||||||
|
# ==============================================================================
|
||||||
|
# TEMPLATE: Lambda Configuration with Optional S3 IAM Policy
|
||||||
|
# ==============================================================================
|
||||||
|
# Instructions:
|
||||||
|
# 1. Replace "REPLACE ME" with your lambda name (e.g., "my-lambda-name")
|
||||||
|
# 2. Add any additional environment variables as needed
|
||||||
|
# 3. To attach S3 IAM policies from shared state:
|
||||||
|
# - Uncomment the S3 policy attachment section below
|
||||||
|
# - Update the policy_arn to match the output from shared/main.tf
|
||||||
|
# - Available shared outputs (examples):
|
||||||
|
# - data.terraform_remote_state.shared.outputs.condition_etl_s3_read_arn
|
||||||
|
# - data.terraform_remote_state.shared.outputs.postcode_splitter_s3_read_arn
|
||||||
|
# 4. To create a NEW S3 policy:
|
||||||
|
# - Add a new module "lambda_s3_policy" in shared/main.tf using the
|
||||||
|
# s3_iam_policy module (see examples in shared/main.tf)
|
||||||
|
# - Then reference it here using data.terraform_remote_state.shared.outputs
|
||||||
|
# ==============================================================================
|
||||||
|
|
||||||
|
data "terraform_remote_state" "shared" {
|
||||||
|
backend = "s3"
|
||||||
|
config = {
|
||||||
|
bucket = "assessment-model-terraform-state"
|
||||||
|
key = "env:/${var.stage}/terraform.tfstate"
|
||||||
|
region = "eu-west-2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module "lambda" {
|
module "lambda" {
|
||||||
source = "../modules/lambda_with_sqs"
|
source = "../modules/lambda_with_sqs"
|
||||||
|
|
||||||
|
|
@ -12,3 +39,25 @@ module "lambda" {
|
||||||
LOG_LEVEL = "info"
|
LOG_LEVEL = "info"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ======================================================================
|
||||||
|
# OPTIONAL: Attach S3 IAM policy to Lambda execution role
|
||||||
|
# ======================================================================
|
||||||
|
# Uncomment and configure the resource below to attach S3 permissions
|
||||||
|
#
|
||||||
|
# Example 1: Attach existing policy from shared state
|
||||||
|
# resource "aws_iam_role_policy_attachment" "lambda_s3_policy" {
|
||||||
|
# role = module.lambda.lambda_role_name
|
||||||
|
# policy_arn = data.terraform_remote_state.shared.outputs.YOUR_POLICY_OUTPUT_NAME_arn
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# Example 2: Attach multiple policies
|
||||||
|
# resource "aws_iam_role_policy_attachment" "lambda_read_policy" {
|
||||||
|
# role = module.lambda.lambda_role_name
|
||||||
|
# policy_arn = data.terraform_remote_state.shared.outputs.postcode_splitter_s3_read_arn
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# resource "aws_iam_role_policy_attachment" "lambda_write_policy" {
|
||||||
|
# role = module.lambda.lambda_role_name
|
||||||
|
# policy_arn = data.terraform_remote_state.shared.outputs.another_policy_arn
|
||||||
|
# }
|
||||||
|
|
|
||||||
|
|
@ -33,3 +33,9 @@ module "lambda" {
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Attach S3 read policy to the Lambda execution role
|
||||||
|
resource "aws_iam_role_policy_attachment" "postcode_splitter_s3_read" {
|
||||||
|
role = module.lambda.lambda_role_name
|
||||||
|
policy_arn = data.terraform_remote_state.shared.outputs.postcode_splitter_s3_read_arn
|
||||||
|
}
|
||||||
29
infrastructure/terraform/modules/s3_iam_policy/main.tf
Normal file
29
infrastructure/terraform/modules/s3_iam_policy/main.tf
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
# Dynamically build S3 resources list from bucket ARNs and resource paths
|
||||||
|
locals {
|
||||||
|
# Generate full resource ARNs by combining bucket ARNs with resource paths
|
||||||
|
resources = flatten([
|
||||||
|
for bucket_arn in var.bucket_arns : [
|
||||||
|
for path in var.resource_paths : "${bucket_arn}${path}"
|
||||||
|
]
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
# IAM Policy with dynamic actions and resources
|
||||||
|
resource "aws_iam_policy" "s3_policy" {
|
||||||
|
name = var.policy_name
|
||||||
|
description = var.policy_description
|
||||||
|
|
||||||
|
policy = jsonencode({
|
||||||
|
Version = "2012-10-17"
|
||||||
|
Statement = [
|
||||||
|
{
|
||||||
|
Effect = "Allow"
|
||||||
|
Action = var.actions
|
||||||
|
Resource = local.resources
|
||||||
|
Condition = var.conditions != null ? var.conditions : null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
tags = var.tags
|
||||||
|
}
|
||||||
14
infrastructure/terraform/modules/s3_iam_policy/outputs.tf
Normal file
14
infrastructure/terraform/modules/s3_iam_policy/outputs.tf
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
output "policy_arn" {
|
||||||
|
description = "ARN of the S3 IAM policy"
|
||||||
|
value = aws_iam_policy.s3_policy.arn
|
||||||
|
}
|
||||||
|
|
||||||
|
output "policy_name" {
|
||||||
|
description = "Name of the S3 IAM policy"
|
||||||
|
value = aws_iam_policy.s3_policy.name
|
||||||
|
}
|
||||||
|
|
||||||
|
output "policy_id" {
|
||||||
|
description = "ID of the S3 IAM policy"
|
||||||
|
value = aws_iam_policy.s3_policy.id
|
||||||
|
}
|
||||||
39
infrastructure/terraform/modules/s3_iam_policy/variables.tf
Normal file
39
infrastructure/terraform/modules/s3_iam_policy/variables.tf
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
variable "policy_name" {
|
||||||
|
description = "Name of the IAM policy"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "policy_description" {
|
||||||
|
description = "Description of the IAM policy"
|
||||||
|
type = string
|
||||||
|
default = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "bucket_arns" {
|
||||||
|
description = "List of S3 bucket ARNs to grant access to"
|
||||||
|
type = list(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "actions" {
|
||||||
|
description = "List of S3 actions to allow (e.g., ['s3:GetObject'], ['s3:PutObject'], ['s3:DeleteObject'])"
|
||||||
|
type = list(string)
|
||||||
|
default = ["s3:GetObject"]
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "resource_paths" {
|
||||||
|
description = "List of resource paths within buckets (e.g., ['/*'] for all objects, ['/specific-prefix/*'] for specific prefix)"
|
||||||
|
type = list(string)
|
||||||
|
default = ["/*"]
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "conditions" {
|
||||||
|
description = "Optional IAM policy conditions to apply to the statement"
|
||||||
|
type = any
|
||||||
|
default = null
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "tags" {
|
||||||
|
description = "Tags to apply to the policy"
|
||||||
|
type = map(string)
|
||||||
|
default = {}
|
||||||
|
}
|
||||||
|
|
@ -321,6 +321,28 @@ module "condition_etl_registry" {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Condition Data S3 Bucket to store initial data
|
||||||
|
module "condition_data_bucket" {
|
||||||
|
source = "../modules/s3"
|
||||||
|
bucketname = "condition-data-${var.stage}"
|
||||||
|
allowed_origins = var.allowed_origins
|
||||||
|
}
|
||||||
|
|
||||||
|
module "condition_etl_s3_read" {
|
||||||
|
source = "../modules/s3_iam_policy"
|
||||||
|
|
||||||
|
policy_name = "ConditionETLReadS3"
|
||||||
|
policy_description = "Allow Lambda to read objects from condition-data-${var.stage}"
|
||||||
|
bucket_arns = ["arn:aws:s3:::condition-data-${var.stage}"]
|
||||||
|
actions = ["s3:GetObject"]
|
||||||
|
resource_paths = ["/*"]
|
||||||
|
}
|
||||||
|
|
||||||
|
output "condition_etl_s3_read_arn" {
|
||||||
|
value = module.condition_etl_s3_read.policy_arn
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
################################################
|
################################################
|
||||||
# Postcode Splitter – Lambda ECR
|
# Postcode Splitter – Lambda ECR
|
||||||
################################################
|
################################################
|
||||||
|
|
@ -337,30 +359,17 @@ module "postcode_splitter_registry" {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
################################################
|
# S3 policy for postcode splitter to read from retrofit data bucket
|
||||||
# Conidition data – S3 bucket
|
module "postcode_splitter_s3_read" {
|
||||||
################################################
|
source = "../modules/s3_iam_policy"
|
||||||
module "condition_data_bucket" {
|
|
||||||
source = "../modules/s3"
|
policy_name = "PostcodeSplitterReadS3"
|
||||||
bucketname = "condition-data-${var.stage}"
|
policy_description = "Allow postcode splitter Lambda to read from retrofit-data bucket"
|
||||||
allowed_origins = var.allowed_origins
|
bucket_arns = ["arn:aws:s3:::retrofit-data-${var.stage}"]
|
||||||
|
actions = ["s3:GetObject"]
|
||||||
|
resource_paths = ["/*"]
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "aws_iam_policy" "condition_etl_s3_read" {
|
output "postcode_splitter_s3_read_arn" {
|
||||||
name = "ConditionETLReadS3"
|
value = module.postcode_splitter_s3_read.policy_arn
|
||||||
description = "Allow Lambda to read objects from condition-data-${var.stage}"
|
|
||||||
policy = jsonencode({
|
|
||||||
Version = "2012-10-17"
|
|
||||||
Statement = [
|
|
||||||
{
|
|
||||||
Effect = "Allow"
|
|
||||||
Action = ["s3:GetObject"]
|
|
||||||
Resource = "arn:aws:s3:::condition-data-${var.stage}/*"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
output "condition_etl_s3_read_arn" {
|
|
||||||
value = aws_iam_policy.condition_etl_s3_read.arn
|
|
||||||
}
|
}
|
||||||
Loading…
Add table
Reference in a new issue