🌟

Cloud Functions サーバーレスでアプリケーションを実行するまとめ

2022/01/31に公開

概要

Cloud FunctionsをGCP学習の一環で触ってみたので機能をまとめてみる

https://www.udemy.com/course/google-cloud-platform-gcp/

スクリーンショット 2022-01-30 21.58.43.png

Cloud Functionsとは

  • サーバーレス(サーバーの管理がいらない)
  • 負荷に応じた自動スケーリング
  • 利用した分だけ料金が発生する(従量課金制)

サーバー管理なしでコードを実行するためのスケーラブルな従量課金制 Functions as a Service(FaaS)。

https://cloud.google.com/functions?hl=ja

Cloud Functionsの作成

  • トリガーURLにリクエストが渡された契機でCloud Functionsが発火します

スクリーンショット 2022-01-30 22.46.36.png

  • 今回はデフォルトのスクリプトをそのまま作成します
    スクリーンショット 2022-01-30 22.21.04.png

トリガーURLにアクセスするとスクリプトの結果が表示されます

スクリーンショット 2022-01-30 22.48.11.png

スクリーンショット 2022-01-30 22.49.26.png

スクリプトを更新してみる

スクリーンショット 2022-01-30 22.51.57.png

index.js
/**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello GCP!';
  res.status(200).send(message);
};
package.json
{
  "name": "sample-http",
  "version": "0.0.2"
}
  • 更新後トリガーにアクセスすると出力が更新されています
    スクリーンショット 2022-01-30 22.54.18.png

Cloud SQLからデータを取得する

パブリックIPを許可する

  • プロキシ経由でCloud SQLにアクセスできるようにする

スクリーンショット 2022-01-31 0.40.30.png

プライベートIPアドレスが追加される

  • 表示された接続名でCloud Functionsからアクセスする
    スクリーンショット 2022-01-31 0.42.26.png

Cloud Functionsのスクリプトを更新する

index.js
const mysql = require('mysql');

const connectionName = '接続名';
const dbUser =  'ユーザ名';
const dbPassword =  'パスワード';
const dbName =  'DB名';

exports.demo = (req, res) => {
  const connection = mysql.createConnection({
    socketPath: "/cloudsql/" + connectionName,
    user: dbUser,
    password: dbPassword,
    database: dbName
  });

  connection.connect();

  connection.query('SELECT * FROM users', (err, results) => {
    if (err) {
      console.error(err);
      res.status(500).send(err);
    } else {
      res.send(JSON.stringify(results));
    }
  });
  connection.end();

};
package.json
{
  "name": "sample-http",
  "version": "0.0.3",
  "dependencies": {
    "mysql": "latest"
  }
}

Cloud SQLに保存したデータが表示される

スクリーンショット 2022-01-31 0.59.11.png

Cloud SQLにデータを登録する

Cloud Functionsを新たに作成する

スクリーンショット 2022-01-31 1.04.39.png

index.js
const mysql = require('mysql');

const connectionName = '接続名';
const dbUser =  'ユーザ名';
const dbPassword =  'パスワード';
const dbName =  'DB名';

exports.create = (req, res) => {
  const connection = mysql.createConnection({
    socketPath: "/cloudsql/" + connectionName,
    user: dbUser,
    password: dbPassword,
    database: dbName
  });

  connection.connect();

  if (!req.query['name']) {
    res.send('none');
    return;
  }
  const  addName = "'"  + req.query['name'] +  "'";
  connection.query('INSERT INTO  users (name) VALUES(' + addName + ')', (err, results) => {
    if (err) {
      console.error(err);
      res.status(500).send(err);
    } else {
      res.send(JSON.stringify(results));
    }
  });
  connection.end();

};

package.json
{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "mysql": "latest"
  }
}

作成したトリガーにリクエストを投げる

スクリーンショット 2022-01-31 1.14.42.png

  • トリガー?name=demo でアクセスすることでINSERT処理が実行される
    スクリーンショット 2022-01-31 1.16.06.png

  • 先ほど作成したDBからデータを取得するトリガーにアクセスすると登録したデータが表示できる
    スクリーンショット 2022-01-31 1.17.06.png

まとめ

今回はCloud Functionsの構築〜Cloud SQLとの連携までまとめました
いいねしていただけると記事執筆の励みになりますので、参考になったと思った方は是非よろしくお願いします!

GitHubで編集を提案

Discussion