高校生がAlibaba CloudのPolarDBを触ろうとしてGASに帰った話

# はじめに
この記事は「Alibaba Cloud Advent Calendar 2023」のプレゼント(iPhone 15 ProとNintendo Switch)に目がくらんだ高校生が、とりあえずPolarDBを触ろうとした感想を記したものになります。

「文章の書き間違い」や「根本的な説明ミス」等あるかと思いますが、その際はコメントや編集リクエストをいただけると大変嬉しいです。

# Alibaba Cloud・PolarDBとは
+ Alibaba Cloudは、クラウドコンピューティングなどのサービスを提供している、中国のAlibabaグループの企業
+ PolarDBはAlibaba Cloudが提供しているデータベース製品の一つ
+ 日本(東京)にもAlibaba Cloudのサーバーがあるらしい
+ 日本のサーバーはSoftBankと共同で動かしてるっぽい…？

# とりあえず登録しようとした
まずは[ホームページ](https://www.alibabacloud.com/ja)にアクセス。
![TopPage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/9c3b3b08-0f72-4090-464b-542d59900fb0.png)
アクセスした段階で日本語ページが表示されるのは嬉しい。

上部のメニューバーから「製品＞データベース」と進み、PolarDB for MySQLをクリック。
![Menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/7f7d9ab7-8d75-77ed-4576-f309102e1901.png)

PolarDB for MySQLのページが表示された。
![PolarDBPage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/189d65b7-9e89-32eb-4666-487332660f94.png)
無料トライアル[^KEY]があるそうで、その時の仕様は、「**ノード**が**2C8G** (専用)で、ストレージ容量が50GB」とのこと。

ストレージ容量はなんとなく分かるとして、ノードってなんですか…？

ググってみると良さげな[Zennのページ](https://zenn.dev/joo_hashi/articles/873bd933205dd9)がありました。

>スーパーコンピューターやクラスターコンピュータのコンテキストでは、ノードは個々のコンピュータまたはプロセッサを指すことがあります。これらのノードは通常、高速ネットワークを介して相互に接続され、計算タスクを分割して処理します。

とのことで、要は「ノード=コンピュータ」って捉えても良さそう。

「2C8G」については、ページ下部の「オファー利用規約」に記載がありました。
![Offer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/476e7396-9c6a-02e0-f4d6-2a984cd78e6f.png)
「2C8G」は「2コア,8GBのRAM」を指すんですね。

そのほか無料トライアルの注意点もこの規約に書かれていました。

理解できたので、「無料トライアル」の申し込みをしていきたいと思います。

ページ内にある「ステップ１:今すぐ申し込む」をクリックすると、サインイン画面が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/15f8511e-f182-fd91-3cf4-8a20fc0203fc.png)
画面右下の「今すぐ登録」をクリック。

個人アカウントを選択し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/c7a0ec36-a7b3-3b24-1ef8-407ad65dca77.png)

メアドとパスワードを設定したら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/25451154-ec3a-80a2-c80a-579cbe986467.png)

メアドの認証と利用規約の同意確認を済ませて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/ab0dfeb6-9742-c90f-cc8c-28ba6c79ccbc.png)

電話認証…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/72c9c9a7-b62b-966c-692e-a8d8bf279ea8.png)
は~~面倒なので~~「Not now?」をクリックしてスキップ。

すると完全に中国語な登録フォームが出てくるのでとりあえず翻訳
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/eb5b00ce-da9b-1373-41f1-699be9299c9d.png)

したものがこちらになりますが…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/33dfcbb0-e92c-5255-9345-673087f1c4d9.png)

うーん…
会社名やら名前やらを入れなくちゃいけないみたいですね…

良い感じに入力して、送信ボタンをクリックしました。

画面が切り替わると思いきや、「クレジットカードまたはデビットカード情報の入力が必要」というポップアップが表示され、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/72c9c9a7-b62b-966c-692e-a8d8bf279ea8.png)
この画面に戻されてしまいました…

先ほど電話認証は~~面倒~~と書きましたが、実は契約している携帯回線がデータ通信専用(データSIM)で、SMS認証ができないんですよね…
なので回避したかったのですが、無理そうです。

SMS認証だけでなく、音声による電話認証も選択肢として用意されていたら(AmazonのAWSのように)、固定電話で認証できるんだけどなぁ…

# ここまでの結論
Alibaba Cloudを使うためにはSMSを受信可能な電話番号が必要！

