diff options
author | Christopher Baines <mail@cbaines.net> | 2019-05-27 21:35:53 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2019-05-30 08:33:03 +0100 |
commit | 859302774c4d719cf949f419d0efcfd8cbad6ca2 (patch) | |
tree | a83c053f6a0e95554ea30784caf2837eb6837179 /app/controllers | |
parent | 1acde9a21a50f4227930afb5b6b9eda1cace54b8 (diff) | |
download | govuk-mini-environment-admin-859302774c4d719cf949f419d0efcfd8cbad6ca2.tar govuk-mini-environment-admin-859302774c4d719cf949f419d0efcfd8cbad6ca2.tar.gz |
Add a new AWS backend using Amazon Machine Images
The existing AWS backend uses system containers backed on to the AWS
hosted NFS service (EFS). This has some advantages, but also some
disadvantages.
Using the EFS service allows building a container on one instance,
with the state being held on the EFS, and then launching a new
instance to run the container. Using EFS also provides persistence, at
least beyond individual EC2 instances.
However, build performance when using EFS is poor compared with a
local store without the overhead of the network latency. Additionally,
the startup speed of the container running off EFS is slow compared to
local storage.
This backend doesn't use EFS, instead the Guix store sits on instance
storage. Rather than using a system container for a Mini Environment,
an Amazon Machine Image (AMI) is built instead. The fast local storage
makes builds faster, and using EBS storage for the Mini Envirnoments
as well as not having the overhead of starting Ubuntu, then starting
the container also makes startup faster.
Diffstat (limited to 'app/controllers')
-rw-r--r-- | app/controllers/backends/terraform_aws_using_ami_controller.rb | 118 | ||||
-rw-r--r-- | app/controllers/govuk_guix/revisions_controller.rb | 3 |
2 files changed, 120 insertions, 1 deletions
diff --git a/app/controllers/backends/terraform_aws_using_ami_controller.rb b/app/controllers/backends/terraform_aws_using_ami_controller.rb new file mode 100644 index 0000000..9fbe115 --- /dev/null +++ b/app/controllers/backends/terraform_aws_using_ami_controller.rb @@ -0,0 +1,118 @@ +# GOV.UK Mini Environment Admin +# Copyright © 2018, 2019 Christopher Baines <mail@cbaines.net> +# +# This file is part of the GOV.UK Mini Environment Admin. +# +# The GOV.UK Mini Environment Admin is free software: you can +# redistribute it and/or modify it under the terms of the GNU Affero +# General Public License as published by the Free Software Foundation, +# either version 3 of the License, or (at your option) any later +# version. +# +# The GOV.UK Mini Environment Admin is distributed in the hope that it +# will be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public +# License along with the GOV.UK Mini Environment Admin. If not, see +# <http://www.gnu.org/licenses/>. + +class Backends::TerraformAwsUsingAmiController < ApplicationController + def new + @backend = Backends::TerraformAws.new + end + + def create + backend = Backends::TerraformAwsUsingAmi.create(create_params) + + flash[:success] = "Backend #{backend.label} created" + + redirect_to terraform_aws_using_ami_backend_path(backend) + end + + def update + @backend = Backends::TerraformAwsUsingAmi.update( + params[:id], + update_params + ) + + flash[:success] = "Backend #{@backend.label} updated" + + render :show + end + + def show + @backend = Backends::TerraformAwsUsingAmi.find(params[:id]) + end + + def destroy + backend = Backends::TerraformAwsUsingAmi.find(params[:id]) + + if @backend.mini_environments.empty? + flash[:success] = "Backend #{backend.label} deleted" + backend.delete + else + flash[:error] = "Unable to delete backend, as mini environments using this backend still exist." + end + + redirect_to setup_path + end + + def perform_action + @backend = Backends::TerraformAwsUsingAmi.find(params['id']) + + action = params.require(:commit) + + case action + when 'Destroy' + Backends::TerraformAwsUsingAmiJob.enqueue(@backend.id, :destroy_backend) + + flash[:notice] = 'Destroying the backend' + when 'Stop' + Backends::TerraformAwsUsingAmiJob.enqueue(@backend.id, :stop_backend) + + flash[:notice] = 'Stopping the backend' + when 'Deploy' + Backends::TerraformAwsUsingAmiJob.enqueue(@backend.id, :deploy_backend) + + flash[:notice] = 'Deploying the backend' + when 'Refresh state' + Backends::TerraformAwsUsingAmiJob.enqueue(@backend.id, :refresh_backend_state) + + flash[:notice] = 'Refreshing the backend state information' + else + flash[:error] = "Unknown action #{action}" + end + + redirect_to terraform_aws_using_ami_backend_path(@backend) + end + + private + + def create_params + params + .require(:backends_terraform_aws) + .permit( + :label, + :domain, + :aws_region, + :vpc_id, + :route_53_zone_id, + :aws_access_key_id, + :aws_secret_access_key, + :ssh_public_key, + :ssh_private_key + ) + end + + def update_params + params + .require(:backends_terraform_aws) + .permit( + :label, + :aws_access_key_id, + :aws_secret_access_key + ) + end +end diff --git a/app/controllers/govuk_guix/revisions_controller.rb b/app/controllers/govuk_guix/revisions_controller.rb index e4e1b52..1544bc1 100644 --- a/app/controllers/govuk_guix/revisions_controller.rb +++ b/app/controllers/govuk_guix/revisions_controller.rb @@ -40,7 +40,8 @@ class GovukGuix::RevisionsController < ApplicationController options = {} else # Assume that the AWS backend is in use - backend = Backends::TerraformAws.first + backend = Backends::TerraformAwsUsingAmi.first || + Backends::TerraformAws.first options = { backend_type_and_id: backend.type_and_id |