I am not going to lie, I struggled with this for a while but finally got it figured out with terraform.
We have to role this out to a large number of projects so I developed a template to automate some of the process.
This main.tf will accomplish a few things:
- Create the correct firewall rule
- Add the proper roles to a user (this has a for_each for adding multiple users)
- Spin up an instance
- Attach the role IAP tunnel user to the instance using an email address
What it doesnt do:
- Currently there is no command to turn on IAP
- To turn on IAP just open it up in the IAM section on GCP (it gets enabled)
- Delete the default firewall rules (setup a local exec to delete them)
Here is what the main.tf looks like:
provider "google-beta" {
project = var.project_id
}
provider "google" {
}
locals {
permis = {
"roles/compute.admin" = "user:ericstumbo@student.purdueglobal.edu",
"roles/iam.serviceAccountUser" = "user:ericstumbo@student.purdueglobal.edu"
}
}
resource "google_project_iam_member" "project" {
project = var.project_id
for_each = local.permis
role = each.key
member = each.value
}
resource "google_compute_firewall" "default" {
project = var.project_id
name = "allow-ssh-from-iap"
network = "default"
source_ranges = ["35.235.240.0/20"]
allow {
protocol = "tcp"
}
}
## Have to add a local-exec to delete default SSH rule
data "google_compute_image" "my_image" {
family = "debian-9"
project = "debian-cloud"
}
resource "google_compute_instance" "default" {
project = "${var.project_id}"
machine_type = "n1-standard-1"
name = "${var.instance_name}"
zone = "${var.zone}"
network_interface {
network = "default"
}
boot_disk {
initialize_params {
image = "${data.google_compute_image.my_image.self_link}"
}
}
}
resource "google_iap_tunnel_instance_iam_member" "instance" {
provider = "google-beta"
instance = "${var.instance_name}"
zone = "${var.zone}"
role = "roles/iap.tunnelResourceAccessor"
member = "user:ericstumbo@student.purdueglobal.edu"
depends_on = [google_compute_instance.default]
}
Now you should be able to use the command
gcloud beta compute ssh {{ instance-name }} --zone {{ instance-zone }} --tunnel-through-iap
I understand that giving the compute Admin role to users can be difficult but this can be accomplished by building a custom role.