Skip to content
This repository was archived by the owner on Oct 27, 2025. It is now read-only.

Commit d7dea1c

Browse files
committed
Upgrade application to 5.3.1 and simplify setup (closes #10)
1 parent 7518cee commit d7dea1c

File tree

7 files changed

+325
-376
lines changed

7 files changed

+325
-376
lines changed

README.md

Lines changed: 74 additions & 134 deletions
Large diffs are not rendered by default.

main.tf

Lines changed: 169 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ locals {
33
module_version = "0.1.1"
44

55
app_name = "rdb-loader-snowflake"
6-
app_version = "3.0.0"
6+
app_version = "5.3.1"
77

88
local_tags = {
99
Name = var.name
@@ -26,7 +26,7 @@ data "aws_caller_identity" "current" {}
2626

2727
module "telemetry" {
2828
source = "snowplow-devops/telemetry/snowplow"
29-
version = "0.3.0"
29+
version = "0.4.0"
3030

3131
count = var.telemetry_enabled ? 1 : 0
3232

@@ -39,27 +39,6 @@ module "telemetry" {
3939
module_version = local.module_version
4040
}
4141

42-
data "aws_ami" "amazon_linux_2" {
43-
most_recent = true
44-
45-
filter {
46-
name = "name"
47-
values = ["amzn2-ami-hvm-*-x86_64-ebs"]
48-
}
49-
50-
filter {
51-
name = "root-device-type"
52-
values = ["ebs"]
53-
}
54-
55-
filter {
56-
name = "virtualization-type"
57-
values = ["hvm"]
58-
}
59-
60-
owners = ["amazon"]
61-
}
62-
6342
# --- CloudWatch: Logging
6443

6544
resource "aws_cloudwatch_log_group" "log_group" {
@@ -100,51 +79,61 @@ resource "aws_iam_policy" "iam_policy" {
10079

10180
policy = jsonencode({
10281
Version = "2012-10-17",
103-
Statement = concat(
104-
var.folder_monitoring_enabled ? [
105-
{
106-
Effect = "Allow",
107-
Action = [
108-
"s3:ListBucket",
109-
"s3:PutObject"
110-
],
111-
Resource = [
112-
"arn:aws:s3:::${var.snowflake_aws_s3_stage_bucket_name}",
113-
"arn:aws:s3:::${var.snowflake_aws_s3_stage_bucket_name}/*"
114-
]
115-
}
116-
] : [],
117-
[
118-
{
119-
Effect = "Allow",
120-
Action = [
121-
"sqs:DeleteMessage",
122-
"sqs:GetQueueUrl",
123-
"sqs:ListQueues",
124-
"sqs:ChangeMessageVisibility",
125-
"sqs:SendMessageBatch",
126-
"sqs:ReceiveMessage",
127-
"sqs:SendMessage",
128-
"sqs:DeleteMessageBatch",
129-
"sqs:ChangeMessageVisibilityBatch"
130-
],
131-
Resource = [
132-
"arn:aws:sqs:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:${var.sqs_queue_name}"
133-
]
134-
},
135-
{
136-
Effect = "Allow",
137-
Action = [
138-
"logs:PutLogEvents",
139-
"logs:CreateLogStream",
140-
"logs:DescribeLogStreams"
141-
],
142-
Resource = [
143-
"arn:aws:logs:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:log-group:${local.cloudwatch_log_group_name}:*"
144-
]
145-
}
146-
]
147-
)
82+
Statement = [
83+
{
84+
Effect = "Allow",
85+
Action = [
86+
"s3:ListBucket",
87+
"s3:PutObject",
88+
"s3:GetObject"
89+
],
90+
Resource = [
91+
"arn:aws:s3:::${var.snowflake_aws_s3_bucket_name}/",
92+
"arn:aws:s3:::${var.snowflake_aws_s3_bucket_name}/*"
93+
]
94+
},
95+
{
96+
Effect = "Allow",
97+
Action = ["s3:GetObject"],
98+
Resource = [
99+
"arn:aws:s3:::${var.snowflake_aws_s3_bucket_name}/*/shredding_complete.json"
100+
]
101+
},
102+
{
103+
Effect = "Allow",
104+
Action = [
105+
"sqs:DeleteMessage",
106+
"sqs:GetQueueUrl",
107+
"sqs:ListQueues",
108+
"sqs:ChangeMessageVisibility",
109+
"sqs:ReceiveMessage",
110+
"sqs:SendMessage"
111+
],
112+
Resource = [
113+
"arn:aws:sqs:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:${var.sqs_queue_name}"
114+
]
115+
},
116+
{
117+
Effect = "Allow",
118+
Action = [
119+
"logs:PutLogEvents",
120+
"logs:CreateLogStream",
121+
"logs:DescribeLogStreams"
122+
],
123+
Resource = [
124+
"arn:aws:logs:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:log-group:${local.cloudwatch_log_group_name}:*"
125+
]
126+
},
127+
{
128+
Effect = "Allow",
129+
Action = [
130+
"sts:AssumeRole"
131+
],
132+
Resource = [
133+
aws_iam_role.sts_credentials_role.arn
134+
]
135+
}
136+
]
148137
})
149138
}
150139

@@ -158,6 +147,57 @@ resource "aws_iam_instance_profile" "instance_profile" {
158147
role = aws_iam_role.iam_role.name
159148
}
160149

150+
resource "aws_iam_role" "sts_credentials_role" {
151+
name = "${var.name}-sts-credentials"
152+
description = "Allows the Snowflake Loader to access the S3 buckets to perform loading"
153+
tags = local.tags
154+
155+
permissions_boundary = var.iam_permissions_boundary
156+
assume_role_policy = data.aws_iam_policy_document.sts_credentials_role.json
157+
}
158+
159+
data "aws_iam_policy_document" "sts_credentials_role" {
160+
statement {
161+
actions = ["sts:AssumeRole"]
162+
163+
principals {
164+
type = "AWS"
165+
identifiers = [
166+
aws_iam_role.iam_role.arn
167+
]
168+
}
169+
}
170+
}
171+
172+
resource "aws_iam_policy" "sts_credentials_policy" {
173+
name = "${var.name}-sts-credentials"
174+
175+
policy = jsonencode({
176+
Version = "2012-10-17",
177+
Statement = [
178+
{
179+
Effect = "Allow",
180+
Action = [
181+
"s3:ListBucket",
182+
"s3:GetBucketLocation",
183+
"s3:GetObject",
184+
"s3:GetObjectVersion",
185+
],
186+
Resource = [
187+
"arn:aws:s3:::${var.snowflake_aws_s3_bucket_name}",
188+
"arn:aws:s3:::${var.snowflake_aws_s3_bucket_name}/",
189+
"arn:aws:s3:::${var.snowflake_aws_s3_bucket_name}/*"
190+
]
191+
}
192+
]
193+
})
194+
}
195+
196+
resource "aws_iam_role_policy_attachment" "sts_credentials_policy_attachement" {
197+
role = aws_iam_role.sts_credentials_role.name
198+
policy_arn = aws_iam_policy.sts_credentials_policy.arn
199+
}
200+
161201
# --- EC2: Security Group Rules
162202

163203
resource "aws_security_group" "sg" {
@@ -268,51 +308,55 @@ locals {
268308
})
269309

270310
config = templatefile("${path.module}/templates/config.json.tmpl", {
271-
region = data.aws_region.current.name
272-
message_queue = var.sqs_queue_name
273-
sf_username = var.snowflake_loader_user
274-
sf_password = var.snowflake_password
275-
sf_region = var.snowflake_region
276-
sf_account = var.snowflake_account
277-
sf_wh_name = var.snowflake_warehouse
278-
sf_db_name = var.snowflake_database
279-
sf_role = var.snowflake_loader_role
280-
sf_transformed_stage = var.snowflake_transformed_stage_name
281-
sf_schema = var.snowflake_schema
282-
shredder_output = var.snowflake_aws_s3_transformed_stage_url
283-
sf_max_error_given = var.max_error != -1
284-
sf_max_error = var.max_error
285-
sp_tracking_enabled = var.sp_tracking_enabled
286-
sp_tracking_app_id = var.sp_tracking_app_id
287-
sp_tracking_collector_url = var.sp_tracking_collector_url
288-
sentry_enabled = var.sentry_enabled
289-
sentry_dsn = var.sentry_dsn
290-
statsd_enabled = var.statsd_enabled
291-
statsd_host = var.statsd_host
292-
statsd_port = var.statsd_port
293-
stdout_metrics_enabled = var.stdout_metrics_enabled
294-
webhook_enabled = var.webhook_enabled
295-
webhook_collector = var.webhook_collector
296-
folder_monitoring_enabled = var.folder_monitoring_enabled
297-
sf_folder_monitoring_stage = var.snowflake_monitoring_stage_name
298-
folder_monitoring_staging = var.snowflake_aws_s3_folder_monitoring_stage_url
299-
folder_monitoring_period = var.folder_monitoring_period
300-
folder_monitoring_since = var.folder_monitoring_since
301-
folder_monitoring_until = var.folder_monitoring_until
302-
health_check_enabled = var.health_check_enabled
303-
health_check_freq = var.health_check_freq
304-
health_check_timeout = var.health_check_timeout
305-
retry_queue_enabled = var.retry_queue_enabled
306-
retry_period = var.retry_period
307-
retry_queue_size = var.retry_queue_size
308-
retry_queue_max_attempt = var.retry_queue_max_attempt
309-
retry_queue_interval = var.retry_queue_interval
311+
region = data.aws_region.current.name
312+
message_queue = var.sqs_queue_name
313+
sf_username = var.snowflake_loader_user
314+
sf_password = var.snowflake_password
315+
sf_region = var.snowflake_region
316+
sf_account = var.snowflake_account
317+
sf_wh_name = var.snowflake_warehouse
318+
sf_db_name = var.snowflake_database
319+
sf_schema = var.snowflake_schema
320+
temp_credentials_role_arn = aws_iam_role.sts_credentials_role.arn
321+
sp_tracking_enabled = var.sp_tracking_enabled
322+
sp_tracking_app_id = var.sp_tracking_app_id
323+
sp_tracking_collector_url = var.sp_tracking_collector_url
324+
sentry_enabled = var.sentry_enabled
325+
sentry_dsn = var.sentry_dsn
326+
statsd_enabled = var.statsd_enabled
327+
statsd_host = var.statsd_host
328+
statsd_port = var.statsd_port
329+
stdout_metrics_enabled = var.stdout_metrics_enabled
330+
webhook_enabled = var.webhook_enabled
331+
webhook_collector = var.webhook_collector
332+
folder_monitoring_enabled = var.folder_monitoring_enabled
333+
folder_monitoring_staging = var.snowflake_aws_s3_folder_monitoring_stage_url
334+
folder_monitoring_transformer_output = var.snowflake_aws_s3_folder_monitoring_transformer_output_stage_url
335+
folder_monitoring_period = var.folder_monitoring_period
336+
folder_monitoring_since = var.folder_monitoring_since
337+
folder_monitoring_until = var.folder_monitoring_until
338+
health_check_enabled = var.health_check_enabled
339+
health_check_freq = var.health_check_freq
340+
health_check_timeout = var.health_check_timeout
341+
retry_queue_enabled = var.retry_queue_enabled
342+
retry_period = var.retry_period
343+
retry_queue_size = var.retry_queue_size
344+
retry_queue_max_attempt = var.retry_queue_max_attempt
345+
retry_queue_interval = var.retry_queue_interval
346+
telemetry_disable = !var.telemetry_enabled
347+
telemetry_collector_uri = join("", module.telemetry.*.collector_uri)
348+
telemetry_collector_port = 443
349+
telemetry_secure = true
350+
telemetry_user_provided_id = var.user_provided_id
351+
telemetry_auto_gen_id = join("", module.telemetry.*.auto_generated_id)
352+
telemetry_module_name = local.module_name
353+
telemetry_module_version = local.module_version
310354
})
311355

312356
user_data = templatefile("${path.module}/templates/user-data.sh.tmpl", {
313-
config = local.config
314-
iglu_resolver = local.iglu_resolver
315-
version = local.app_version
357+
config_b64 = base64encode(local.config)
358+
iglu_resolver_b64 = base64encode(local.iglu_resolver)
359+
version = local.app_version
316360

317361
telemetry_script = join("", module.telemetry.*.amazon_linux_2_user_data)
318362

@@ -324,58 +368,24 @@ locals {
324368
})
325369
}
326370

327-
resource "aws_launch_configuration" "lc" {
328-
name_prefix = "${var.name}-"
371+
module "service" {
372+
source = "snowplow-devops/service-ec2/aws"
373+
version = "0.1.1"
329374

330-
image_id = var.amazon_linux_2_ami_id == "" ? data.aws_ami.amazon_linux_2.id : var.amazon_linux_2_ami_id
331-
instance_type = var.instance_type
332-
key_name = var.ssh_key_name
333-
iam_instance_profile = aws_iam_instance_profile.instance_profile.name
334-
security_groups = [aws_security_group.sg.id]
335-
user_data = local.user_data
375+
user_supplied_script = local.user_data
376+
name = var.name
377+
tags = local.tags
336378

337-
# Note: Required if deployed in a public subnet
379+
amazon_linux_2_ami_id = var.amazon_linux_2_ami_id
380+
instance_type = var.instance_type
381+
ssh_key_name = var.ssh_key_name
382+
iam_instance_profile_name = aws_iam_instance_profile.instance_profile.name
338383
associate_public_ip_address = var.associate_public_ip_address
384+
security_groups = [aws_security_group.sg.id]
339385

340-
root_block_device {
341-
volume_type = "gp2"
342-
volume_size = "10"
343-
delete_on_termination = true
344-
encrypted = true
345-
}
346-
347-
lifecycle {
348-
create_before_destroy = true
349-
}
350-
}
351-
352-
module "tags" {
353-
source = "snowplow-devops/tags/aws"
354-
version = "0.2.0"
355-
356-
tags = local.tags
357-
}
358-
359-
resource "aws_autoscaling_group" "asg" {
360-
name = var.name
361-
362-
max_size = 1
363-
min_size = 1
364-
365-
launch_configuration = aws_launch_configuration.lc.name
366-
367-
health_check_grace_period = 300
368-
health_check_type = "EC2"
369-
370-
vpc_zone_identifier = var.subnet_ids
371-
372-
instance_refresh {
373-
strategy = "Rolling"
374-
preferences {
375-
min_healthy_percentage = 90
376-
}
377-
triggers = ["tag"]
378-
}
386+
min_size = 1
387+
max_size = 1
388+
subnet_ids = var.subnet_ids
379389

380-
tags = module.tags.asg_tags
390+
enable_auto_scaling = false
381391
}

outputs.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
output "asg_id" {
2-
value = aws_autoscaling_group.asg.id
2+
value = module.service.asg_id
33
description = "ID of the ASG"
44
}
55

66
output "asg_name" {
7-
value = aws_autoscaling_group.asg.name
7+
value = module.service.asg_name
88
description = "Name of the ASG"
99
}
1010

0 commit comments

Comments
 (0)