[Alibaba Cloud Advent Calendar 2023のページ](https://qiita.com/advent-calendar/2023/alibaba2)に、

>**概要**
このキャンペーンは、Alibaba Cloudのデータベースサービスに関する有用なTipsを共有し、他のユーザーやエンジニアとの知識交換の機会を提供します。特にPolarDBを中心に、データベースに関するヒントやトリック、そして業務における利点をまとめた記事を募集します。
例えば：
    PolarDBやAnalyticDB for MySQL活用方法と評価（辛口もOK）
    PolarDB ServerlessによるAuto Scaling実現&コスト削減
    ADBによりLLMにおけるベクトルDBの活用など
    DTSでDB移行など

と書かれていますが、まず活用方法を考える段階までたどり着くことができませんでした！お疲れさまでした！

今回登録を進めてみた結果として、「SMS認証だけでなく、音声による電話認証にも対応していただけると嬉しい」という評価をさせていただきたいと思います。


というところで本来この記事は終わりを迎えるはずなのですが、折角ここまで書いた(登録と並行作業で記事書いてました)ので、このAdvent Calendarのタイトル

- - - 
「PolarDBなどのデータベースに関するTipsを記事投稿しよう by Alibaba Cloud Advent Calendar 2023」
- - -

に沿った記事になるように、味付けをしていきたいと思います。

# 調理開始

まずタイトルの一部を太字にし、文章に斜線を入れていきます。
- - -
「PolarDB**など**の/**データベースに関するTips**/を記事投稿しよう by Alibaba Cloud Advent Calendar 2023」
- - -

こうやって考えると、なんということでしょう…！
このAdvent Calendarは「データベースに関するTips」を募集するものと考えられますね！~~(それと同時に、賞をもらえる確率はゼロに等しくなります。プレゼント欲しかったなぁ…！)~~

# Google Apps Scriptを用いてGoogleスプレッドシートをデータベースのように使う
見慣れたGoogleらしいUIに帰ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/2aea5380-61f8-21c8-ed3b-0e7278e94034.png)

## Google Apps Scriptとは
+ Googleが提供しているサービスで、コードを書くことでGoogle製のソフトウェア同士や外部のサービスを連携させることができるようになるもの
+ Googleアカウントを持っていれば無料で使用することができる
+ 言語はほぼJavaScript
+ 略して「GAS」と呼ばれることが多い

## Googleスプレッドシートとは
+ Google版のExcel
+ Web版とモバイルアプリ版があるが、どちらにせよ機能面では本家Excelに劣る(個人の感想です)
+ GASと組み合わせることで本領を発揮する(こちらも個人の感想です)

ということで上記2つを組み合わせて、簡易的なデータベースを作成していきたいと思います。

## 実際に作ってみる
今回は購入したものを記録するデータベースと登録フォームを作っていきます。

### Googleスプレッドシートの用意
新規でスプレッドシートを作成し、項目名を記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/3c3664f3-3c44-2635-3e95-6cd5319fe2b6.png)

メニューバーから、拡張機能＞Apps Scriptをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/2fac1b23-8d0f-44b6-60b0-eeea8332c87d.png)

するとGASのコード作成画面へと遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/bff524ca-7655-3bf7-4618-60165ca51ad6.png)

今回はGASでhtmlファイルも作成、公開し、そのhtmlファイル上のフォームからGoogleスプレッドシートに登録していく仕組みにしたいと思います。

### GASのコード作成
GASのコード(コード.gs)とindex.htmlを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/a04805ae-1f01-4f15-4ba6-7a0fb7955206.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/e586e711-30f4-014d-6008-dab3ceee380b.png)


<details><summary>コードはこちら！</summary>

```javascript:コード.gs
function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('index');
}

function writeDataToSpreadsheet(date_str, product_str, cost_str, code_num, extra) {
  try {
    var sheet = SpreadsheetApp.getActive().getSheetByName("シート1");
    var newRow = [date_str, product_str, cost_str, code_num, extra];
    sheet.appendRow(newRow);
    return "登録しました";
  }
  catch (e) {
    return "エラーです";
  }
}
```

:::note info
doGet(e)はGASに対してGetの通信が行われるときに実行される関数です。
今回はindex.htmlのファイルを返すようになっています。
:::


```html:index.html
<!DOCTYPE html>
<html>

<head>
  <base target="_top">
  <meta charset="utf-8">
  <meta name="viewport"
    content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
  <style>

  </style>

  <script type="text/javascript">
    function submit(){
      var date_str = String(document.getElementById("date_str").value);
      var product_str = String(document.getElementById("product_str").value);
      var cost_str = String(document.getElementById("cost_str").value);
      var code_num = String(document.getElementById("code_num").value);
      var extra = String(document.getElementById("extra").value);
      google.script.run.withSuccessHandler(success).writeDataToSpreadsheet(date_str, product_str, cost_str, code_num, extra)

      function success(n){
        alert(n)
      }
    }
  </script>
</head>

<body>
  <h1>Registration Form</h1>
  <input type="date" placeholder="日付" id="date_str">
  <input type="text" placeholder="商品名" id="product_str">
  <input type="number" placeholder="金額" id="cost_str">
  <input type="number" placeholder="二次元コード" id="code_num">
  <input type="text" placeholder="備考" id="extra">
  <button onclick="submit()">登録</button>
</body>

</html>
```

