blob: 30e3f23bf287f590bf6065dc655b31fdd122fbe6 [file] [log] [blame] [view]
# Gerrit Single Primary
This set of Templates provide all the components to deploy a single Gerrit primary
in ECS
## Architecture
Three templates are provided in this example:
* `cf-cluster`: define the ECS cluster and the networking stack
* `cf-service`: defined the service stack running Gerrit
* `cf-dns-route`: defined the DNS routing for the service
### Data persistency
* EBS volumes for:
* Indexes
* Caches
* Data
* Git repositories
### Deployment type
* Latest Gerrit version deployed using the official [Docker image](https://hub.docker.com/r/gerritcodereview/gerrit)
* Application deployed in ECS on a single EC2 instance
### Logging
* All the logs are forwarded to AWS CloudWatch in the LogGroup with the cluster
stack name. Please refer to the general [logging documentation](../README.md#logging)
for further information on logging.
### Monitoring
* Standard CloudWatch monitoring metrics for each component
* Application level CloudWatch monitoring can be enabled as described [here](../Configuration.md#cloudwatch-monitoring)
* Prometheus and Grafana stack is not available for this recipe yet. However the work has been done for
the dual-primary recipe and it could be easily adapted (you can find the relevant issue
[here](https://bugs.chromium.org/p/gerrit/issues/detail?id=13092)).
## How to run it
You can find [on GerritForge's YouTube Channel](https://www.youtube.com/watch?v=zr2zCSuclIU) a
step-by-step guide on how to setup you Gerrit Code Review in AWS.
However, keep reading this guide for a more exhaustive explanation.
### 0 - Prerequisites
Follow the steps described in the [Prerequisites](../Prerequisites.md) section.
Additionally, whilst it is possible to do so by using an admin user, consider
limiting access only to what is required by using a dedicated role or user to do
so.
### 1 - Configuration
Please refer to the [configuration docs](../Configuration.md) to understand how to set up the
configuration and what common configuration values are needed.
On top of that, you might set the additional parameters, specific for this recipe.
#### Environment
Configuration values affecting deployment environment and cluster properties
* `SERVICE_STACK_NAME`: Optional. Name of the service stack. `gerrit-service` by default.
* `GERRIT_INSTANCE_ID`: Optional. Identifier for the Gerrit instance. "gerrit-single-primary" by default.
* `GERRIT_VOLUME_ID` : Optional. Id of an extisting EBS volume. If empty, a new volume
for Gerrit data will be created
* `GERRIT_VOLUME_SNAPSHOT_ID` : Optional. Ignored if GERRIT_VOLUME_ID is not empty. Id of
the EBS volume snapshot used to create new EBS volume for Gerrit data.
* `GERRIT_VOLUME_SIZE_IN_GIB`: Optional. The size of the Gerrit data volume, in GiBs. `10` by default.
### 2 - Deploy
* Create the cluster, service and DNS routing stacks:
```
make [AWS_REGION=a-valid-aws-region] [AWS_PREFIX=some-cluster-prefix] create-all
```
The optional `AWS_REGION` and `AWS_REFIX` allow you to define where it will be deployed and what it will be named.
It might take several minutes to build the stack.
You can monitor the creations of the stacks in [CloudFormation](https://console.aws.amazon.com/cloudformation/home)
* *NOTE*: the creation of the cluster needs an EC2 key pair are useful when you need to connect
to the EC2 instances for troubleshooting purposes. The key pair is automatically generated
and stored in a `pem` file on the current directory.
To use when ssh-ing into your instances as follow: `ssh -i cluster-keys.pem ec2-user@<ec2_instance_ip>`
### Cleaning up
```
make [AWS_REGION=a-valid-aws-region] [AWS_PREFIX=some-cluster-prefix] delete-all
```
The optional `AWS_REGION` and `AWS_REFIX` allow you to specify exactly which stack you target for deletion.
Note that this will *not* delete:
* Secrets stored in Secret Manager
* SSL certificates
* ECR repositories
### Access your Gerrit
The Gerrit instance will be available at two different URLs, to handle HTTP and
SSH traffic respectively:
* HTTP traffic: `https://<HTTP_SUBDOMAIN>.<HOSTED_ZONE_NAME>:443`
* SSH traffic: `ssh://<SSH_SUBDOMAIN>.<HOSTED_ZONE_NAME>:29418`
### External Services
If you need to setup some external services (maybe for testing purposes, such as SMTP or LDAP),
you can follow the instructions [here](../README.md#external-services)
### Docker
Refer to the [Docker](../Docker.md) section for information on how to setup docker or how to publish images
### Permissions
In order to deploy and destroy a single-primary recipe the invoking user needs to
have the relevant permissions to perform actions on AWS resources.
The list of actions can be found [here](resources/permission.policy.json).
The document can be used to create a permission policy directly in AWS.
The policy then needs to be attached to the invoking user group or alternatively
to the invoking user directly.