0
votes

We can use GCP cloud functions to start and stop the GCP instances but I need to work on scheduled suspend and resume of GCP instances using cloud function and scheduler.

From GCP documentation, I got that we can do start and stop using cloud functions available below https://github.com/GoogleCloudPlatform/nodejs-docs-samples/tree/master/functions/scheduleinstance

Do we have same node JS or other language Pcgks available to suspend and resume GCP instances?

If not can we create our own for suspend/resume.

When I tried one I got below error "TypeError: compute.zone(...).vm(...).resume is not a function

Edit, thanks Chris and Guillaume, after going through you links i have edited my code and below is my index.js file now. For some reason when I do gcloud functions deploy resumeInstancePubSub --trigger-topic resume-instance --runtime nodejs10 --allow-unauthenticated

i always get Function 'resumeInstancePubSub1' is not defined in the provided module. resumeInstancePubSub1 2020-09-04 10:57:00.333 Did you specify the correct target function to execute?

i have not worked on Node JS Or JS before, I was expecting something similar to start/stop documentation which I could make work easily using below git repo https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

My index.js file,

// BEFORE RUNNING:
// ---------------
// 1. If not already done, enable the Compute Engine API
//    and check the quota for your project at
//    https://console.developers.google.com/apis/api/compute
// 2. This sample uses Application Default Credentials for authentication.
//    If not already done, install the gcloud CLI from
//    https://cloud.google.com/sdk and run
//    `gcloud beta auth application-default login`.
//    For more information, see
//    https://developers.google.com/identity/protocols/application-default-credentials
// 3. Install the Node.js client library by running
//    `npm install googleapis --save`

const {google} = require('googleapis');
var compute = google.compute('beta');

authorize(function(authClient) {
  var request = {
    // Project ID for this request.
    project: 'my-project',  // TODO: Update placeholder value.

    // The name of the zone for this request.
    zone: 'my-zone',  // TODO: Update placeholder value.

    // Name of the instance resource to resume.
    instance: 'my-instance',  // TODO: Update placeholder value.

    resource: {
      // TODO: Add desired properties to the request body.
    },

    auth: authClient,
  };
exports.resumeInstancePubSub = async (event, context, callback) => {
try {
    const payload = _validatePayload(
      JSON.parse(Buffer.from(event.data, 'base64').toString())
    );
    const options = {filter: `labels.${payload.label}`};
    const [vms] = await compute.getVMs(options);
    await Promise.all(
      vms.map(async (instance) => {
        if (payload.zone === instance.zone.id) {
          const [operation] = await compute
            .zone(payload.zone)
            .vm(instance.name)
            .resume();

          // Operation pending
          return operation.promise();
        }
      })
    );
          // Operation complete. Instance successfully started.
    const message = `Successfully started instance(s)`;
    console.log(message);
    callback(null, message);
  } catch (err) {
    console.log(err);
    callback(err);
  }
};
 compute.instances.resume(request, function(err, response) {
    if (err) {
      console.error(err);
      return;
    }

    // TODO: Change code below to process the `response` object:
    console.log(JSON.stringify(response, null, 2));
  });
});

function authorize(callback) {
  google.auth.getClient({
    scopes: ['https://www.googleapis.com/auth/cloud-platform']
  }).then(client => {
    callback(client);
  }).catch(err => {
    console.error('authentication failed: ', err);
  });
}
1
Keep in mind that is beta feature and not yet implemented in the Client Libraries. However, if you use the discovery API, you should be able to use these. Can you share your current code? We can try to fix it! - guillaume blaquiere
@guillaumeblaquiere i have added my index.js above. Thanks..! - ssumathe
Above error has been resolved now, A function was not accessible since it was inside another module. - ssumathe

1 Answers

0
votes

Here and here is the documetation for the new beta verison of the api. You can see that you can suspend an instance like:

compute.instances.suspend(request, function(err, response) {
    if (err) {
      console.error(err);
      return;
    }

And you can resume a instance in a similar way:

 compute.instances.resume(request, function(err, response) {
    if (err) {
      console.error(err);
      return;
    }