Tencent CloudのServerless Cloud Functionを試してみる

## はじめに

この記事は[むちゃぶりにも応える開発技術があるって？！〜3つのテーマで記事を募集〜 by V-CUBEのカレンダー](https://qiita.com/advent-calendar/2023/v-cube) の参加記事です。

Serverless Cloud FunctionはAWSでいうLambdaのようなサービスです。
AWSのLambdaの代替となるツールとして、Tencent CloudにはServerless Cloud Functionがあると知ったので、試してみることにしました。
今回はHTTPリクエストをトリガーとしてレスポンスを行うJSのアプリケーションをデプロイしてみました。

ドキュメントもありますが、補足が欲しいところもあったので、記事にしています。

https://www.tencentcloud.com/jp/products/scf

デプロイにはServerless Frameworkも使うことができます。
今回はまずは検証をしたいため、とにかく手動でデプロイして使ってみます。

Serverless Frameworkを使う場合はこちらが参考になります。

- [Deploying Framework on Command Line | Tencent Cloud](https://www.tencentcloud.com/jp/document/product/583/41586)
- [Tencent Cloud - Serverless Cloud Function (SCF) Guide - Introduction | Serverless Framework](https://www.serverless.com/framework/docs/providers/tencent/guide/intro)

## 料金について

無料枠が存在するので、お試しであれば無料でできます。

[Free Tier | Tencent Cloud](https://www.tencentcloud.com/jp/document/product/583/12282)

Calculatorもあるので、実際に稼働させる際にはこちらで試算をします。

https://intl.cloud.tencent.com/pricing/scf/calculator

## コンソールで設定をしていく

設定に関して参考にしたDocumentはこちらです。

https://www.tencentcloud.com/jp/document/product/583/41592

### Serverless Cloud Functionを有効化する

Serverless Cloud Functionのコンソールを開きます。
初めての場合は有効化を求められるので許可をします。

https://console.tencentcloud.com/scf/index

早速リージョンを選択して Create していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/907a9621-25c3-c109-d68d-9d515bb5d71f.png)

ちなみに2023年12月現在、リージョンは以下のものが選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/fe0af870-8882-a5f9-af85-d86483915523.png)

フレームワーク等を選択して手軽に作成できるTemplatも用意されているのですが、使おうとしたサンプルは、runtimeが`Nodejs.12.16`と古かったので「Create from scratch」を選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/89086712-8aff-8d3b-96ab-2cae87f6232b.png)

Serverless Cloud Functionの起動トリガーは以下の2つから選択できますが、今回は「HTTP-triggerd Function」を選択します。

- [Event-triggerd function](https://www.tencentcloud.com/document/product/583/9210)
- [HTTP-triggerd function](https://www.tencentcloud.com/document/product/583/56124)

### アプリケーションの設定

アプリケーションのデプロイ（アップロード）前にやることが2つあります。

1. `scf_bootstrap` というファイルを作成する
2. listenするポートを `0.0.0.0:9000` に変更する

Node.jsのruntimeは最新が18.15だったので、これを選択しています。 (v20は選択肢になかった...)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/b58318fd-edf6-58f1-dbf8-5d518999e3cb.png)

`scf_bootstrap`には以下のように記述します。

```sh
#!/bin/bash
SERVERLESS=1 /var/lang/node18/bin/node ./dist/main.js
```

今回デプロイしたアプリケーションはNestJSなので、ビルド後、アップロードします。

```sh
npm run build
```

### ファイルのアップロードをする

以下のように設定をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/dc088788-c8dc-efd5-0ac8-cdc85a33008a.png)

完了前に、以下のようなエラーが表示されていたので、 `ApiGateWay_QCSRole` のパーミッションを許可します。
こういう細かいところまで、許可が必要なのですが、初めのうちは「知らないうちに使っていた」とならないのでいいなと思いました。

> Service role error. Please assign ApiGateWay_QCSRole the permission to invoke the cloud function.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/604bd40e-c892-0b99-0933-d057c89160c5.png)

最後にfunction URLを公開すればAPIが公開できます。
API Gatewayの設定をせずにここまでできるのは便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/cea1d1bb-ac60-7841-a9c9-880159823faa.png)

https://github.com/tencentyun/serverless-demo/blob/master/Webfunc-NestjsDemo/serverless.yml

## まとめ

 - APIの公開までにAPI Gatewayの設定を意識せずにできるのは便利でした
 - Node.jsのランタイムや、Templateが古いのは不便でした

## 参考

https://www.tencentcloud.com/jp/document/product/583/41592