visual-studio-codegoogle-cloud-platformgcloudvscode-remote

How to connect VSCode to GCP instances


I am trying to connect VSCode to my GCP instances but am unable to. From a terminal, I can ssh into the machines with gcloud compute ssh my_machine_name but I'm not sure how to translate that into what VSCode Remote-SSH is looking for. When I created the config in VSCode I did this:

Host my_machine_name
    HostName my_machine_name
    User me@my_company.com

But the HostName is wrong because it's just the name of the machine and not the full HostName or IP address. I haven't even told VSCode that it's a GCP instance. How do I find the HostName? I imagine there's a connection between my_machine_name and the true HostName somewhere in my configs, but I can't find it. I found a GCP-Service.json file with the following keys:

{
  "type": 
  "project_id": 
  "private_key_id": 
  "private_key": 
  "client_email": 
  "client_id": 
  "auth_uri": 
  "token_uri": 
  "auth_provider_x509_cert_url": 
  "client_x509_cert_url": 
}

but I don't see anything that looks like a HostName or IP address.

Just to see, I tried to connect and got the following error:

Could not establish connection to "my_machine_name": Permission denied (publickey).

(Note sure if this is relevant but sometimes when I first try to connect I get the following, but after I click "Retry" it goes back to the publickey message again):

"Could not establish connection to "my_machine_name": Remote host key has changed, port forwarding is disabled."

So I tried to add a private key like so:

Host my_machine
    HostName my_machine
    User user@my_company.com
    IdentityFile ~/.ssh/id_rsa

I also tried the private key from my GCP-Service.json file as well but got the same result. What am I supposed to do to connect VSCode to my GCP instance?


Solution

  • Per my comment, this is straightforward and worked for me.

    Assuming:

    PROJECT=[[YOUR-PROJECT]]
    INSTANCE=[[YOUR-INSTANCE]]
    ZONE=[[YOUR-ZONE]]
    

    This is slightly hacky but either:

    USER=$(\
      gcloud compute ssh ${INSTANCE} \
      --zone=${ZONE} \
      --project=${PROJECT} \
      --command "whoami") && echo ${USER}
    

    Or:

    gcloud auth list --format="value(account)"
    [[USER]]@[[DOMAIN]]
    

    And:

    IP=$(\
      gcloud compute instances describe ${INSTANCE} \
      --zone=${ZONE} \
      --project=${PROJECT} \
      --format='value(networkInterfaces[0].accessConfigs[0].natIP)') && echo ${IP}
    

    NOTE the above assumes a single network interface and a public IP

    Then, replacing the values with the above:

    Host compute_engine
        HostName [[IP]]
        IdentityFile ~/.ssh/google_compute_engine
        User [[USER]]
        Port 22