0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-01-30

概要

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

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

Cloud Functionsとは

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

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

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との連携までまとめました
いいねしていただけると記事執筆の励みになりますので、参考になったと思った方は是非よろしくお願いします!

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?