</details>

コピペしていただいて大丈夫です。

次にデプロイを行っていきます。

### GASのデプロイ
右上にある青色の「デプロイ」ボタンをクリックし、出てきたメニューから「新しいデプロイ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/5d5e4d5a-c3d8-d13f-9255-823872966501.png)

続いて、設定ボタンをクリックし、「ウェブアプリ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/b65d4043-f643-3d34-3807-0334d2057a27.png)

説明文(任意)を記入し、「アクセスできるユーザー」を「自分のみ」または「全員」に設定します。

:::note info
「自分のみ」に設定すると、自身のGoogleアカウントでログインしている状態でしか閲覧できなくすることができます。
「全員」に設定すると、ウェブアプリのURLを知っていれば誰でもアクセスできるようになります。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/27725aad-5536-e4dd-1ba5-92a156b53a56.png)

「デプロイ」をクリックすると以下の画面になるので、「アクセスを承認」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/a4e995c3-1370-2d8e-3d83-91c3b69636c3.png)

Googleスプレッドシート/GASでログインしているユーザーのアカウントでログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/89227808-36d7-6cb7-8eca-774a165caea8.png)

「Advanced」と書かれている場所をクリックすると下の画像のようになるので、「Go to `プロジェクト名` (unsafe)」というリンクをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/c0ce09b8-0e3b-c1c5-ee11-01d973a22f15.png)

この画面になったら、自分が今デプロイしようとしているアプリケーションへの認証であることを確認したうえで、「Allow」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/ba063299-99d5-93be-af2f-cbccbfb2722d.png)

元の画面に戻るので、右上にある青色の「デプロイ」ボタンをクリックし、出てきたメニューから「デプロイを管理」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/9555260d-bc7e-4045-3fe3-5acc12db51e6.png)

ウェブアプリのセクションにあるリンクをクリックしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/f0fcca16-05a9-b279-139c-be7225126b1a.png)

先ほど作成したhtmlページが表示されます。
登録したい内容を入力して、登録ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/0f95abfb-57cd-2a8c-8d9f-54bac6cc818e.png)

「登録しました」というアラートが表示されたら完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/9191dfd0-67de-b5ed-3cec-87d91f1378a8.png)

Googleスプレッドシートの画面を見てみると、先ほど入力した値が反映されているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921137/4d860efe-264f-bf8c-7e44-9dde738d77cc.png)

今回はhtmlページからの登録機能のみ実装しましたが、GASを経由させることで、Googleスプレッドシートからデータを読み込んでhtmlページに表示させることもできます。

## Googleスプレッドシートをデータベースとして使う際の注意点
### GASの設定について
GASをデプロイする際に「アクセスできるユーザー」を全員に変更した場合、URLを知っていれば、世界中の誰でも公開したhtmlページにアクセスできてしまいます。もしGASの設定を誤ると、Googleスプレッドシート上のあらゆるデータにアクセスできるようになってしまったりと、問題が起こることがあります。
GASではエラーを投げられるのですが、何らかの異常(想定外の不審な操作など)が起きた際はそのようにすることで、管理画面で確認できるようになります。

### 登録できる件数について
https://workspaceupdates-ja.googleblog.com/2022/03/google-2.html

Google公式の日本語ブログによると、**セル数の上限が1000万個**とのことです。
列の数×行の数=セル数なので、できるだけ列を減らす(不要な列は削除する)ことで、登録できる件数を最大にすることができます。
先ほど作ったデータベースでは、不要な列を削除することによって、**1000万個÷5列=200万件**登録できるということになります。
これだけあれば、個人で実験に使う分には全く問題ないかと思います。
もし200万件以上の登録が見込まれる際は、Alibaba CloudのPolarDBなどの、本物のデータベースを使ってみてはいかがでしょうか。

# 最後に
この記事では、「Alibaba Cloudを利用するためにはSMSを受信可能な電話番号が必要」ということと、「GoogleスプレッドシートとGoogle Apps Scriptを使うことで簡易的なデータベースを作ることができる」ということを紹介しました。

SMSを受信可能な電話番号をお持ちの方はぜひAlibaba CloudのPolarDBを試してみて、簡易データベースとの違いを確認してみてくださいね！

最後まで読んでいただきありがとうございました！

# 参考文献
## Alibaba Cloudに関する文献
https://japan.zdnet.com/article/35093965/

## GASに関する文献
https://workspace.google.co.jp/intl/ja/products/apps-script/

https://www2.kobe-u.ac.jp/~tnishida/programming/GAS-02.html

https://workspaceupdates-ja.googleblog.com/2022/03/google-2.html

[^KEY]: [Alibaba Cloud Advent Calendar 2023のページ](https://qiita.com/advent-calendar/2023/alibaba2)に無料トライアルがあることが書かれていた方がAlibaba Cloudにとっつきやすい気がする…