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
2727module "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
6544resource "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
163203resource "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}
0 commit comments