diff --git a/ops/services/10-core/iam.tf b/ops/services/10-core/iam.tf index c4a167062..a44f64d87 100644 --- a/ops/services/10-core/iam.tf +++ b/ops/services/10-core/iam.tf @@ -244,68 +244,6 @@ resource "aws_iam_role_policy_attachment" "idr_kms" { policy_arn = aws_iam_policy.kms_key_access.arn } -resource "aws_iam_role" "idr_db_importer_task" { - permissions_boundary = data.aws_iam_policy.developer_boundary_policy.arn - name = "${local.service_prefix}-idr-db-importer-task" - path = "/delegatedadmin/developer/" - - assume_role_policy = jsonencode({ - Version = "2012-10-17" - Statement = [ - { - Action = "sts:AssumeRole" - Effect = "Allow" - Sid = "" - Principal = { - Service = [ - "ecs-tasks.amazonaws.com" - ] - } - } - ] - }) -} - -resource "aws_iam_policy" "idr_db_importer_task" { - name = "${module.platform.app}-${module.platform.env}-idr-db-importer-task" - description = "IDR DB Importer ECS task access to S3 bucket and KMS key." - - policy = jsonencode({ - Version = "2012-10-17" - Statement = [ - { - Sid = "S3Access" - Effect = "Allow" - Action = [ - "s3:AbortMultipartUpload", - "s3:GetObject", - "s3:PutObject", - "s3:DeleteObject", - "s3:ListBucket" - ] - Resource = [ - module.idr_db_importer_bucket.arn, - "${module.idr_db_importer_bucket.arn}/*" - ] - }, - { - Sid = "KmsAccessForS3" - Effect = "Allow" - Action = [ - "kms:Decrypt", - "kms:GenerateDataKey" - ] - Resource = module.platform.kms_alias_primary.target_key_arn - } - ] - }) -} - -resource "aws_iam_role_policy_attachment" "idr_db_importer_task" { - role = aws_iam_role.idr_db_importer_task.name - policy_arn = aws_iam_policy.idr_db_importer_task.arn -} - resource "aws_iam_role" "idr_db_importer" { name = "${module.platform.app}-${module.platform.env}-idr-db-importer" path = "/delegatedadmin/developer/" @@ -389,7 +327,7 @@ data "aws_iam_policy_document" "idr_db_importer_additional_bucket_policy" { variable = "aws:PrincipalArn" values = [ aws_iam_role.idr_db_importer.arn, - aws_iam_role.idr_db_importer_task.arn + "arn:aws:iam::${local.aws_account_number}:role/${local.service_prefix}-idr-db-importer-task-role" ] } diff --git a/ops/services/30-idr-db-importer/data.tf b/ops/services/30-idr-db-importer/data.tf index 1271f0cd0..53aa300ea 100644 --- a/ops/services/30-idr-db-importer/data.tf +++ b/ops/services/30-idr-db-importer/data.tf @@ -6,10 +6,6 @@ data "aws_ecs_cluster" "shared" { cluster_name = "${local.app}-${local.env}" } -data "aws_iam_role" "idr_db_importer_task" { - name = "${local.service_prefix}-${local.service}-task" -} - data "aws_iam_role" "idr_db_importer_task_execution" { name = "${local.service_prefix}-${local.service}-task-execution" } diff --git a/ops/services/30-idr-db-importer/main.tf b/ops/services/30-idr-db-importer/main.tf index d203e9d03..e772df81b 100644 --- a/ops/services/30-idr-db-importer/main.tf +++ b/ops/services/30-idr-db-importer/main.tf @@ -25,104 +25,84 @@ module "platform" { } -resource "aws_ecs_task_definition" "idr_db_importer" { - cpu = 1024 - execution_role_arn = data.aws_iam_role.idr_db_importer_task_execution.arn - family = "${local.service_prefix}-${local.service}" - memory = 2048 - network_mode = "awsvpc" - requires_compatibilities = ["FARGATE"] - task_role_arn = data.aws_iam_role.idr_db_importer_task.arn - runtime_platform { - cpu_architecture = "ARM64" - operating_system_family = "LINUX" - } - container_definitions = nonsensitive(jsonencode([ - { - image = "${local.image_repo_uri}:${var.image_tag}" - name = local.service - readonlyRootFilesystem = true - - secrets = concat([ - { - name = "AB2D_DB_PASSWORD" - valueFrom = data.aws_ssm_parameter.ab2d_db_password.arn - } - ], - module.platform.parent_env == "prod" ? [ - { - name = "IDR_SNOWFLAKE_PRIVATE_KEY" - valueFrom = data.aws_ssm_parameter.idr_private_key[0].arn - }, - { - name = "IDR_SNOWFLAKE_WAREHOUSE" - valueFrom = data.aws_ssm_parameter.idr_snowflake_warehouse[0].arn - } - ] : [] - ) +module "service" { + source = "github.com/CMSgov/cdap//terraform/modules/service?ref=52af0763fab4e65b29ead8bf88774f0bad4bdd87" + + cluster_arn = data.aws_ecs_cluster.shared.arn + cpu = 1024 + memory = 2048 + desired_count = 0 + enable_datadog_agent = false + execution_role_arn = data.aws_iam_role.idr_db_importer_task_execution.arn + image = "${local.image_repo_uri}:${var.image_tag}" + platform = module.platform + security_groups = [data.aws_security_group.idr_db_importer.id] + subnets = keys(module.platform.private_subnets) + + additional_task_role_policies = { s3 = aws_iam_policy.idr_db_importer_task.arn } + + container_environment = concat( + [ + { name = "AB2D_DB_DATABASE", value = data.aws_ssm_parameter.ab2d_db_database.value }, + { name = "AB2D_DB_HOST", value = data.aws_ssm_parameter.ab2d_db_host.value }, + { name = "AB2D_DB_PORT", value = "5432" }, + { name = "S3_BUCKET", value = data.aws_ssm_parameter.idr_db_importer_bucket.value }, + { name = "ENVIRONMENT", value = local.env } + ], + module.platform.parent_env == "prod" ? [ + { name = "IDR_SNOWFLAKE_URL", value = "jdbc:snowflake://cms-idr.privatelink.snowflakecomputing.com" }, + { name = "IDR_SNOWFLAKE_DB", value = "IDRC_PRD" }, + { name = "IDR_SNOWFLAKE_SCHEMA", value = "CMS_VDM_VIEW_MDCR_PRD" } + ] : [] + ) + + container_secrets = concat( + [ + { name = "AB2D_DB_PASSWORD", valueFrom = data.aws_ssm_parameter.ab2d_db_password.arn }, + { name = "AB2D_DB_USER", valueFrom = data.aws_ssm_parameter.ab2d_db_user.arn } + ], + module.platform.parent_env == "prod" ? [ + { name = "IDR_SNOWFLAKE_PRIVATE_KEY", valueFrom = data.aws_ssm_parameter.idr_private_key[0].arn }, + { name = "IDR_SNOWFLAKE_WAREHOUSE", valueFrom = data.aws_ssm_parameter.idr_snowflake_warehouse[0].arn }, + { name = "IDR_SNOWFLAKE_USER", valueFrom = data.aws_ssm_parameter.idr_snowflake_user[0].arn }, + { name = "IDR_SNOWFLAKE_ROLE", valueFrom = data.aws_ssm_parameter.idr_snowflake_role[0].arn } + ] : [] + ) +} - environment = concat( - [ - { - name = "AB2D_DB_DATABASE" - value = data.aws_ssm_parameter.ab2d_db_database.value - }, - { - name = "AB2D_DB_HOST" - value = data.aws_ssm_parameter.ab2d_db_host.value - }, - { - name = "AB2D_DB_PORT" - value = "5432" - }, - { - name = "AB2D_DB_USER" - value = data.aws_ssm_parameter.ab2d_db_user.value - }, - { - name = "S3_BUCKET" - value = data.aws_ssm_parameter.idr_db_importer_bucket.value - }, - { - name = "ENVIRONMENT" - value = local.env - } - ], - module.platform.parent_env == "prod" ? [ - { - name = "IDR_SNOWFLAKE_URL" - value = "jdbc:snowflake://cms-idr.privatelink.snowflakecomputing.com" - }, - { - name = "IDR_SNOWFLAKE_USER" - value = data.aws_ssm_parameter.idr_snowflake_user[0].value - }, - { - name = "IDR_SNOWFLAKE_ROLE" - value = data.aws_ssm_parameter.idr_snowflake_role[0].value - }, - { - name = "IDR_SNOWFLAKE_DB" - value = "IDRC_PRD" - }, - { - name = "IDR_SNOWFLAKE_SCHEMA" - value = "CMS_VDM_VIEW_MDCR_PRD" - } - ] : [] - ) +resource "aws_iam_policy" "idr_db_importer_task" { + name = "${local.app}-${local.env}-idr-db-importer-task" + description = "IDR DB Importer ECS task access to S3 bucket and KMS key." - logConfiguration = { - logDriver = "awslogs" - options = { - awslogs-group = "/aws/ecs/fargate/${local.app}-${local.env}/${local.service}" - awslogs-create-group = "true" - awslogs-region = var.region - awslogs-stream-prefix = "${local.app}-${local.env}" - } + policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Sid = "S3Access" + Effect = "Allow" + Action = [ + "s3:AbortMultipartUpload", + "s3:GetObject", + "s3:PutObject", + "s3:DeleteObject", + "s3:ListBucket" + ] + Resource = [ + "arn:aws:s3:::${data.aws_ssm_parameter.idr_db_importer_bucket.value}", + "arn:aws:s3:::${data.aws_ssm_parameter.idr_db_importer_bucket.value}/*" + ] + }, + { + Sid = "KmsAccessForS3" + Effect = "Allow" + Action = [ + "kms:Decrypt", + "kms:GenerateDataKey" + ] + Resource = module.platform.kms_alias_primary.target_key_arn } - } - ])) + ] + }) } resource "aws_scheduler_schedule" "idr_db_importer" { @@ -142,7 +122,7 @@ resource "aws_scheduler_schedule" "idr_db_importer" { launch_type = "FARGATE" task_definition_arn = trimsuffix( - aws_ecs_task_definition.idr_db_importer.arn, ":${aws_ecs_task_definition.idr_db_importer.revision}" + module.service.task_definition.arn, ":${module.service.task_definition.revision}" ) network_configuration { @@ -183,8 +163,8 @@ resource "aws_iam_policy" "idr_db_importer_eventbridge_scheduler" { "ecs:RunTask" ], Resource = [ - trimsuffix(aws_ecs_task_definition.idr_db_importer.arn, ":${aws_ecs_task_definition.idr_db_importer.revision}"), - "${trimsuffix(aws_ecs_task_definition.idr_db_importer.arn, ":${aws_ecs_task_definition.idr_db_importer.revision}")}:*" + trimsuffix(module.service.task_definition.arn, ":${module.service.task_definition.revision}"), + "${trimsuffix(module.service.task_definition.arn, ":${module.service.task_definition.revision}")}:*" ], Condition = { "ArnLike" = { @@ -198,7 +178,7 @@ resource "aws_iam_policy" "idr_db_importer_eventbridge_scheduler" { "iam:PassRole" ] Resource = [ - data.aws_iam_role.idr_db_importer_task.arn, + module.service.task_role_arn, data.aws_iam_role.idr_db_importer_task_execution.arn ] },