diff --git a/.github/workflows/tofu-apply.yml b/.github/workflows/tofu-apply.yml index 74efa32aab..2dd8d263f8 100644 --- a/.github/workflows/tofu-apply.yml +++ b/.github/workflows/tofu-apply.yml @@ -106,12 +106,18 @@ jobs: tofu workspace select -var=parent_env=$ENV -or-create=true $ENV tofu plan -out=tfplan tofu apply -input=false tfplan - - name: tofu apply - microservices - working-directory: ops/services/20-microservices/ + - name: tofu apply - contracts + working-directory: ops/services/20-contracts/ run: | tofu init -var=parent_env=$ENV -reconfigure tofu workspace select -var=parent_env=$ENV -or-create=true $ENV - tofu plan ${{ inputs.contracts_image_tag != '' && format('{0}{1}', '-var=contracts_service_image_tag=', inputs.contracts_image_tag) || '' }} ${{ inputs.events_image_tag != '' && format('{0}{1}', '-var=events_service_image_tag=', inputs.events_image_tag) || '' }} -out=tfplan + tofu plan ${{ inputs.contracts_image_tag != '' && format('{0}{1}', '-var=contracts_service_image_tag=', inputs.contracts_image_tag) || '' }} -out=tfplan + - name: tofu apply - events + working-directory: ops/services/20-events/ + run: | + tofu init -var=parent_env=$ENV -reconfigure + tofu workspace select -var=parent_env=$ENV -or-create=true $ENV + tofu plan ${{ inputs.events_image_tag != '' && format('{0}{1}', '-var=events_service_image_tag=', inputs.events_image_tag) || '' }} -out=tfplan - name: tofu apply - api working-directory: ops/services/30-api/ run: | diff --git a/.github/workflows/tofu-plan.yml b/.github/workflows/tofu-plan.yml index 8a0f74434f..dabd05f1a6 100644 --- a/.github/workflows/tofu-plan.yml +++ b/.github/workflows/tofu-plan.yml @@ -102,12 +102,18 @@ jobs: tofu init -var=parent_env=$ENV -reconfigure tofu workspace select -var=parent_env=$ENV -or-create=true $ENV tofu plan - - name: tofu plan - microservices - working-directory: ops/services/20-microservices/ + - name: tofu plan - contracts + working-directory: ops/services/20-contracts/ run: | tofu init -var=parent_env=$ENV -reconfigure tofu workspace select -var=parent_env=$ENV -or-create=true $ENV - tofu plan ${{ inputs.contracts_image_tag != '' && format('{0}{1}', '-var=contracts_service_image_tag=', inputs.contracts_image_tag) || '' }} ${{ inputs.events_image_tag != '' && format('{0}{1}', '-var=events_service_image_tag=', inputs.events_image_tag) || '' }} + tofu plan ${{ inputs.contracts_image_tag != '' && format('{0}{1}', '-var=contracts_service_image_tag=', inputs.contracts_image_tag) || '' }} + - name: tofu plan - events + working-directory: ops/services/20-events/ + run: | + tofu init -var=parent_env=$ENV -reconfigure + tofu workspace select -var=parent_env=$ENV -or-create=true $ENV + tofu plan ${{ inputs.events_image_tag != '' && format('{0}{1}', '-var=events_service_image_tag=', inputs.events_image_tag) || '' }} - name: tofu plan - api working-directory: ops/services/30-api/ run: | diff --git a/ops/services/20-contracts/data.tf b/ops/services/20-contracts/data.tf new file mode 100644 index 0000000000..0fc07839e7 --- /dev/null +++ b/ops/services/20-contracts/data.tf @@ -0,0 +1,36 @@ +data "aws_sns_topic" "events" { + name = "${local.service_prefix}-events" +} + +data "aws_sqs_queue" "events" { + name = "${local.service_prefix}-events" +} + +data "aws_security_group" "api" { + name = "${local.service_prefix}-api" + vpc_id = local.vpc_id +} + +data "aws_security_group" "worker" { + name = "${local.service_prefix}-worker" + vpc_id = local.vpc_id +} + +data "aws_security_group" "lambda" { + name = "${local.service_prefix}-microservices-lambda" + vpc_id = local.vpc_id +} + +data "aws_rds_cluster" "this" { + cluster_identifier = local.service_prefix +} + +data "aws_iam_role" "task_execution_role" { + name = "${local.service_prefix}-microservices" +} + +data "aws_ecr_image" "contracts" { + repository_name = "ab2d-contracts" + image_tag = var.contracts_service_image_tag + most_recent = var.contracts_service_image_tag == null ? true : null +} diff --git a/ops/services/20-contracts/main.tf b/ops/services/20-contracts/main.tf new file mode 100644 index 0000000000..da9e39a87a --- /dev/null +++ b/ops/services/20-contracts/main.tf @@ -0,0 +1,345 @@ +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5" + } + } +} + +module "platform" { + source = "github.com/CMSgov/cdap//terraform/modules/platform?ref=ff2ef539fb06f2c98f0e3ce0c8f922bdacb96d66" + providers = { aws = aws, aws.secondary = aws.secondary } + + app = local.app + env = local.env + root_module = "https://github.com/CMSgov/ab2d/tree/main/ops/services/20-contracts" + service = local.service + ssm_root_map = local.ssm_root_map +} + +locals { + default_tags = module.platform.default_tags + env = terraform.workspace + service = "contracts" + + ssm_root_map = { + common = "/ab2d/${local.env}/common" + core = "/ab2d/${local.env}/core" + } + + benv = lookup({ + "dev" = "ab2d-dev" + "test" = "ab2d-east-impl" + "prod" = "ab2d-east-prod" + "sandbox" = "ab2d-sbx-sandbox" + }, local.parent_env, local.parent_env) + + ab2d_db_host = data.aws_rds_cluster.this.endpoint + aws_account_number = module.platform.account_id + aws_region = module.platform.primary_region.name + db_database_arn = module.platform.ssm.core.database_name.arn + db_password_arn = module.platform.ssm.core.database_password.arn + db_user_arn = module.platform.ssm.core.database_user.arn + events_sqs_url = data.aws_sqs_queue.events.url + kms_master_key_id = nonsensitive(module.platform.kms_alias_primary.target_key_arn) + network_access_logs_bucket = module.platform.network_access_logs_bucket + vpc_id = module.platform.vpc_id + + # Use the provided image tag or get the first, human-readable image tag, favoring a tag with 'latest' in its name if it should exist. + contracts_image_repo = split("@", data.aws_ecr_image.contracts.image_uri)[0] + contracts_image_tag = coalesce(var.contracts_service_image_tag, flatten([[for t in data.aws_ecr_image.contracts.image_tags : t if strcontains(t, "latest")], data.aws_ecr_image.contracts.image_tags])[0]) + contracts_image_uri = "${local.contracts_image_repo}:${local.contracts_image_tag}" + + hpms_api_params_arn = module.platform.ssm.core.hpms_api_params.arn + hpms_auth_key_id_arn = module.platform.ssm.core.hpms_auth_key_id.arn + hpms_auth_key_secret_arn = module.platform.ssm.core.hpms_auth_key_secret.arn + hpms_url_arn = module.platform.ssm.core.hpms_url.arn +} + +module "cluster" { + source = "github.com/CMSgov/cdap//terraform/modules/cluster?ref=e06f4acfea302df22c210549effa2e91bc3eff0d" + platform = module.platform +} + +# Chatbot Guardrail Policy +# FIXME No idea where the chatbot/amazonq resources are to be defined +resource "aws_iam_policy" "chatbot_guardrail_policy" { + name = "${local.service_prefix}-chatbot-guardrail-policy" + path = "/delegatedadmin/developer/" + policy = templatefile("${path.module}/templates/config/iam/chatbot_policy.json", + { + aws_account_number = local.aws_account_number + role_name = data.aws_iam_role.task_execution_role.id + } + ) +} + +# Eventbridge +resource "aws_cloudwatch_event_rule" "this" { + name = "${local.service_prefix}-${local.service}-task-monitoring-rule" + description = "This rule captures the last status of task definitions" + event_pattern = <