From 2de9740468bb53e31eabe3b12c616d44b809c227 Mon Sep 17 00:00:00 2001 From: Khai Do Date: Tue, 5 Nov 2024 09:49:50 -0800 Subject: [PATCH 1/8] [IT-3984] Update for Schematic app * Setup container deployment for Schematic * Update docs * OpenChallenges container uses a list of shared secrets however Schematic uses different secrets in each environment therefore we need to refactor the secrets handling to get secrets per environment. --- .github/workflows/deploy-dev.yaml | 2 +- .github/workflows/deploy-prod.yaml | 2 +- .github/workflows/deploy-stage.yaml | 2 +- .github/workflows/pre-deploy-check.yml | 25 ++++++ README.md | 104 ++++++------------------- app.py | 59 +++++++------- cdk.json | 28 +++---- src/utils.py | 82 ++++--------------- tests/unit/test_network_stack.py | 2 +- 9 files changed, 109 insertions(+), 197 deletions(-) create mode 100644 .github/workflows/pre-deploy-check.yml diff --git a/.github/workflows/deploy-dev.yaml b/.github/workflows/deploy-dev.yaml index d8c4f55..fa409f3 100644 --- a/.github/workflows/deploy-dev.yaml +++ b/.github/workflows/deploy-dev.yaml @@ -3,7 +3,7 @@ name: deploy-dev on: workflow_run: workflows: - - check + - pre-deploy-check types: - completed branches: diff --git a/.github/workflows/deploy-prod.yaml b/.github/workflows/deploy-prod.yaml index 6962c4a..4eb6d30 100644 --- a/.github/workflows/deploy-prod.yaml +++ b/.github/workflows/deploy-prod.yaml @@ -3,7 +3,7 @@ name: deploy-prod on: workflow_run: workflows: - - check + - pre-deploy-check types: - completed branches: diff --git a/.github/workflows/deploy-stage.yaml b/.github/workflows/deploy-stage.yaml index cfb9221..b3867e0 100644 --- a/.github/workflows/deploy-stage.yaml +++ b/.github/workflows/deploy-stage.yaml @@ -3,7 +3,7 @@ name: deploy-stage on: workflow_run: workflows: - - check + - pre-deploy-check types: - completed branches: diff --git a/.github/workflows/pre-deploy-check.yml b/.github/workflows/pre-deploy-check.yml new file mode 100644 index 0000000..0a0ea07 --- /dev/null +++ b/.github/workflows/pre-deploy-check.yml @@ -0,0 +1,25 @@ +name: pre-deploy-check + +on: + workflow_run: + workflows: + - check + types: + - completed + branches: [dev, stage, prod] + +jobs: + synth: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Install dependencies + run: pip install -r requirements.txt -r requirements-dev.txt + - name: Generate cloudformation + uses: youyo/aws-cdk-github-actions@v2 + with: + cdk_subcommand: 'synth' + actions_comment: false + debug_log: true + cdk_args: '--output ./cdk.out' diff --git a/README.md b/README.md index 377cc38..af12f5b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ AWS CDK app for deploying [Schematic](schematic.api.sagebionetworks.org). -# Perequisites +# Prerequisites AWS CDK projects require some bootstrapping before synthesis or deployment. Please review the [bootstapping documentation](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_bootstrap) @@ -101,6 +101,7 @@ python -m pytest tests/ -s -v Deployment context is set in the [cdk.json](cdk.json) file. An `ENV` environment variable must be set to tell the CDK which environment's variables to use when synthesising or deploying the stacks. +The deployment context is the place to set infrastructure variables. Set an environment in cdk.json in `context` section of cdk.json: @@ -117,7 +118,7 @@ Set an environment in cdk.json in `context` section of cdk.json: } ``` -For example, using the `prod` environment: +For example, synthesis with the `prod` environment variables: ```console ENV=prod cdk synth @@ -141,85 +142,28 @@ Once created take the ARN of the certificate and add it to a context in cdk.json # Secrets -Secrets can be stored in one of the following locations: - * AWS SSM parameter store - * Local context in [cdk.json](cdk.json) file +Secrets can be manually created in the [AWS SSM parameter store](./docs/aws-parameter-store.png) +Then it can be retrieved using the `get_ssm_secret` method in [utils.py](./src/utils.py). -## Loading directly from cdk.json +Parameter store references can be passed into the ServiceProp objects: -Set secrets directly in cdk.json in `context` section of cdk.json: - -```text - "context": { - "secrets": { - "MARIADB_PASSWORD": "Dummy", - "MARIADB_ROOT_PASSWORD": "Dummy", - "GIT_HOST_KEY": "Host123", - "GIT_PRIVATE_KEY": "-----BEGIN OPENSSH PRIVATE KEY-----\nDUMMY_GIT_PRIVATE_KEY\n-----END OPENSSH PRIVATE KEY-----", - "AWS_LOADER_S3_ACCESS_KEY_ID": "AccessKey123", - "AWS_LOADER_S3_SECRET_ACCESS_KEY": "SecretAccessKey123", - "SECURITY_KEY": "SecurityKey123" - } - } -``` - -## Loading from ssm parameter store - -Set secrets to the SSM parameter names in `context` section of cdk.json: - -```text - "context": { - "secrets": { - "MARIADB_PASSWORD": "/openchallenges/MARIADB_PASSWORD", - "MARIADB_ROOT_PASSWORD": "/openchallenges/MARIADB_ROOT_PASSWORD", - "GIT_HOST_KEY": "/openchallenges/GIT_HOST_KEY", - "GIT_PRIVATE_KEY": "/openchallenges/GIT_PRIVATE_KEY", - "AWS_LOADER_S3_ACCESS_KEY_ID": "/openchallenges/AWS_LOADER_S3_ACCESS_KEY_ID", - "AWS_LOADER_S3_SECRET_ACCESS_KEY": "/openchallenges/AWS_LOADER_S3_SECRET_ACCESS_KEY", - "SECURITY_KEY": "/openchallenges/SECURITY_KEY" - } - } +```python +app_service_props = ServiceProps( + "app", 443, 1024, f"ghcr.io/sage-bionetworks/app:v0.1.90-beta", + { + "MARIADB_USER": utils.get_ssm_secret("/app/dev/MARIADB_USER"), + "MARIADB_PASSWORD": utils.get_ssm_secret("/app/dev/MARIADB_PASSWORD") + }, +) ``` -where the values of these KVs (e.g. `/openchallenges/MARIADB_PASSWORD`) refer to SSM parameters that +where the values of these KVs (e.g. `/app/dev/MARIADB_PASSWORD`) refer to SSM parameter which must be created manually. ![AWS secrets manager](docs/aws-parameter-store.png) -## Specify secret location - -Set the `SECRETS` environment variable to specify the location where secrets should be loaded from. - -Load secrets directly from cdk.json file: - -```console -SECRETS=local cdk synth -``` - -Load secrets from AWS SSM parameter store: - -```console -AWS_PROFILE= AWS_DEFAULT_REGION=us-east-1 SECRETS=ssm cdk synth -``` - > [!NOTE] -> Setting `SECRETS=ssm` requires access to an AWS account - -## Override secrets from command line - -The CDK CLI allows overriding context variables: - -To load secrets directly from passed in values: - -```console -SECRETS=local cdk --context secrets='{"MARIADB_PASSWORD": "Dummy", "MARIADB_ROOT_PASSWORD": "Dummy", ..}' synth -``` - -To load secrets from SSM parameter store with overridden SSM parameter names: - -```console -SECRETS=ssm cdk --context "secrets"='{"MARIADB_PASSWORD": "/test/mariadb-root-pass", "MARIADB_ROOT_PASSWORD": "/test/mariadb-root-pass", ..}' synth -``` +> Retrieving secrets requires access to the AWS Service Systems Manager # Deployment @@ -227,11 +171,11 @@ SECRETS=ssm cdk --context "secrets"='{"MARIADB_PASSWORD": "/test/mariadb-root-p There are a few items that need to be manually bootstrapped before deploying the application. -* Add application [secrets](#Secrets) to either the cdk.json or the AWS System Manager parameter store +* Add secrets to the AWS System Manager parameter store * Create an [ACM certificate for the application](#Certificates) using the AWS Certificates Manager * Add the Certificate ARN to the cdk.json * Update references to the docker images in [app.py](app.py) - (i.e. `ghcr.io/sage-bionetworks/schematic-xxx:`) + (i.e. `ghcr.io/sage-bionetworks/app-xxx:`) * (Optional) Update the `ServiceProps` objects in [app.py](app.py) with parameters specific to each container. @@ -273,7 +217,7 @@ Deployment requires setting up an [AWS profile](https://docs.aws.amazon.com/cli/ then executing the following command: ```console -AWS_PROFILE=itsandbox-dev AWS_DEFAULT_REGION=us-east-1 ENV=dev SECRETS=ssm cdk deploy --all +AWS_PROFILE=itsandbox-dev AWS_DEFAULT_REGION=us-east-1 ENV=dev cdk deploy --all ``` ## Force new deployment @@ -294,9 +238,9 @@ Example to get an interactive shell run into a container: ```console AWS_PROFILE=itsandbox-dev AWS_DEFAULT_REGION=us-east-1 aws ecs execute-command \ - --cluster SchematicEcs-ClusterEB0386A7-BygXkQgSvdjY \ + --cluster AppEcs-ClusterEB0386A7-BygXkQgSvdjY \ --task a2916461f65747f390fd3e29f1b387d8 \ - --container schematic-mariadb \ + --container app-mariadb \ --command "/bin/sh" --interactive ``` @@ -310,8 +254,8 @@ The workflow for continuous integration: * Create PR from the git dev branch * PR is reviewed and approved * PR is merged -* CI deploys changes to the dev environment (dev.schematic.io) in the AWS dev account. +* CI deploys changes to the dev environment (dev.app.io) in the AWS dev account. * Changes are promoted (or merged) to the git stage branch. -* CI deploys changes to the staging environment (stage.schematic.io) in the AWS prod account. +* CI deploys changes to the staging environment (stage.app.io) in the AWS prod account. * Changes are promoted (or merged) to the git prod branch. -* CI deploys changes to the prod environment (prod.schematic.io) in the AWS prod account. +* CI deploys changes to the prod environment (prod.app.io) in the AWS prod account. diff --git a/app.py b/app.py index c77c1f3..488794c 100644 --- a/app.py +++ b/app.py @@ -1,35 +1,35 @@ import aws_cdk as cdk +import src.utils as utils from src.network_stack import NetworkStack from src.ecs_stack import EcsStack from src.service_stack import LoadBalancedServiceStack from src.load_balancer_stack import LoadBalancerStack from src.service_props import ServiceProps -import src.utils as utils - -cdk_app = cdk.App() # get the environment environment = utils.get_environment() stack_name_prefix = f"schematic-{environment}" -image_version = "0.0.11" -# get VARS from cdk.json -env_vars = cdk_app.node.try_get_context(environment) -fully_qualified_domain_name = env_vars["FQDN"] +cdk_app = cdk.App() +context_vars = cdk_app.node.try_get_context(environment) +fully_qualified_domain_name = context_vars["FQDN"] subdomain, domain = fully_qualified_domain_name.split(".", 1) -vpc_cidr = env_vars["VPC_CIDR"] -certificate_arn = env_vars["CERTIFICATE_ARN"] +vpc_cidr = context_vars["VPC_CIDR"] +certificate_arn = context_vars["CERTIFICATE_ARN"] +env_tags = context_vars["TAGS"] -# get secrets from cdk.json or aws parameter store -secrets = utils.get_secrets(cdk_app) +# recursively apply tags to all stack resources +if env_tags: + for key, value in env_tags.items(): + cdk.Tags.of(cdk_app).add(key, value) +# Generate stacks network_stack = NetworkStack(cdk_app, f"{stack_name_prefix}-network", vpc_cidr) ecs_stack = EcsStack( cdk_app, f"{stack_name_prefix}-ecs", network_stack.vpc, fully_qualified_domain_name ) -ecs_stack.add_dependency(network_stack) # From AWS docs https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect-concepts-deploy.html # The public discovery and reachability should be created last by AWS CloudFormation, including the frontend @@ -39,22 +39,22 @@ cdk_app, f"{stack_name_prefix}-load-balancer", network_stack.vpc ) -apex_service_props = ServiceProps( - "schematic-apex", - 8000, - 200, - f"ghcr.io/sage-bionetworks/schematic-apex:{image_version}", +app_service_props = ServiceProps( + "schematic-app", + 443, + 4096, + "ghcr.io/sage-bionetworks/schematic:v24.10.2", { - "API_DOCS_HOST": "schematic-api-docs", - "API_DOCS_PORT": "8010", - "API_GATEWAY_HOST": "schematic-api-gateway", - "API_GATEWAY_PORT": "8082", - "APP_HOST": "schematic-app", - "APP_PORT": "4200", - "THUMBOR_HOST": "schematic-thumbor", - "THUMBOR_PORT": "8889", - "ZIPKIN_HOST": "schematic-zipkin", - "ZIPKIN_PORT": "9411", + "project_id": "sagebio-integration-testing", + "client_email": "sage-bio-integration-test-dev@sagebio-integration-testing.iam.gserviceaccount.com", + "client_id": utils.get_ssm_secret("/schematic/dev/client_id"), + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/sage-bio-integration-test-dev%40sagebio-integration-testing.iam.gserviceaccount.com", # noqa + "universe_domain": "googleapis.com", + "private_key_id": utils.get_ssm_secret("/schematic/dev/private_key_id"), + "private_key": utils.get_ssm_secret("/schematic/dev/private_key"), }, ) @@ -63,12 +63,11 @@ f"{stack_name_prefix}-app", network_stack.vpc, ecs_stack.cluster, - apex_service_props, + app_service_props, load_balancer_stack.alb, certificate_arn, - health_check_path="/health", + health_check_path="/v1/ui/", health_check_interval=5, ) -app_service_stack.add_dependency(load_balancer_stack) cdk_app.synth() diff --git a/cdk.json b/cdk.json index 1dab4bd..f1fd3af 100644 --- a/cdk.json +++ b/cdk.json @@ -66,26 +66,26 @@ "dev": { "VPC_CIDR": "10.254.192.0/24", "FQDN": "dev.schematic.io", - "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:631692904429:certificate/0e9682f6-3ffa-46fb-9671-b6349f5164d6" - }, + "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:631692904429:certificate/0e9682f6-3ffa-46fb-9671-b6349f5164d6", + "TAGS": { + "CostCenter": "NO PROGRAM / 000000" + } + }, "stage": { "VPC_CIDR": "10.254.193.0/24", "FQDN": "stage.schematic.io", - "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:878654265857:certificate/d11fba3c-1957-48ba-9be0-8b1f460ee970" - }, + "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:878654265857:certificate/d11fba3c-1957-48ba-9be0-8b1f460ee970", + "TAGS": { + "CostCenter": "NO PROGRAM / 000000" + } + }, "prod": { "VPC_CIDR": "10.254.194.0/24", "FQDN": "prod.schematic.io", - "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:878654265857:certificate/d11fba3c-1957-48ba-9be0-8b1f460ee970" - }, - "secrets": { - "MARIADB_PASSWORD": "/openchallenges/MARIADB_PASSWORD", - "MARIADB_ROOT_PASSWORD": "/openchallenges/MARIADB_ROOT_PASSWORD", - "GIT_HOST_KEY": "/openchallenges/GIT_HOST_KEY", - "GIT_PRIVATE_KEY": "/openchallenges/GIT_PRIVATE_KEY", - "AWS_LOADER_S3_ACCESS_KEY_ID": "/openchallenges/AWS_LOADER_S3_ACCESS_KEY_ID", - "AWS_LOADER_S3_SECRET_ACCESS_KEY": "/openchallenges/AWS_LOADER_S3_SECRET_ACCESS_KEY", - "SECURITY_KEY": "/openchallenges/SECURITY_KEY" + "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:878654265857:certificate/d11fba3c-1957-48ba-9be0-8b1f460ee970", + "TAGS": { + "CostCenter": "NO PROGRAM / 000000" + } } } } diff --git a/src/utils.py b/src/utils.py index fad0f72..4cdc002 100644 --- a/src/utils.py +++ b/src/utils.py @@ -1,5 +1,4 @@ import boto3 -import aws_cdk as cdk from botocore.exceptions import ClientError from os import environ @@ -27,78 +26,23 @@ def get_environment() -> str: return environment -def get_secrets_location() -> dict: +def get_ssm_secret(param_store_ref: str) -> str: """ - The application's secrets can be saved in two places, the AWS parameter store - or directly in the cdk.json file as a `context` value. This method returns - information on the location where secrets are stored. - * `local` - stored in cdk.json file - * `ssm` - stored in AWS SSM parameter store - """ - VALID_LOCATIONS = ["local", "ssm"] - secrets_environment_var = environ.get("SECRETS") - if secrets_environment_var is None: - location = "local" # default secrets location - elif secrets_environment_var in VALID_LOCATIONS: - location = secrets_environment_var - else: - valid_locations_str = ",".join(VALID_LOCATIONS) - raise SystemExit( - f"Must set environment variable `SECRETS` to one of {valid_locations_str}" - ) - - return location - - -def get_ssm_secrets(param_store_secret_refs: dict) -> dict: - """ - Retrieve secrets from the AWS SSM parameter store. - - param_store_secret_refs is a dictionary that contains the key/ssm param name - for each secret. + Retrieve a secret from the AWS SSM parameter store. - Example param_store_secret_refs: - { - "MARIADB_PASSWORD": "/schematic/MARIADB_PASSWORD", - "GIT_PRIVATE_KEY": "/schematic/GIT_PRIVATE_KEY" - } + param_store_ref is a key/ssm param name for a secret. - Retrieve from SSM parameter store "/schematic/MARIADB_PASSWORD" and assign it to MARIADB_PASSWORD - Retrieve from SSM parameter store "/schematic/GIT_PRIVATE_KEY" and assign it to GIT_PRIVATE_KEY + Example param_store_ref: + "/app/dev/MARIADB_PASSWORD" - Example returned value: - { - "MARIADB_PASSWORD": "123ABC" - "GIT_PRIVATE_KEY": "-----BEGIN OPENSSH PRIVATE KEY-----123..ABC-----END OPENSSH PRIVATE KEY-----" - } + Retrieve the value from the parameter "/app/dev/MARIADB_PASSWORD" + in the AWS SSM parameter store """ ssm = boto3.client("ssm") - secrets = {} - for key, value in param_store_secret_refs.items(): - secret_name = key - try: - response = ssm.get_parameter(Name=value, WithDecryption=True) - secret_value = response["Parameter"]["Value"] - secrets[secret_name] = secret_value - except ClientError as e: - raise e - - return secrets - - -def get_secrets(app: cdk.App) -> dict: - """ - Secrets can be stored in the following locations: - 1. Directly in the cdk.json file in a `secrets` context - 2. In the AWS SSM parameter store - Retrieve secrets from one of those locations using the context value from the ENV - environment value and from the cdk.json context value. - """ - secrets_location = get_secrets_location() - if secrets_location == "local": - secrets = app.node.try_get_context("secrets") - elif secrets_location == "ssm": - param_store_secret_refs = app.node.try_get_context("secrets") - secrets = get_ssm_secrets(param_store_secret_refs) + try: + response = ssm.get_parameter(Name=param_store_ref, WithDecryption=True) + value = response["Parameter"]["Value"] + except ClientError as e: + raise e - return secrets + return value diff --git a/tests/unit/test_network_stack.py b/tests/unit/test_network_stack.py index 4995b3d..3d71091 100644 --- a/tests/unit/test_network_stack.py +++ b/tests/unit/test_network_stack.py @@ -5,7 +5,7 @@ def test_vpc_created(): - context = {"dev": {"VPC_CIDR": "10.254.192.0/24", "DNS_NAMESPACE": "src.io"}} + context = {"dev": {"VPC_CIDR": "10.254.192.0/24", "DNS_NAMESPACE": "app.io"}} app = core.App(context=context) env_context = app.node.try_get_context("dev") From 10cd4a04e5a6fc632e37ac092b642554dcf76314 Mon Sep 17 00:00:00 2001 From: Khai Do Date: Wed, 6 Nov 2024 17:36:17 -0800 Subject: [PATCH 2/8] use secrets manager for secrets --- app.py | 16 +++------------- src/service_props.py | 3 +++ src/service_stack.py | 10 ++++++++++ src/utils.py | 25 ------------------------- 4 files changed, 16 insertions(+), 38 deletions(-) diff --git a/app.py b/app.py index 488794c..7ef7a9c 100644 --- a/app.py +++ b/app.py @@ -43,19 +43,9 @@ "schematic-app", 443, 4096, - "ghcr.io/sage-bionetworks/schematic:v24.10.2", - { - "project_id": "sagebio-integration-testing", - "client_email": "sage-bio-integration-test-dev@sagebio-integration-testing.iam.gserviceaccount.com", - "client_id": utils.get_ssm_secret("/schematic/dev/client_id"), - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/sage-bio-integration-test-dev%40sagebio-integration-testing.iam.gserviceaccount.com", # noqa - "universe_domain": "googleapis.com", - "private_key_id": utils.get_ssm_secret("/schematic/dev/private_key_id"), - "private_key": utils.get_ssm_secret("/schematic/dev/private_key"), - }, + "ghcr.io/sage-bionetworks/schematic:v0.1.90-beta", + {}, + "schematic-dev-DockerFargateStack/dev/ecs", ) app_service_stack = LoadBalancedServiceStack( diff --git a/src/service_props.py b/src/service_props.py index b712d9e..0297d77 100644 --- a/src/service_props.py +++ b/src/service_props.py @@ -13,6 +13,7 @@ class ServiceProps: supports docker registry references (i.e. ghcr.io/sage-bionetworks/schematic-thumbor:latest) container_env_vars: a json dictionary of environment variables to pass into the container i.e. {"EnvA": "EnvValueA", "EnvB": "EnvValueB"} + container_secret_name: the secret's name in the AWS secrets manager """ def __init__( @@ -22,6 +23,7 @@ def __init__( container_memory: int, container_location: str, container_env_vars: dict, + container_secret_name: str, ) -> None: self.container_name = container_name self.container_port = container_port @@ -32,3 +34,4 @@ def __init__( ) self.container_location = container_location self.container_env_vars = container_env_vars + self.container_secret_name = container_secret_name diff --git a/src/service_stack.py b/src/service_stack.py index bcee1b9..f0f780b 100644 --- a/src/service_stack.py +++ b/src/service_stack.py @@ -8,6 +8,7 @@ aws_elasticloadbalancingv2 as elbv2, aws_certificatemanager as acm, aws_iam as iam, + aws_secretsmanager as sm, ) from constructs import Construct @@ -73,11 +74,20 @@ def __init__( location = props.container_location.removeprefix("path://") image = ecs.ContainerImage.from_asset(location) + def _get_secret(scope: Construct, id: str, name: str) -> sm.Secret: + isecret = sm.Secret.from_secret_name_v2(scope, id, name) + return ecs.Secret.from_secrets_manager(isecret) + self.container = self.task_definition.add_container( props.container_name, image=image, memory_limit_mib=props.container_memory, environment=props.container_env_vars, + secrets={ + "SECRETS_MANAGER_SECRETS": _get_secret( + self, "sm-secrets", props.container_secret_name + ) + }, port_mappings=[ ecs.PortMapping( name=props.container_name, diff --git a/src/utils.py b/src/utils.py index 4cdc002..5d0447d 100644 --- a/src/utils.py +++ b/src/utils.py @@ -1,6 +1,3 @@ -import boto3 - -from botocore.exceptions import ClientError from os import environ @@ -24,25 +21,3 @@ def get_environment() -> str: ) return environment - - -def get_ssm_secret(param_store_ref: str) -> str: - """ - Retrieve a secret from the AWS SSM parameter store. - - param_store_ref is a key/ssm param name for a secret. - - Example param_store_ref: - "/app/dev/MARIADB_PASSWORD" - - Retrieve the value from the parameter "/app/dev/MARIADB_PASSWORD" - in the AWS SSM parameter store - """ - ssm = boto3.client("ssm") - try: - response = ssm.get_parameter(Name=param_store_ref, WithDecryption=True) - value = response["Parameter"]["Value"] - except ClientError as e: - raise e - - return value From a91fe6da200afc25053be27801c3cc793815c39b Mon Sep 17 00:00:00 2001 From: Khai Do Date: Wed, 6 Nov 2024 23:07:51 -0800 Subject: [PATCH 3/8] remove secrets location env var --- .github/workflows/aws-deploy.yaml | 4 ---- .github/workflows/deploy-dev.yaml | 1 - .github/workflows/deploy-prod.yaml | 1 - .github/workflows/deploy-stage.yaml | 1 - 4 files changed, 7 deletions(-) diff --git a/.github/workflows/aws-deploy.yaml b/.github/workflows/aws-deploy.yaml index 6b6486e..a4b9a27 100644 --- a/.github/workflows/aws-deploy.yaml +++ b/.github/workflows/aws-deploy.yaml @@ -25,9 +25,6 @@ on: required: true type: string default: "dev" - secrets-location: - type: string - default: "local" jobs: deploy: @@ -55,4 +52,3 @@ jobs: run: cdk deploy --all --concurrency 5 --require-approval never env: ENV: ${{ inputs.environment }} - SECRETS: ${{ inputs.secrets-location }} diff --git a/.github/workflows/deploy-dev.yaml b/.github/workflows/deploy-dev.yaml index fa409f3..53d119a 100644 --- a/.github/workflows/deploy-dev.yaml +++ b/.github/workflows/deploy-dev.yaml @@ -16,4 +16,3 @@ jobs: role-to-assume: "arn:aws:iam::631692904429:role/sagebase-github-oidc-sage-bionetworks-schematic-infra" role-session-name: ${{ github.repository_owner }}-${{ github.event.repository.name }}-${{ github.run_id }} environment: "dev" - secrets-location: "ssm" diff --git a/.github/workflows/deploy-prod.yaml b/.github/workflows/deploy-prod.yaml index 4eb6d30..2bd5b7e 100644 --- a/.github/workflows/deploy-prod.yaml +++ b/.github/workflows/deploy-prod.yaml @@ -16,4 +16,3 @@ jobs: role-to-assume: "arn:aws:iam::878654265857:role/sagebase-github-oidc-sage-bionetworks-schematic-infra" role-session-name: ${{ github.repository_owner }}-${{ github.event.repository.name }}-${{ github.run_id }} environment: "prod" - secrets-location: "ssm" diff --git a/.github/workflows/deploy-stage.yaml b/.github/workflows/deploy-stage.yaml index b3867e0..338b95d 100644 --- a/.github/workflows/deploy-stage.yaml +++ b/.github/workflows/deploy-stage.yaml @@ -16,4 +16,3 @@ jobs: role-to-assume: "arn:aws:iam::878654265857:role/sagebase-github-oidc-sage-bionetworks-schematic-infra" role-session-name: ${{ github.repository_owner }}-${{ github.event.repository.name }}-${{ github.run_id }} environment: "stage" - secrets-location: "ssm" From 294472cdff97e3523b49aca3ebd65dec07ab46dd Mon Sep 17 00:00:00 2001 From: Khai Do Date: Thu, 7 Nov 2024 07:47:20 -0800 Subject: [PATCH 4/8] update docs for secrets manager --- README.md | 29 +++++++++++++++-------------- src/service_stack.py | 1 + 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index af12f5b..7bd4981 100644 --- a/README.md +++ b/README.md @@ -142,28 +142,29 @@ Once created take the ARN of the certificate and add it to a context in cdk.json # Secrets -Secrets can be manually created in the [AWS SSM parameter store](./docs/aws-parameter-store.png) -Then it can be retrieved using the `get_ssm_secret` method in [utils.py](./src/utils.py). +Secrets can be manually created in the +[AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) -Parameter store references can be passed into the ServiceProp objects: +To pass secrets to a container set the secrets manager `secret name` +when creating a ServiceProp objects: ```python app_service_props = ServiceProps( - "app", 443, 1024, f"ghcr.io/sage-bionetworks/app:v0.1.90-beta", - { - "MARIADB_USER": utils.get_ssm_secret("/app/dev/MARIADB_USER"), - "MARIADB_PASSWORD": utils.get_ssm_secret("/app/dev/MARIADB_PASSWORD") - }, + "app", 443, 1024, f"ghcr.io/sage-bionetworks/app:v1.0", container_env_vars={}, + container_secret_name="app/dev/DATABASE" ) ``` -where the values of these KVs (e.g. `/app/dev/MARIADB_PASSWORD`) refer to SSM parameter which -must be created manually. - -![AWS secrets manager](docs/aws-parameter-store.png) +For example, the KVs for `app/dev/DATABASE` could be: +```json +{ + "DATABASE_USER": "maria", + "DATABASE_PASSWORD": "password" +} +``` > [!NOTE] -> Retrieving secrets requires access to the AWS Service Systems Manager +> Retrieving secrets requires access to the AWS Secrets Manager # Deployment @@ -171,7 +172,7 @@ must be created manually. There are a few items that need to be manually bootstrapped before deploying the application. -* Add secrets to the AWS System Manager parameter store +* Add secrets to the AWS Secrets Manager * Create an [ACM certificate for the application](#Certificates) using the AWS Certificates Manager * Add the Certificate ARN to the cdk.json * Update references to the docker images in [app.py](app.py) diff --git a/src/service_stack.py b/src/service_stack.py index f0f780b..82fdb7b 100644 --- a/src/service_stack.py +++ b/src/service_stack.py @@ -75,6 +75,7 @@ def __init__( image = ecs.ContainerImage.from_asset(location) def _get_secret(scope: Construct, id: str, name: str) -> sm.Secret: + """Get a secret from the AWS secrets manager""" isecret = sm.Secret.from_secret_name_v2(scope, id, name) return ecs.Secret.from_secrets_manager(isecret) From 496cd98ba8df00a1b75dce7a12754756cc075f1e Mon Sep 17 00:00:00 2001 From: Khai Do Date: Thu, 7 Nov 2024 09:55:52 -0800 Subject: [PATCH 5/8] update path for health check --- app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.py b/app.py index 7ef7a9c..ab27c08 100644 --- a/app.py +++ b/app.py @@ -56,7 +56,7 @@ app_service_props, load_balancer_stack.alb, certificate_arn, - health_check_path="/v1/ui/", + health_check_path="/health", health_check_interval=5, ) From 8fe8ed2abf71506950d48b15d4953fe76d09459c Mon Sep 17 00:00:00 2001 From: Khai Do Date: Thu, 7 Nov 2024 18:09:24 -0800 Subject: [PATCH 6/8] update listner port The schematic app is running on the https port in the container therefore we need to update the load balancer's https listener to forward to the same port. --- src/service_stack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/service_stack.py b/src/service_stack.py index 82fdb7b..40c60e4 100644 --- a/src/service_stack.py +++ b/src/service_stack.py @@ -179,7 +179,7 @@ def __init__( https_listener.add_targets( "HttpsTarget", port=props.container_port, - protocol=elbv2.ApplicationProtocol.HTTP, + protocol=elbv2.ApplicationProtocol.HTTPS, targets=[self.service], health_check=elbv2.HealthCheck( path=health_check_path, interval=duration.minutes(health_check_interval) From 3fd285a2105e4a2c881a9ebef91e48c0d6fafdf4 Mon Sep 17 00:00:00 2001 From: Khai Do Date: Sat, 9 Nov 2024 10:06:12 -0800 Subject: [PATCH 7/8] lower container memory --- app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.py b/app.py index ab27c08..cd824fc 100644 --- a/app.py +++ b/app.py @@ -42,7 +42,7 @@ app_service_props = ServiceProps( "schematic-app", 443, - 4096, + 1024, "ghcr.io/sage-bionetworks/schematic:v0.1.90-beta", {}, "schematic-dev-DockerFargateStack/dev/ecs", From 4069f61a647a568c701c78f098b9c7a4e03fcc39 Mon Sep 17 00:00:00 2001 From: Khai Do Date: Mon, 11 Nov 2024 14:48:48 -0800 Subject: [PATCH 8/8] move all variables to app.py --- README.md | 39 ++++++++-------------- app.py | 62 ++++++++++++++++++++++++++--------- cdk.json | 26 +-------------- docs/aws-parameter-store.png | Bin 121207 -> 0 bytes src/utils.py | 23 ------------- 5 files changed, 60 insertions(+), 90 deletions(-) delete mode 100644 docs/aws-parameter-store.png delete mode 100644 src/utils.py diff --git a/README.md b/README.md index 7bd4981..14ec428 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ execute the validations by running `pre-commit run --all-files`. Verify CDK to Cloudformation conversion by running [cdk synth]: ```console -cdk synth +ENV=dev cdk synth ``` The Cloudformation output is saved to the `cdk.out` folder @@ -99,23 +99,18 @@ python -m pytest tests/ -s -v # Environments -Deployment context is set in the [cdk.json](cdk.json) file. An `ENV` environment variable must be -set to tell the CDK which environment's variables to use when synthesising or deploying the stacks. -The deployment context is the place to set infrastructure variables. +An `ENV` environment variable must be set when running the `cdk` command tell the +CDK which environment's variables to use when synthesising or deploying the stacks. -Set an environment in cdk.json in `context` section of cdk.json: +Set environment variables for each environment in the [app.py](./app.py) file: -```json - "context": { - "dev": { - "VPC_CIDR": "10.254.192.0/24", - "FQDN": "dev.schematic.io" - }, - "prod": { - "VPC_CIDR": "10.254.194.0/24", - "FQDN": "prod.schematic.io" - }, - } +```python +environment_variables = { + "VPC_CIDR": "10.254.192.0/24", + "FQDN": "dev.schematic.io", + "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:XXXXXXXXXXX:certificate/0e9682f6-3ffa-46fb-9671-b6349f5164d6", + "TAGS": {"CostCenter": "NO PROGRAM / 000000"}, +} ``` For example, synthesis with the `prod` environment variables: @@ -128,15 +123,7 @@ ENV=prod cdk synth Certificates to set up HTTPS connections should be created manually in AWS certificate manager. This is not automated due to AWS requiring manual verification of the domain ownership. -Once created take the ARN of the certificate and add it to a context in cdk.json. - -```json - "context": { - "dev": { - "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:XXXXXXXXX:certificate/76ed5a71-4aa8-4cc1-9db6-aa7a322ec077" - } - } -``` +Once created take the ARN of the certificate and set that ARN in environment_variables. ![ACM certificate](docs/acm-certificate.png) @@ -174,7 +161,7 @@ There are a few items that need to be manually bootstrapped before deploying the * Add secrets to the AWS Secrets Manager * Create an [ACM certificate for the application](#Certificates) using the AWS Certificates Manager -* Add the Certificate ARN to the cdk.json +* Update environment_variables in [app.py](app.py) with variable specific to each environment. * Update references to the docker images in [app.py](app.py) (i.e. `ghcr.io/sage-bionetworks/app-xxx:`) * (Optional) Update the `ServiceProps` objects in [app.py](app.py) with parameters specific to diff --git a/app.py b/app.py index cd824fc..ee0da59 100644 --- a/app.py +++ b/app.py @@ -1,34 +1,63 @@ import aws_cdk as cdk -import src.utils as utils +from os import environ from src.network_stack import NetworkStack from src.ecs_stack import EcsStack from src.service_stack import LoadBalancedServiceStack from src.load_balancer_stack import LoadBalancerStack from src.service_props import ServiceProps -# get the environment -environment = utils.get_environment() +# get the environment and set environment specific variables +VALID_ENVIRONMENTS = ["dev", "stage", "prod"] +environment = environ.get("ENV") +match environment: + case "prod": + environment_variables = { + "VPC_CIDR": "10.254.194.0/24", + "FQDN": "prod.schematic.io", + "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:878654265857:certificate/d11fba3c-1957-48ba-9be0-8b1f460ee970", + "TAGS": {"CostCenter": "NO PROGRAM / 000000"}, + } + case "stage": + environment_variables = { + "VPC_CIDR": "10.254.193.0/24", + "FQDN": "stage.schematic.io", + "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:878654265857:certificate/d11fba3c-1957-48ba-9be0-8b1f460ee970", + "TAGS": {"CostCenter": "NO PROGRAM / 000000"}, + } + case "dev": + environment_variables = { + "VPC_CIDR": "10.254.192.0/24", + "FQDN": "dev.schematic.io", + "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:631692904429:certificate/0e9682f6-3ffa-46fb-9671-b6349f5164d6", + "TAGS": {"CostCenter": "NO PROGRAM / 000000"}, + } + case _: + valid_envs_str = ",".join(VALID_ENVIRONMENTS) + raise SystemExit( + f"Must set environment variable `ENV` to one of {valid_envs_str}" + ) + stack_name_prefix = f"schematic-{environment}" +environment_tags = environment_variables["TAGS"] +# Define stacks cdk_app = cdk.App() -context_vars = cdk_app.node.try_get_context(environment) -fully_qualified_domain_name = context_vars["FQDN"] -subdomain, domain = fully_qualified_domain_name.split(".", 1) -vpc_cidr = context_vars["VPC_CIDR"] -certificate_arn = context_vars["CERTIFICATE_ARN"] -env_tags = context_vars["TAGS"] # recursively apply tags to all stack resources -if env_tags: - for key, value in env_tags.items(): +if environment_tags: + for key, value in environment_tags.items(): cdk.Tags.of(cdk_app).add(key, value) -# Generate stacks -network_stack = NetworkStack(cdk_app, f"{stack_name_prefix}-network", vpc_cidr) +network_stack = NetworkStack( + cdk_app, f"{stack_name_prefix}-network", environment_variables["VPC_CIDR"] +) ecs_stack = EcsStack( - cdk_app, f"{stack_name_prefix}-ecs", network_stack.vpc, fully_qualified_domain_name + cdk_app, + f"{stack_name_prefix}-ecs", + network_stack.vpc, + environment_variables["FQDN"], ) # From AWS docs https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect-concepts-deploy.html @@ -45,7 +74,7 @@ 1024, "ghcr.io/sage-bionetworks/schematic:v0.1.90-beta", {}, - "schematic-dev-DockerFargateStack/dev/ecs", + f"{stack_name_prefix}-DockerFargateStack/{environment}/ecs", ) app_service_stack = LoadBalancedServiceStack( @@ -55,9 +84,10 @@ ecs_stack.cluster, app_service_props, load_balancer_stack.alb, - certificate_arn, + environment_variables["CERTIFICATE_ARN"], health_check_path="/health", health_check_interval=5, ) +# Generate stacks cdk_app.synth() diff --git a/cdk.json b/cdk.json index f1fd3af..e3088fe 100644 --- a/cdk.json +++ b/cdk.json @@ -62,30 +62,6 @@ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true, - "@aws-cdk/aws-eks:nodegroupNameAttribute": true, - "dev": { - "VPC_CIDR": "10.254.192.0/24", - "FQDN": "dev.schematic.io", - "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:631692904429:certificate/0e9682f6-3ffa-46fb-9671-b6349f5164d6", - "TAGS": { - "CostCenter": "NO PROGRAM / 000000" - } - }, - "stage": { - "VPC_CIDR": "10.254.193.0/24", - "FQDN": "stage.schematic.io", - "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:878654265857:certificate/d11fba3c-1957-48ba-9be0-8b1f460ee970", - "TAGS": { - "CostCenter": "NO PROGRAM / 000000" - } - }, - "prod": { - "VPC_CIDR": "10.254.194.0/24", - "FQDN": "prod.schematic.io", - "CERTIFICATE_ARN": "arn:aws:acm:us-east-1:878654265857:certificate/d11fba3c-1957-48ba-9be0-8b1f460ee970", - "TAGS": { - "CostCenter": "NO PROGRAM / 000000" - } - } + "@aws-cdk/aws-eks:nodegroupNameAttribute": true } } diff --git a/docs/aws-parameter-store.png b/docs/aws-parameter-store.png deleted file mode 100644 index 5b6a91f5ad71bdd6614046a86ed223dd35bb06bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121207 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 OKb41?ipBDlVgCU=#g6O% diff --git a/src/utils.py b/src/utils.py deleted file mode 100644 index 5d0447d..0000000 --- a/src/utils.py +++ /dev/null @@ -1,23 +0,0 @@ -from os import environ - - -def get_environment() -> str: - """ - The `ENV` environment variable's value represents the deployment - environment (dev, stage, prod, etc..). This method gets the `ENV` - environment variable's value - """ - VALID_ENVS = ["dev", "stage", "prod"] - - env_environment_var = environ.get("ENV") - if env_environment_var is None: - environment = "dev" # default environment - elif env_environment_var in VALID_ENVS: - environment = env_environment_var - else: - valid_envs_str = ",".join(VALID_ENVS) - raise SystemExit( - f"Must set environment variable `ENV` to one of {valid_envs_str}" - ) - - return environment