Skip to content

Commit 7852907

Browse files
authored
Allow-all-deparments-to-create-catalog-tables-via-the-manual-bucket (#2583)
* allow all departments to create catalog tables via the manual bucket * correct the parking database module name and add the bucket and kms key arn to redshift module * add revenues
1 parent 3848ba9 commit 7852907

File tree

5 files changed

+65
-22
lines changed

5 files changed

+65
-22
lines changed

terraform/etl/42-redshift.tf

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ module "redshift" {
1010
refined_zone_bucket_arn = module.refined_zone_data_source.bucket_arn
1111
trusted_zone_bucket_arn = module.trusted_zone_data_source.bucket_arn
1212
raw_zone_bucket_arn = module.raw_zone_data_source.bucket_arn
13+
user_uploads_bucket_arn = module.user_uploads_data_source.bucket_arn
1314
landing_zone_kms_key_arn = module.landing_zone_data_source.kms_key_arn
1415
raw_zone_kms_key_arn = module.raw_zone_data_source.kms_key_arn
1516
refined_zone_kms_key_arn = module.refined_zone_data_source.kms_key_arn
1617
trusted_zone_kms_key_arn = module.trusted_zone_data_source.kms_key_arn
18+
user_uploads_kms_key_arn = module.user_uploads_data_source.kms_key_arn
1719
secrets_manager_key = data.aws_kms_key.secrets_manager_key.arn
1820
additional_iam_roles = local.is_production_environment ? [] : [aws_iam_role.parking_redshift_copier[0].arn]
1921
}
@@ -48,7 +50,7 @@ locals {
4850
replace(module.department_parking_data_source.refined_zone_catalog_database_name, "-", "_") = module.department_parking_data_source.refined_zone_catalog_database_name,
4951
replace(module.department_parking_data_source.trusted_zone_catalog_database_name, "-", "_") = module.department_parking_data_source.trusted_zone_catalog_database_name,
5052
replace("parking-ringgo-sftp-raw-zone", "-", "_") = "parking-ringgo-sftp-raw-zone",
51-
replace(aws_glue_catalog_database.parking_user_uploads.name, "-", "_") = aws_glue_catalog_database.parking_user_uploads.name,
53+
replace(aws_glue_catalog_database.department_user_uploads["parking"].name, "-", "_") = aws_glue_catalog_database.department_user_uploads["parking"].name,
5254

5355
replace(module.department_finance_data_source.raw_zone_catalog_database_name, "-", "_") = module.department_finance_data_source.raw_zone_catalog_database_name,
5456
replace(module.department_finance_data_source.refined_zone_catalog_database_name, "-", "_") = module.department_finance_data_source.refined_zone_catalog_database_name,
@@ -127,7 +129,7 @@ locals {
127129
"liberator_refined_zone",
128130
replace(module.department_parking_data_source.trusted_zone_catalog_database_name, "-", "_"),
129131
replace("parking-ringgo-sftp-raw-zone", "-", "_"),
130-
replace(aws_glue_catalog_database.parking_user_uploads.name, "-", "_"),
132+
replace(aws_glue_catalog_database.department_user_uploads["parking"].name, "-", "_"),
131133
], local.unrestricted_schemas)
132134
},
133135
{
@@ -311,7 +313,7 @@ locals {
311313
"liberator_refined_zone",
312314
replace(module.department_parking_data_source.trusted_zone_catalog_database_name, "-", "_"),
313315
replace("parking-ringgo-sftp-raw-zone", "-", "_"),
314-
replace(aws_glue_catalog_database.parking_user_uploads.name, "-", "_")
316+
replace(aws_glue_catalog_database.department_user_uploads["parking"].name, "-", "_")
315317
]
316318
roles_to_inherit_permissions_from = [
317319
local.unrestricted_data_role_name

terraform/etl/61-aws-glue-catalog-database.tf

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,22 @@ resource "aws_glue_catalog_database" "arcus_archive" {
8686
}
8787
}
8888

89-
resource "aws_glue_catalog_database" "parking_user_uploads" {
90-
name = "parking_user_uploads_db"
89+
locals {
90+
department_user_uploads_databases = {
91+
parking = "parking_user_uploads_db"
92+
housing = "housing_user_uploads_db"
93+
data_and_insight = "data_and_insight_user_uploads_db"
94+
child_fam_services = "child_fam_services_user_uploads_db"
95+
unrestricted = "unrestricted_user_uploads_db"
96+
env_services = "env_services_user_uploads_db"
97+
revenues = "revenues_user_uploads_db"
98+
}
99+
}
100+
101+
resource "aws_glue_catalog_database" "department_user_uploads" {
102+
for_each = local.department_user_uploads_databases
103+
104+
name = each.value
91105

92106
lifecycle {
93107
prevent_destroy = true

terraform/etl/62-lambda-csv-to-glue-catalog.tf

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
11
# Lambda function to automatically create/delete Glue Catalog tables
22
# Workflow: S3 CSV upload/delete → SQS → Lambda → Glue Catalog table create/delete (retry once on failure → DLQ)
33

4+
locals {
5+
department_user_uploads_prefixes = {
6+
parking = "parking/"
7+
housing = "housing/"
8+
data_and_insight = "data-and-insight/"
9+
child_fam_services = "child-fam-services/"
10+
unrestricted = "unrestricted/"
11+
env_services = "env-services/"
12+
revenues = "revenues/"
13+
}
14+
}
15+
416
data "aws_iam_policy_document" "csv_to_glue_catalog_lambda_assume_role" {
517
statement {
618
actions = ["sts:AssumeRole"]
@@ -34,12 +46,11 @@ data "aws_iam_policy_document" "csv_to_glue_catalog_lambda_execution" {
3446
"glue:GetPartitions",
3547
"glue:DeletePartition",
3648
]
37-
# Currently only scoped to parking
38-
resources = [
39-
"arn:aws:glue:${data.aws_region.current.name}:${data.aws_caller_identity.data_platform.account_id}:catalog",
40-
"arn:aws:glue:${data.aws_region.current.name}:${data.aws_caller_identity.data_platform.account_id}:database/parking_user_uploads_db",
41-
"arn:aws:glue:${data.aws_region.current.name}:${data.aws_caller_identity.data_platform.account_id}:table/parking_user_uploads_db/*",
42-
]
49+
resources = concat(
50+
["arn:aws:glue:${data.aws_region.current.name}:${data.aws_caller_identity.data_platform.account_id}:catalog"],
51+
[for db_name in values(local.department_user_uploads_databases) : "arn:aws:glue:${data.aws_region.current.name}:${data.aws_caller_identity.data_platform.account_id}:database/${db_name}"],
52+
[for db_name in values(local.department_user_uploads_databases) : "arn:aws:glue:${data.aws_region.current.name}:${data.aws_caller_identity.data_platform.account_id}:table/${db_name}/*"]
53+
)
4354
}
4455

4556
statement {
@@ -177,11 +188,14 @@ resource "aws_sqs_queue_policy" "csv_to_glue_catalog_events" {
177188
resource "aws_s3_bucket_notification" "user_uploads_csv_notification" {
178189
bucket = module.user_uploads_data_source.bucket_id
179190

180-
queue {
181-
queue_arn = aws_sqs_queue.csv_to_glue_catalog_events.arn
182-
events = ["s3:ObjectCreated:*", "s3:ObjectRemoved:*"]
183-
filter_prefix = "parking/" # Currently only scoped to parking
184-
filter_suffix = ".csv"
191+
dynamic "queue" {
192+
for_each = local.department_user_uploads_prefixes
193+
content {
194+
queue_arn = aws_sqs_queue.csv_to_glue_catalog_events.arn
195+
events = ["s3:ObjectCreated:*", "s3:ObjectRemoved:*"]
196+
filter_prefix = queue.value
197+
filter_suffix = ".csv"
198+
}
185199
}
186200

187201
depends_on = [aws_sqs_queue_policy.csv_to_glue_catalog_events]

terraform/modules/redshift/01-inputs-required.tf

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,13 @@ variable "secrets_manager_key" {
6262
description = "ARN of secrets manager KMS key"
6363
type = string
6464
}
65+
66+
variable "user_uploads_bucket_arn" {
67+
description = "ARN of user uploads bucket"
68+
type = string
69+
}
70+
71+
variable "user_uploads_kms_key_arn" {
72+
description = "ARN of user uploads KMS key"
73+
type = string
74+
}

terraform/modules/redshift/10-redshift.tf

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ data "aws_iam_policy_document" "redshift" {
3636
"${var.trusted_zone_bucket_arn}/*",
3737
var.trusted_zone_bucket_arn,
3838
"${var.raw_zone_bucket_arn}/*",
39-
var.raw_zone_bucket_arn
39+
var.raw_zone_bucket_arn,
40+
"${var.user_uploads_bucket_arn}/*",
41+
var.user_uploads_bucket_arn
4042
]
4143
}
4244
statement {
@@ -55,6 +57,7 @@ data "aws_iam_policy_document" "redshift" {
5557
var.raw_zone_kms_key_arn,
5658
var.refined_zone_kms_key_arn,
5759
var.trusted_zone_kms_key_arn,
60+
var.user_uploads_kms_key_arn,
5861
]
5962
}
6063
}
@@ -165,11 +168,11 @@ resource "aws_security_group" "redshift_cluster_security_group" {
165168
}
166169

167170
ingress {
168-
description = "Allows inbound traffic from the Qlik EC2 data gateway"
169-
from_port = 5439
170-
to_port = 5439
171-
protocol = "tcp"
172-
cidr_blocks = ["10.120.32.49/32"]
171+
description = "Allows inbound traffic from the Qlik EC2 data gateway"
172+
from_port = 5439
173+
to_port = 5439
174+
protocol = "tcp"
175+
cidr_blocks = ["10.120.32.49/32"]
173176
}
174177
ingress {
175178
description = "Allows security group based inbound traffic"

0 commit comments

Comments
 (0)