blob: b91cf8233d9db12d565df246a1d8dc9d1d8b3d0b [file] [log] [blame] [view]
# Terraform configuration for vuln worker
## External variables
Some inputs to this config are not checked into the repo.
You can provide them on the `terraform` command line,
or create a `terraform.tfvars` file in this directory
with the information, like this one:
```
prod_project = "prod-project"
prod_issue_repo = "org/repo"
prod_client_id = "xyzzy@apps.googleusercontent.com"
dev_project = "dev-project"
dev_issue_repo = "org/dev-repo"
dev_client_id = "abc@@apps.googleusercontent.com"
```
`terraform.tfvars` is in the repo's `.gitignore` file, so it won't show up in
`git status`. **Do not** check it into the repo.
## Cloud Run image
We use terraform to set up the Cloud Run service, but we deploy in other ways.
Our deploy process changes only the Docker image for the service. If we
hardcoded a Docker image into the config, our config would often be out of date
(since we apply it rarely compared to deploying), and we would risk overwriting
a newer image with the old one in the config.
For that reason, the Docker image in the config is obtained from the service
itself, by using a `data` block:
```
resource "google_cloud_run_service" "worker" {
...
template {
spec {
containers {
image = data.google_cloud_run_service.worker.template[0].spec[0].containers[0].image
...
}
data "google_cloud_run_service" "worker" {
name = "${var.env}-vuln-worker"
project = var.project
location = var.region
}
```
This works fine once the service exists, but before it does we have a circularity:
to create the service we need to get the image from the service!
So to create the service:
1. Build and push a Docker image.
2. Replace the `data.google_cloud_run_service.worker` expressions (there are
two) with the actual image label.
3. Run `terraform apply`.
4. Undo the replacement.