Can't connect to VM from Google Cloud Function, but can connect from App Engine. Why is this? - google-app-engine

Context:
VM Instance is essentially a Bastion host to tunnel into another
network for the sake of connecting to a non GCP hosted Database
All 3 resources (Function, Engine, and VM) live within the same GCP
Project
App Engine uses the internal IP address of the VM
I've tried using the external and internal IP address for Google
Cloud Function
Feeding the VM Instance's IP address(es) as the host option when
configuring a mysql connection
Though on App Engine, i'm using the MySQL module within a node server
On the Cloud Function, i'm using the the Python sqlalchemy url
creation module to create the connection
I've been getting a timeout error from the Google Cloud Function trying to connect, no matter how high I set the connection timeout -
I am able to get it to work from a local environment:
By:
SSHing into the VM
Setting host as localhost (and the relevant port)
So I've pinpointed it down to GCFunction failing to talk to the VM instance?

Cloud Functions requires Serverless VPC access to connect to a VPC private IP address.
A key item to understand is that Private (RFC1918) IP addresses are private. RFC1918 addresses do not route outside their network. The same address can exist in multiple networks and VPCs. You must set up a gateway/proxy/tunnel/connector to access a private IP address from another network.
Google Cloud Functions Connecting to a VPC network
Why is it that it works without a VPC for App Engine but a VPC is
required for cloud functions
Which App Engine works (Standard or Flexible)?
App Engine Standard also requires Serverless VPC access to connect to a VPC private IP address. link
For App Engine Flexible, your app is actually deployed on a VM within the VPC. link

Related

Is it possible to connect to a database stored in Google Cloud VM instance from a Google App Engine instance without using a VPC connector?

I have a project running on APP Engine that must connect to a database located on a Google Cloud VM instance. The project works normally when I run it from my local machine but after deployment it can't connect to the database. After some research I found out that we can use a VPC connector, but this is not a free service. As far as I could understand, the VPC connector allows me to use the internal ip instead of an external ip. For me, there would be no problem using an external ip, but I don't know if that's possible (I'm using a standard GAE environment). Is there any other way to make the connection works without using the VPC connector?

Accessing files on FTP server through custom VPN from app deployed on App Engine Flex: doable?

I have the following use case:
Application is deployed on App Engine Flex environment.
Application fetches data from an FTP server on API request.
FTP server can only be accessed through a custom VPN.
Can I access the FTP server from an App Engine Flex environment? If so, what would I need?
Apologies if this is not clear, I am not a network/devOps person.
As a solution, you can connect your on-premises network and application deployed to App Engine Flex via Google Cloud VPN:
Cloud VPN securely connects your peer network to your Google
Cloud (GCP) Virtual Private Cloud (VPC) network through an
IPsec VPN connection. Traffic traveling between the two
networks is encrypted by one VPN gateway, then decrypted by the other
VPN gateway. This protects your data as it travels over the internet.
You can also connect two instances of Cloud VPN to each other.
App Engine Flexible Environment is based on Google Compute Engine and consequently can connect to your remote network via Cloud VPNs. As described in the documentation Configuring your App with app.yaml, you can specify network settings in your app.yaml configuration file:
... app in App Engine is configured using an app.yaml file, that
contains CPU, memory, network and disk resources, scaling, and other
general settings including environment variables.

Does traffic from App Engine to Cloud SQL travel over the internet or on Google internal network?

We have this discussion in our office and can not come to a conclusion. So I am reaching out here for some advice.
We have a Google Cloud SQL running with no public IP. Google App engine from different App Engine project connect to this single cloud SQL by authorizing their service account.
There are no VPC setup between the projects. The apps are on google app engine standard environment. The instance's private IP is not used in the app projects.
The connections between the projects are made using the tutorial found here
https://cloud.google.com/sql/docs/mysql/connect-app-engine
creating an connection string as
mysql+pymysql://<db_user>:<db_pass>#/<db_name>?unix_socket=/cloudsql/<cloud_sql_instance_name>
The question is how does the traffic flow from other App Engine projects to this Cloud SQL instance?
Does the connect handshake go via the internet (ie outside Google's Network) or does google handles the traffic and routes it internally without the request ever going to the internet?
It would be a great help if any one can help answer these questions.
The answer to this actually varies depending on which version of App Engine you are using.
On older versions of App Engine Standard, the /cloudsql/ unix socket connected over an internal network directly to your instance.
On more recent versions of App Engine Standard, it uses a version of the Cloud SQL proxy to authenticate your connection to the instance via it's public IP. This is why the Connecting from App Engine page states your Cloud SQL instance must have a public IP.
If you have configured your Cloud SQL to use a Private IP address then connectivity occurs using VPC Network Peering and your communication from your Google App Engine (running inside Google and VPC connected) to your managed Cloud SQL (running on a separated VPC Network) is all internal within Google using VPC.
Details on this can be found in the article here:
Introducing private networking connection for Cloud SQL
Private IP (MySql)
Configuring private IP connectivity (PostgreSQL)
The connection from the App Engine Standard to the Cloud SQL instance it is made over the internet. There are more internal services between the App Engine and the Cloud SQL, but the calls are not made to the private IP of the instance, by default.
If you look in the readme of the connector's repository you can see that you can use almost the same method to connect to the Cloud SQL instance from your local env. That might be a clue that things happen on the internet.

Connecting a Google Cloud App Engine app to its Cloud SQL Instance-allowing database access

I have a Google Cloud project with an app and a Cloud SQL Instance. SQL requests from the app time out. Private IP connectivity is enabled. If I explicitly add the app instances' IPs to the SQL Instance's public authorized networks, it works. This is obviously a bad solution since these IPs change on every deployment. How do I permanently grant access to the app?
Private IP's are only accessible by other services on the same Virtual Private Cloud (VPC). App Engine apps don't currently have access to VPC networks.
Edit: App Engine has recently released Serverless VPC Access, meaning that the can now be configured to connect via Private IP.
App Engine Standard does provide a unix domain socket to interface with Cloud SQL instances. Just tell your app to use the socket at /cloudsql/<INSTANCE_CONNECTION_NAME>; (with your instance's connection name), and it should be able to connect. If you are using a cross product or cross regional setup, there are more instructions here.

instead of using cloudSQL we will use compute engine to install other database server

I would like ask if a created google compute engine (vm) can be part of our local area network in our site and serves as our database server where every client can connect through our internet server?
instead of using cloudSQL we will use compute engine to install other database server.
I don't think you can assign a GCE VM to directly have an IP address from your local network, but if you run your own DNS in your network, you could add an entry to point your database server name at the Google IP, and you could configure routes on your network to go through your Internet server to get to that address. Alternately, if you have VPN IPSEC hardware at your site, you could use Cloud VPN to setup a tunnel from your site to your GCE project.

Resources