Alibaba Cloud の Function Compute のサンプルを見てみる

# Function Compute

他のクラウドと同じように、Alibaba CloudにもFunctionのサービスがあります。今回はFunction Computeを調査してみました。

## 対応言語
以下のSDKが用意されています。

| 言語 | アドレス |
|:--|:--|
| Node.js  | https://github.com/aliyun/fc-nodejs-sdk  |
| Java  | https://github.com/aliyun/fc-java-sdk  |
| Python  | https://github.com/aliyun/fc-python-sdk  |
| Go  | https://github.com/aliyun/fc-go-sdk  |
| PHP  | https://github.com/aliyun/fc-php-sdk  |
| C#  | https://github.com/aliyun/fc-csharp-sdk  |

## トリガーの種類
以下のトリガーが用意されています。

- HTTP トリガー
- OSS イベントトリガー
- タイム　トリガー
- CDN トリガー
- MNS トリガー
- Table Store トリガー
- Log Service トリガー

### イベントソースサービスで作成されるトリガー
API Gateway、DataHub、IoTがあります。

### Function Compute で作成されるトリガー
HTTP、OSS、Log Service、タイム、CDN イベント、MNS トピック、Table Storeがあります。

## 制限事項

### サービスリソースの制限
| 制限 | 値 |
|:--|:--|
| 1 つのサービスで作成できる関数の最大数  | 50  |
| 1 つの関数で作成できるトリガーの最大数  | 10  |

### 関数実行時の環境制限
| リソース | 値 |
|:--|:--|
| 一時ディスクスペース (“/tmp” のスペース)  | 512 MB  |
| ファイル記述子の数  | 1024  |
| プロセス数とスレッド数 (合計)  | 1024  |
| リクエストごとの最大実行時間  | 600s  |
| 同期関数呼び出しのリクエストペイロードサイズ  | 6 MB  |
| 同期関数呼び出しのレスポンスボディ  | 6 MB  |
| 非同期関数呼び出しのリクエストペイロードサイズ	  | 128 KB  |
| コードパッケージサイズ (圧縮された .zip または .jar ファイル)	  | 50 MB  |
| 非圧縮コードサイズ  | 500 MB  |

### 各リージョンのアカウントごとのリソース制限
| リソース | 値 |
|:--|:--|
| 同時に実行できる関数の数  | 100  |
| アップロード可能なパッケージの合計サイズ  | 100 GB  |


## 今後の調査内容
今後、以下の気になる点について調べてみようと思います

- Function ComputeからRDBMSに接続する際のコネクションプールについて
    - VPCのRDSに接続する方法はドキュメントにあった
- 初期起動の速度（Javaなどオーバーヘッドの大きい言語や、モジュールが多い場合の挙動）
- VPC内での起動速度（初期のAWS Lambdaのようなことがないのかな？）
- Step Functionみたいなものはないか？

# チュートリアルの実行

## Function Compute の設定
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/a0c349c5-642c-c883-9627-e30dbf8e8d04.png)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/52609a4b-b8d9-e283-e1f4-befe2fe20172.png)
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/b4c83e2f-5be9-d460-bf36-96bb7e341b57.png)

## 初心者向けチュートリアル
### ハローワールド
丁寧に説明がされています。サンプルはNode.jsのサンプルになります。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/367309d7-4348-ffa6-8420-4d179d97a995.png)
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/f699d67c-2469-c816-ba9e-950b9ba39ce1.png)

### スクリーンショットツール
URLを指定して、スクリーンショットをとるサンプルです。ソースコードも長いので、参考になりました。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/acc1e443-fb1c-676a-370f-76bfaaa1d0ca.png)
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/8e53289b-62af-09a1-7fb9-98833f0d181e.png)
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/d137eaa3-8435-f44e-808c-9f94903531a9.png)
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/f213cf56-2143-500d-94f6-ef7f843a4f1e.png)

### TODOリスト
TODOアプリのサンプルです。Express使っているサンプルです。
1URIに1Functionと思っていたのですが、Expressを使って複数URIを1Functionで受け取っているので参考になりました。この手があるのか。。。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/85ef9968-ed86-61d8-d871-98d7b6390d2f.png)
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/a3ad34f7-6494-2067-89a6-592eaea6d7c6.png)
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/d0ef2c0d-09a5-93fa-c182-4296d993c814.png)
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/e1572c67-2078-4e6a-3527-be4f838fd90a.png)
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/4bf77eb3-24dd-443d-7078-4306e3a3a857.png)

### HTTP関数を試してみる
よく使いそうなので、試してみました。Webからアクセスするとファイルダウンロードになります。現在、JavaはHTTPトリガーに対応していないと記載がありますが、Javaでもいけそうですね。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/018a0cf9-0c81-0848-0bbd-78014ab0e19f.png)
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/48d84a1e-79ac-8c10-8ab2-20f44baecf27.png)
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/ecd8cebf-6450-6292-a8ca-cd04a2a21ddd.png)
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/461b1929-65a2-db27-464d-7772e30697d7.png)
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/d35461ce-b5e7-dae1-1ed7-510a512c3c19.png)
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/7c21e0a0-b2f7-3023-d3e7-c4a7b66586e0.png)
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/1fd20a55-2e7b-e5a8-57d2-05187bec998a.png)
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/f312c60e-6763-60b3-8298-584ee0a538d1.png)

## テンプレート一覧
いろいろなテンプレートがありますね。
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18582/f9968093-e1fd-8811-cac9-ded357259397.png)

#まとめ

今回はここまでにします。テンプレートが充実しているので、実装には困らないかもしれないです。一方で、Function Computeをフローとして動かせる仕組みは欲しいかなと思いました。
まだ調査していませんが、このあたりを調べてみたいと思います。