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

# 概要

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

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

![スクリーンショット 2022-01-30 21.58.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/8a19d8a3-d0c9-c9ca-1f63-f81952631277.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/29ad6d0a-2b81-f932-4890-c0501afb56ba.png)

- 今回はデフォルトのスクリプトをそのまま作成します
![スクリーンショット 2022-01-30 22.21.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/39f55317-9ed6-ab68-b874-e4c6a83a4f51.png)

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

![スクリーンショット 2022-01-30 22.48.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/5d2dce76-7915-83ee-2503-40d585a370b5.png)

![スクリーンショット 2022-01-30 22.49.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/013bb491-0be0-a78f-2c7d-77826f413a48.png)

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

![スクリーンショット 2022-01-30 22.51.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/31b53f2f-2d83-f7b3-8793-da3f20185dbb.png)

```js: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);
};
```

```json:package.json
{
  "name": "sample-http",
  "version": "0.0.2"
}
```

- 更新後トリガーにアクセスすると出力が更新されています
![スクリーンショット 2022-01-30 22.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/3acb84e6-ba73-818e-b7f8-df9cf6209cc4.png)

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

### パブリックIPを許可する
- プロキシ経由で`Cloud SQL`にアクセスできるようにする

![スクリーンショット 2022-01-31 0.40.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/b50b16f1-d669-0131-e5c6-7db0790bb4d6.png)

### プライベートIPアドレスが追加される
- 表示された接続名で`Cloud Functions`からアクセスする
![スクリーンショット 2022-01-31 0.42.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/5e9fab9c-a0a9-a52d-1dd8-74f80d483aa9.png)

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

```js: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();

};
```

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

### `Cloud SQL`に保存したデータが表示される
![スクリーンショット 2022-01-31 0.59.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/845608ca-77dc-248f-ba56-e1c7b402fd6c.png)

## `Cloud SQL`にデータを登録する

### `Cloud Functions`を新たに作成する

![スクリーンショット 2022-01-31 1.04.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/27fa5aab-9c1f-07eb-e6e4-672f5dc24487.png)


```js: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();

};

```

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

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

![スクリーンショット 2022-01-31 1.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/36930f75-bef4-410a-7a2c-288c42d5ac5f.png)

- `トリガー?name=demo` でアクセスすることで`INSERT`処理が実行される
![スクリーンショット 2022-01-31 1.16.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/d34e3806-f13a-bafd-9adc-40bc7dc088cb.png)

- 先ほど作成した`DB`からデータを取得するトリガーにアクセスすると登録したデータが表示できる
![スクリーンショット 2022-01-31 1.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/c866d9dd-5477-99c2-1903-15a6c5ca7882.png)

# まとめ

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