Handling % character in remote resource names


Just wondering if there’s and easy way to handle resource names with % character in the name.

When trying to provision a google pubsub subscription “hello%world”. Terraform creates the resource fine, but then subsequent changes error out showing this error - `Error: Error when reading or editing Subscription: - : invalid URL escape “%wo”. I know it’s not ideal to have % in the name. But we have a number of production resources that have this naming convention and now it’s quite an effort to recreate them.

I have tried urlencode for the resource name, but the problem persists.


Hi @vikas.saroha ,

Unfortunately, there are constraints about Terraform resource names as specified in the documentation in the last Note of the resource syntax paragraph
Here is an extract :

Note: Resource names must start with a letter or underscore, and may contain only letters, digits, underscores, and dashes.

The Terraform resource name can be different from its name in the managed backend. I don’t know much about google pubsub subscription. But if I take the example of an AWS EC2 instance : The VM name can be vm001 in the AWS console and in terraform I can have the following block

resource "aws_instance" "vm-001" {
  tags = {
    Name = "vm%001"

Thanks for your reply @bassam.benhamouda. Sorry I should have clarified, the resource name I was referring to is for a remote resource on GCP.

resource "google_pubsub_subscription" "hello-world" {
  name = urlencode("hello%world")

The resource could be created with terraform apply but any subsequent changes to it aren’t possible as it throws this error - invalid URL escape “%wo”.

│ Error: Error when reading or editing Subscription: parse "https://pubsub.googleapis.com/v1/projects/abcd-144234/subscriptions/hello%world": invalid URL escape "%wo"

So the issue is with the attribute name of the resource google_pubsub_subscription.
The provider documentation do not state any limitation regarding the characters to use for the attribute :

name - (Required) Name of the subscription.

The Google API documentation do not state any limitation either :

Required. Name of the subscription. Format is projects/{project}/subscriptions/{sub}.

Looks like a bug to me (or may be a non documented limitation), you might want to open an issue in the google provider github

1 Like