Want to deploy a Google Cloud Run service via Terraform

I want to deploy a google cloud run service using terraform. When I try to deploy via 'port' block for defining the container port, getting error, I have to pass the container port from template tag but unable to do that. Here is my .tf file -

resource "google_cloud_run_service" "default" { name = "cloudrun-srv" location = "us-central1" template { spec { containers { image = "" port { container_port = 19006 } } } } traffic { percent = 100 latest_revision = true }
}
data "google_iam_policy" "noauth" { binding { role = "roles/run.invoker" members = [ "allUsers", ] }
}
resource "google_cloud_run_service_iam_policy" "noauth" { location = google_cloud_run_service.default.location project = google_cloud_run_service.default.project service = google_cloud_run_service.default.name policy_data = data.google_iam_policy.noauth.policy_data
}
output "url" { value = "${google_cloud_run_service.default.status[0].url}"
}

With the port tag, here is the error -enter image description here

And if I not pass the Port block, here is the error - enter image description here

I have to pass the container port value as 19006 because of my container is running on that port only. How I pass the container port 19006 instead of default port 8080.enter image description here

3

3 Answers

I had a look at REST API exposed by Google for creating a Cloud Run service.

This starts with the entry here:

POST

where the body contains a Service.

which contains a ServiceSpec

which contains a RevisionRemplate

which contains a RevisionSpec

which contains a Container

which contains a ContainerPort

If we now map this to the source of the Terraform extension to handle creation of Cloud Run Services, we find:

and in the comments, we find the following:

In the context of a Revision, we disallow a number of the fields of this Container, including: name, ports, and volumeMounts. The runtime contract is documented here:

While name and volumeMounts seems ok to me at this point, I'm not sensing the reason that ports are not mapped.

From this though, I seem to see that the inability to specify a port through Terraform seems to be explicit as opposed to an omission. I also seem to see that the ability to specify a port is indeed present in the REST API at Google.

I was then going to suggest that you raise a defect through Github but then wondered if it was already present. I did some digging and there is already a request for the missing feature:

Allow specifying 'container_port' and 'request_timeout' for google_cloud_run_service

My belief is that the core answer to your question then becomes:

What you are trying to do should work with Terraform and has been raised as an issue and we must wait for the resolution in the Terraform provider.

2

The block should be ports (i.e. plural), not port

I needed to expose port 9000 and solved it this way:

resource "google_cloud_run_service" "service" { ... template { spec { containers { ... ports { container_port = 9000 } } } }
}
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like