diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7cedf78..baa9d29 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -26,13 +26,13 @@ jobs: with: mask-password: "false" - - name: Build, tag, and push docker image to Amazon ECR + - name: Build, tag, and push cube api docker image to Amazon ECR env: REGISTRY: ${{ steps.login-ecr.outputs.registry }} - REPOSITORY: sync-svc-cube + REPOSITORY: prod-sync-cube-ecr IMAGE_TAG: "${{ github.sha }}" run: | - docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG . + docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG -f docker/cube/Dockerfile . docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG - name: Update cube-api Task Definition with latest image @@ -41,7 +41,7 @@ jobs: with: task-definition-family: cube_api container-name: cube-api - image: ${{ steps.login-ecr.outputs.registry }}/sync-svc-cube:${{ github.sha }} + image: ${{ steps.login-ecr.outputs.registry }}/prod-sync-cube-ecr:${{ github.sha }} - name: Update cube-refresh-worker Task Definition with latest image id: cube-refresh-worker-task-def @@ -49,14 +49,14 @@ jobs: with: task-definition-family: cube_refresh_worker container-name: cube-refresh-worker - image: ${{ steps.login-ecr.outputs.registry }}/sync-svc-cube:${{ github.sha }} + image: ${{ steps.login-ecr.outputs.registry }}/prod-sync-cube-ecr:${{ github.sha }} - name: Deploy cube-api task definition uses: aws-actions/amazon-ecs-deploy-task-definition@v2.3.0 with: task-definition: ${{ steps.cube-api-task-def.outputs.task-definition }} service: cube_api - cluster: production + cluster: prod-sync_cluster wait-for-service-stability: true - name: Deploy cube-refresh-worker task definition @@ -64,5 +64,5 @@ jobs: with: task-definition: ${{ steps.cube-refresh-worker-task-def.outputs.task-definition }} service: cube_refresh_worker - cluster: production + cluster: prod-sync_cluster wait-for-service-stability: true diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 0482573..0000000 --- a/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM cubejs/cube:v1.1.9 - -COPY cube.js cube.js -COPY fetch.js fetch.js -RUN mkdir model -COPY model/ model/ diff --git a/deploy_cubestore.sh b/deploy_cubestore.sh new file mode 100755 index 0000000..22b058f --- /dev/null +++ b/deploy_cubestore.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +set -e + +AWS_REGION="us-east-1" +ECR_REPOSITORY="prod-sync-cubestore-ecr" + +AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text) +REGISTRY="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com" +IMAGE_TAG=$(git rev-parse --short HEAD 2>/dev/null || date +%s) + +aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $REGISTRY + +docker build --platform linux/amd64 -t $REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f docker/cubestore/Dockerfile . +docker push $REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + +echo "New cubestore image pushed to ECR: $REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG. Please update terraform cubestore services task definitions accordingly." \ No newline at end of file diff --git a/docker/cube/Dockerfile b/docker/cube/Dockerfile new file mode 100644 index 0000000..6645017 --- /dev/null +++ b/docker/cube/Dockerfile @@ -0,0 +1,11 @@ +FROM cubejs/cube:v1.1.9 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends curl \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +COPY cube.js cube.js +COPY fetch.js fetch.js +RUN mkdir model +COPY model/ model/ diff --git a/docker/cubestore/Dockerfile b/docker/cubestore/Dockerfile new file mode 100644 index 0000000..2c60062 --- /dev/null +++ b/docker/cubestore/Dockerfile @@ -0,0 +1,3 @@ +FROM cubejs/cubestore:latest + +RUN apt-get update && apt-get install -y curl \ No newline at end of file diff --git a/terraform/.terraform.lock.hcl b/terraform/.terraform.lock.hcl index 968a228..d9fa8e9 100644 --- a/terraform/.terraform.lock.hcl +++ b/terraform/.terraform.lock.hcl @@ -23,3 +23,22 @@ provider "registry.terraform.io/hashicorp/aws" { "zh:c2329644179f78a0458b6cf2dd5eaadca4c610fc3577a1b50620544d92df13e8", ] } + +provider "registry.terraform.io/hashicorp/null" { + version = "3.2.3" + hashes = [ + "h1:I0Um8UkrMUb81Fxq/dxbr3HLP2cecTH2WMJiwKSrwQY=", + "zh:22d062e5278d872fe7aed834f5577ba0a5afe34a3bdac2b81f828d8d3e6706d2", + "zh:23dead00493ad863729495dc212fd6c29b8293e707b055ce5ba21ee453ce552d", + "zh:28299accf21763ca1ca144d8f660688d7c2ad0b105b7202554ca60b02a3856d3", + "zh:55c9e8a9ac25a7652df8c51a8a9a422bd67d784061b1de2dc9fe6c3cb4e77f2f", + "zh:756586535d11698a216291c06b9ed8a5cc6a4ec43eee1ee09ecd5c6a9e297ac1", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:9d5eea62fdb587eeb96a8c4d782459f4e6b73baeece4d04b4a40e44faaee9301", + "zh:a6355f596a3fb8fc85c2fb054ab14e722991533f87f928e7169a486462c74670", + "zh:b5a65a789cff4ada58a5baffc76cb9767dc26ec6b45c00d2ec8b1b027f6db4ed", + "zh:db5ab669cf11d0e9f81dc380a6fdfcac437aea3d69109c7aef1a5426639d2d65", + "zh:de655d251c470197bcbb5ac45d289595295acb8f829f6c781d4a75c8c8b7c7dd", + "zh:f5c68199f2e6076bce92a12230434782bf768103a427e9bb9abee99b116af7b5", + ] +} diff --git a/terraform/ecr.tf b/terraform/ecr.tf deleted file mode 100644 index e360052..0000000 --- a/terraform/ecr.tf +++ /dev/null @@ -1,33 +0,0 @@ -resource "aws_ecr_repository" "sync_svc_cube_repo" { - name = "sync-svc-cube" - image_tag_mutability = "IMMUTABLE" - - image_scanning_configuration { - scan_on_push = true - } -} - -resource "aws_ecr_lifecycle_policy" "sync_svc_cube_lf_policy" { - repository = aws_ecr_repository.sync_svc_cube_repo.name - - policy = < secret } + name = each.value.valueFrom +} + +locals { + secret_arns = [for s in data.aws_secretsmanager_secret.secrets : s.arn] +} + + data "aws_iam_policy_document" "ecs_task_execution_role" { statement { - actions = ["secretsmanager:GetSecretValue"] - resources = [ - aws_secretsmanager_secret.postgres_cube_user_pw.arn, - aws_secretsmanager_secret.auth0_jwt_key.arn - ] + actions = ["secretsmanager:GetSecretValue"] + resources = local.secret_arns } } resource "aws_iam_role" "ecs_task_execution_role" { - name = "ecs_task_execution_role" + name = "${var.cluster_prefix}_ecs_task_execution_role" assume_role_policy = jsonencode({ Version = "2012-10-17", @@ -47,7 +54,7 @@ resource "aws_iam_role" "ecs_task_execution_role" { } resource "aws_iam_role" "ecs_task_role" { - name = "ecs_task_role" + name = "${var.cluster_prefix}_ecs_task_role" assume_role_policy = jsonencode({ Version = "2012-10-17", @@ -64,9 +71,8 @@ resource "aws_iam_role" "ecs_task_role" { }) } - resource "aws_iam_policy" "ecs_task_ssm_policy" { - name = "ecs_task_ssm_policy" + name = "${var.cluster_prefix}_ecs_task_ssm_policy" policy = < 0 + error_message = "The VPC must have at least one NAT Gateway" + } + + precondition { + condition = can(data.aws_internet_gateway.selected.id) + error_message = "The VPC must have an Internet Gateway" + } + } +} + +variable "cubestore_image" { + type = string + description = "Image for cube store and cube store router" + default = "cubejs/cubestore" +} + +variable "cube_api_resources" { + type = object({ + cpu = string + memory = string + desired_worker_count = number + }) + + default = { + cpu = "2048" + memory = "4096" + desired_worker_count = 2 + } +} + +variable "cube_refresh_worker_resources" { + type = object({ + cpu = string + memory = string + desired_worker_count = number + }) + + default = { + cpu = "2048" + memory = "4096" + desired_worker_count = 1 + } +} + + +variable "cubestore_router_resources" { + type = object({ + cpu = string + memory = string + }) + + default = { + cpu = "4096" + memory = "8192" + } +} + +variable "cubestore_worker_resources" { + type = object({ + cpu = string + memory = string + cubestore_worker_count = number + }) + + default = { + cpu = "4096" + memory = "8192" + cubestore_worker_count = 2 + } +} + +variable "cube_shared_env" { + type = list(object({ + name = string + value = string + })) + description = "Shared environment variables for cube api and refresh workers." + default = [] +} + +variable "cube_shared_secrets" { + type = list(object({ + name = string + valueFrom = string + })) + description = "Shared environment secrets for cube api and refresh workers." + default = [] +} + +variable "cube_api_domain_name" { + type = string +} \ No newline at end of file diff --git a/terraform/variables.tf b/terraform/variables.tf deleted file mode 100644 index 90d00e6..0000000 --- a/terraform/variables.tf +++ /dev/null @@ -1,10 +0,0 @@ -variable "cubestore_image" { - type = string - description = "Image for cube store and cube store router" - default = "cubejs/cubestore" -} - -variable "aws_account_id" { - description = "Target AWS Account ID" - type = string -} \ No newline at end of file