This repo contains the landscape specific files for the BU web router. In general updates to this repo are safe to release to in a change restriction period. That is because:
- The version of the base image is date tagged to ensure that no software updates accidently sneak through.
- The config files in this repo are limited to map files
- The CodeBuild part of the release process will run nginx -t to ensure that there are no map errors prior to release.
- The CodePipeline will back out to the old running version if the updated version does not stabilize.
- Use
git pull
to ensure that we are operating with the latest version of the configuration. - Use
git status
to double-check that you are on the correct landscape. If not then dogit checkout landscape
- Edit landscape/LANDSCAPE/maps/sites.map to reflect our map path.
- Use
git status
to double-check status of files. - Use
git diff
to see what changed. - Use
git add
to select files for inclusion. - Use
git commit -m "description"
to commit the change with the description of the change - Use
git push
to push these changes out to the GitHub repo. This will trigger the CodePipeline update. - Watch the CodePipeline release through the web console or cli for any issues.
During initial builds and configuration we are using the tag latest.
- Use
git pull
to ensure that we are operating with the latest version of the configuration. - Use
git status
to double-check status of files. - Edit Dockerfile and change the tag as part of the
FROM dsmk/web-router-base:date
- Use
git status
to double-check status of files. - Use
git diff
to see what changed. - Use
git add
to select files for inclusion. - Use
git commit -m "description"
to commit the change with the description of the change - Use
git push
to push these changes out to the GitHub repo. This will trigger the CodePipeline update. - Watch the CodePipeline release through the web console or cli for any issues.
- Clone a new directory with the landscape name
git clone [email protected]:dsmk/web-router-nonprod.git test
- Cd into the directory and create and checkout the new branch:
cd test; git checkout -b test
- Create the landscape specific subdirectory:
mkdir -p landscape/test/maps
- Copy initial files from a previous landscape except for the sites.map which comes from landscape/common/sites-common.map
- Edit files as appropriate.
- For sites.map, use PHPMAP and the filesystem scan to find things.
This repo has all the data for the BU AWS web front-end proof of concept. The architecture sets up a fairly standard AWS Elastic Container Service (ECS) environment with CloudFront in front of it. The CloudFormation templates are in the aws/ subdirectory but eventually should be in a separate location.
This is still a work in progress and we still need to address the following issues:
-
Patching model for ECS EC2 instances: ECS does not seem to handle this by default. Is the correct approach to use EC2 Systems Manager?
-
Method of updating route configuration: This version bakes the routing into the Docker image and relies upon building a new Docker image when we change the configuration. The CodePipeline makes that more straightforward but a nice to have would be a simple interface to adjust the change as long as it does not add much complexity to the solution.
-
Release mechanism for multiple landscapes: This POC code only handles one landscape (test). I have seen a different approaches to multiple landscapes: 1) Have a single CodePipeline for multiple landscapes with a manual approval step prior to production; 2) Have multiple CodePipelines like the POC based on different repos and/or tags.
-
Approach for handling redirection of both entire subdirectories and singleton URLs: Redirection ideally should be managed by Help Center folks. I have seen a few references to lambda/API gateway and S3 bucket based approaches. If we use those solutions then hopefully the routing table could just have a "redirect" backend that points to the solution.
-
Internal load balancers for backends: Our existing front-ends handle load balancing for the WordPress and Django backends (mod_proxy_balancer Apache 2.2). One refinement would be to have internal application load balancers so all load balancing is handled (and monitored/tracked) by AWS load balancing services. In addition, the WordPress ALB could potentially handle selecting between Application and Asset servers which would simplify this NGINX/HTTPD configuration even more.
The general workflow while we are building the system is to:
-
Update the test/sut/test_app.sh script to test the new functionality with the current Solaris. This involves running the script like so
./test/sut/test_app.sh -S test www-test.bu.edu
- the -S disables the check for upstream headers (only configured in NGINX for now). -
Once that is done then one needs to update the NGINX configuration to implement the same functionality as Solaris. This mainly will involve the *.conf.erb files in the main directory but make involve new environment entries. One can test this on a local build box by running
docker-compose -f www-test.bu.edu.yaml up --build
and then./test/sut/test_app.sh test
This is testing with the normal www-test backends. -
Next the automatic testing needs to be configured. This involves two sets of changes -
autotest-test.yml
docker-compose file and updates to thetest/backend
Docker image. The docker-compose file will create a container to run the tests, an NGINX frontend container, and a test backend container which emulates test responses. The goal of this test framework is to test and minimize regressions in the frontend containers. It is not intended to be a test of whole services. -
One can pretest the automatic testing by doing
docker-compose -f autotest-test.yaml up --build
- if everything is OK then the last line will end "exited with code 0." Control-C to exit from the test and it will stop all the containers set up. The test output is stored in thetest/results/
directory and you can see the specific test that failed by searching forexit code: 1
-
When you are ready to release changes you need to check the changes into Git and push them to GitHub. Here are some common commands: a)
git status
- see which files have been modified, which are new, what is selected for commiting, and the branch. b)git diff [file]
- see what has changed from the last commit. c)git add file
- add a file to the list of things to check in. d)git commit -m 'msg'
- commit added files with the message msg (include INC* and ENC* where appropriate) e)git push
- push the changes to github -
Right now one needs to go to hub.docker.com/r/dsmk/bufe-buedu, select "Build Settings", and select the Trigger to start the build. This will be replaced later. You can see the status of the build by going to "Build Details"
-
Once the new image is done you can replace the existing container by going to the ECS web console, selecting the task we want to modify (bufe-bu.edu-bufe:num), select "Create new revision", and then selecting "Create".
This will take a while to run because ECS will create a new container, add it to the ELB/ALB, and wait for the old one to drain completely before being done. This will be replaced later.
URLs for this process: