diff --git a/.github/scripts/pre-commit.sh b/.github/scripts/pre-commit.sh index d9a1358aa3..71140331a1 100755 --- a/.github/scripts/pre-commit.sh +++ b/.github/scripts/pre-commit.sh @@ -60,9 +60,9 @@ runShellCheckForCommitFiles() { filename=$(basename -- "$file") extension="${filename##*.}" - # Skip binary formats + # Skip binary formats and groovy files case "$extension" in - "zip" | "p12" | "pfx" | "cer" | "pem" | "png" | "jpg") + "zip" | "p12" | "pfx" | "cer" | "pem" | "png" | "jpg" | "groovy") continue ;; *) ;; esac diff --git a/apps/utils/locust_tests/lambda/server-regression/app.py b/apps/utils/locust_tests/lambda/server-regression/app.py index 4dd95902fa..8af274e8d0 100644 --- a/apps/utils/locust_tests/lambda/server-regression/app.py +++ b/apps/utils/locust_tests/lambda/server-regression/app.py @@ -153,6 +153,9 @@ def handler(event, context): cert = get_ssm_parameter( f"/bfd/{environment}/server/sensitive/server_regression_cert", with_decrypt=True ) + green_port = get_ssm_parameter( + f"/bfd/{environment}/server/nonsensitive/lb_green_ingress_port" + ) except ValueError as exc: send_pipeline_signal( signal_queue_url=signal_queue_url, @@ -191,7 +194,7 @@ def handler(event, context): [ "locust", f"--locustfile=/var/task/{invoke_event.suite_version}/{locust_file}", - f"--host={invoke_event.host}", + f"--host={invoke_event.host}:{green_port}", f"--users={invoke_event.users}", f"--spawn-rate={invoke_event.spawn_rate}", f"--spawned-runtime={invoke_event.spawned_runtime}", diff --git a/ops/jenkins/global-pipeline-libraries/vars/awsElb.groovy b/ops/jenkins/global-pipeline-libraries/vars/awsElb.groovy index 99ff8f9d18..d6b0cec487 100644 --- a/ops/jenkins/global-pipeline-libraries/vars/awsElb.groovy +++ b/ops/jenkins/global-pipeline-libraries/vars/awsElb.groovy @@ -2,7 +2,8 @@ // awsElb.groovy contains methods that wrap awscli elb subcommands // Returns the Elastic Load Balancer's DNSName for the given environment +// See ops/terraform/services/server/modules/bfd_server_asg/main.tf for NLB definition and naming scheme String getElbDnsName(String environment) { - elbDnsName = sh(returnStdout: true, script: "aws elb describe-load-balancers --load-balancer-names bfd-${environment}-fhir --query 'LoadBalancerDescriptions[0].DNSName' --output text").trim() + elbDnsName = sh(returnStdout: true, script: "aws elbv2 describe-load-balancers --names bfd-${environment}-fhir-nlb --query 'LoadBalancer[0].DNSName' --output text").trim() return elbDnsName } diff --git a/ops/terraform/services/base/values/ephemeral.yaml b/ops/terraform/services/base/values/ephemeral.yaml index fdaf0f78fa..67be013c93 100644 --- a/ops/terraform/services/base/values/ephemeral.yaml +++ b/ops/terraform/services/base/values/ephemeral.yaml @@ -47,8 +47,8 @@ /bfd/${env}/server/nonsensitive/pac/claim_source_types: fiss,mcs /bfd/${env}/server/nonsensitive/c4dic/enabled: "false" /bfd/${env}/server/nonsensitive/lb_is_public: false -/bfd/${env}/server/nonsensitive/lb_ingress_port: 443 -/bfd/${env}/server/nonsensitive/lb_egress_port: 7443 +/bfd/${env}/server/nonsensitive/lb_blue_ingress_port: 443 +/bfd/${env}/server/nonsensitive/lb_green_ingress_port: 7443 /bfd/${env}/server/nonsensitive/launch_template_volume_iops: 3000 /bfd/${env}/server/nonsensitive/launch_template_volume_size_gb: 60 /bfd/${env}/server/nonsensitive/launch_template_volume_throughput: 250 diff --git a/ops/terraform/services/base/values/prod-sbx.yaml b/ops/terraform/services/base/values/prod-sbx.yaml index 1e9174f4ff..b78c163169 100644 --- a/ops/terraform/services/base/values/prod-sbx.yaml +++ b/ops/terraform/services/base/values/prod-sbx.yaml @@ -136,8 +136,8 @@ /bfd/${env}/server/nonsensitive/heathcheck/testing_bene_id: "-88888888888888" /bfd/${env}/server/nonsensitive/paths/files/war: UNDEFINED /bfd/${env}/server/nonsensitive/lb_is_public: "true" -/bfd/${env}/server/nonsensitive/lb_ingress_port: "443" -/bfd/${env}/server/nonsensitive/lb_egress_port: "7443" +/bfd/${env}/server/nonsensitive/lb_blue_ingress_port: "443" +/bfd/${env}/server/nonsensitive/lb_green_ingress_port: "7443" /bfd/${env}/server/nonsensitive/lb_vpc_peerings_json: '[ "bfd-prod-sbx-to-ab2d-dev", "bfd-prod-sbx-to-ab2d-impl", "bfd-prod-sbx-to-ab2d-sbx", "bfd-prod-sbx-to-bcda-dev", "bfd-prod-sbx-to-bcda-test", "bfd-prod-sbx-to-bcda-sbx", "bfd-prod-sbx-to-bcda-opensbx", "bfd-prod-sbx-vpc-to-bluebutton-impl", "bfd-prod-sbx-vpc-to-bluebutton-test", "bfd-prod-sbx-vpc-to-dpc-prod-sbx-vpc", "bfd-prod-sbx-vpc-to-dpc-test-vpc", "bfd-prod-sbx-vpc-to-dpc-dev-vpc" ]' /bfd/${env}/server/nonsensitive/asg_min_instance_count: "3" /bfd/${env}/server/nonsensitive/asg_max_instance_count: "12" diff --git a/ops/terraform/services/base/values/prod.yaml b/ops/terraform/services/base/values/prod.yaml index 3d727a1471..7ede29e492 100644 --- a/ops/terraform/services/base/values/prod.yaml +++ b/ops/terraform/services/base/values/prod.yaml @@ -183,8 +183,8 @@ /bfd/${env}/server/nonsensitive/heathcheck/testing_bene_id: "-88888888888888" /bfd/${env}/server/nonsensitive/paths/files/war: UNDEFINED /bfd/${env}/server/nonsensitive/lb_is_public: "false" -/bfd/${env}/server/nonsensitive/lb_ingress_port: "443" -/bfd/${env}/server/nonsensitive/lb_egress_port: "7443" +/bfd/${env}/server/nonsensitive/lb_blue_ingress_port: "443" +/bfd/${env}/server/nonsensitive/lb_green_ingress_port: "7443" /bfd/${env}/server/nonsensitive/lb_vpc_peerings_json: '[ "bfd-prod-vpc-to-dpc-prod-vpc", "bfd-prod-vpc-to-bluebutton-prod", "bfd-prod-vpc-to-bcda-prod-vpc", "bfd-prod-to-ab2d-prod" ]' /bfd/${env}/server/nonsensitive/asg_min_instance_count: "3" /bfd/${env}/server/nonsensitive/asg_max_instance_count: "12" diff --git a/ops/terraform/services/base/values/test.yaml b/ops/terraform/services/base/values/test.yaml index 1c66d419ec..4031a0287c 100644 --- a/ops/terraform/services/base/values/test.yaml +++ b/ops/terraform/services/base/values/test.yaml @@ -188,8 +188,8 @@ /bfd/${env}/server/nonsensitive/heathcheck/testing_bene_id: "-88888888888888" /bfd/${env}/server/nonsensitive/paths/files/war: UNDEFINED /bfd/${env}/server/nonsensitive/lb_is_public: "false" -/bfd/${env}/server/nonsensitive/lb_ingress_port: "443" -/bfd/${env}/server/nonsensitive/lb_egress_port: "7443" +/bfd/${env}/server/nonsensitive/lb_blue_ingress_port: "443" +/bfd/${env}/server/nonsensitive/lb_green_ingress_port: "7443" /bfd/${env}/server/nonsensitive/lb_vpc_peerings_json: '[ "bfd-test-vpc-to-bluebutton-test" ]' /bfd/${env}/server/nonsensitive/asg_min_instance_count: "3" /bfd/${env}/server/nonsensitive/asg_max_instance_count: "12" diff --git a/ops/terraform/services/server/README.md b/ops/terraform/services/server/README.md index b1a14b4560..af41bfea12 100644 --- a/ops/terraform/services/server/README.md +++ b/ops/terraform/services/server/README.md @@ -15,6 +15,16 @@ terraform apply **NOTE** the above double-invocation of terraform is correct. Two executions of `terraform apply` are necessary to achieve the desired state as of BFD-2558. +## Blue/Green Workflow + +This Terraservice implements the logic and resources necessary to support a Blue/Green Deployment strategy for the BFD Server. + +Blue (`blue`) refers to the "active" or _production_ infrastructure that serves traffic to our consumers. Resources in `blue` are considered to "known-good" resources. Green (`green`) refers to _incoming_, new infrastructure for a _new_ version of the BFD Server that needs to be verified as good before it being promoted to `blue` and made available to serve traffic to our consumers. + +This Terraservice achieves a Blue/Green Deployment strategy by utilizing two AutoScaling Groups, two Target Groups and two Load Balancer Listeners on ports `443` and `7443` that route to the aforementioned Target Groups on different ports. The Listener on port `443` (the reserved HTTPS port) is associated with the `blue` Target Group and the Listener on `7443` is associated with `green`. This way, clients using the default HTTPS port will reach the `blue` BFD Server Instances only, while our automation can reach the `green` Instances by using port `7443`. + +The Terraservice logic decides which AutoScaling Group is associated with the `blue`/`green` Target Group by looking at the oddness/evenness of the _latest_ Launch Template version number _iff_ the Launch Template is changing upon the `terraform apply`. Correspondingly, the ASGs are suffixed with `-odd` and `-even`. Given latest Launch Template version number, if it is _odd_ the ASG suffixed as `-odd` will be chosen as `green` whereas if it is _even_ `-even` will be chosen as `green`. In this scenario, we expect no changes to the existing `blue` ASG nor its Target Group so that it continues to serve traffic uninterrupted. +