Alibaba CloudのFunction Computeでwebサイトを作る

webサイトと言ってもただHTMLを返すだけのやつです。ほとんどタイトル詐欺。

# Function Computeとは
Function Computeの概要です。まず[公式ドキュメント](https://jp.alibabacloud.com/help/doc-detail/52895.htm)を見てみます。

> Alibaba Cloud Function Computeは、イベント駆動型のフルマネージドコンピューティングサービスです。Function Compute を使用すると、サーバーやその他のインフラストラクチャの管理を心配することなく、コードを記述してアップロードできます。

ふむ。分かりやすく具体例を交えて説明します。

例えばOSSにファイルをアップロードした時にそのアップロードイベントを検知して何か処理を行う(Slack通知とか)です。いわゆる**サーバレス**な環境を実現します。

ここでは**HTTPのGETリクエスト**をトリガーにしてレスポンスを返すようにします。

毎月100万回のリクエストは無料(参考: [公式ドキュメント](https://jp.alibabacloud.com/help/doc-detail/54301.htm?spm=a21mg.p38356.b99.7.1bd711e4NombUN))なので個人利用なら気兼ねなく使えます。ありがたい。

# サービスと関数とトリガー
FCにはサービスと関数の2つの概念があります。めちゃくちゃ簡単に説明すると関数がイベントに対応する処理で、サービスは関数の入れ物です。

そしてトリガーはどんな条件で関数を実行するかの設定です。

現在Java, Node.js, Pythonをサポートしていますが、HTTPイベントに関してはまだnode.jsしか対応していません。

# 準備
Resource Access Managementよりユーザーを作成してFunction Computeの権限を与えておいてください。

# Function Computeを使ってみる
[公式のチュートリアル](https://jp.alibabacloud.com/help/doc-detail/51783.htm)と[HTTPトリガーのドキュメント](https://jp.alibabacloud.com/help/doc-detail/71229.htm)を参考にします。

まず、Function ComputeのCLIツールである`fcli`を[GitHub Releases](https://github.com/aliyun/fcli/releases)からダウンロードしておきます。

次に、ローカルの適当な場所にHTTPトリガーで実行される処理の関数を書きます。ここでは`~/src/function_compute/my_website/http.js`とします。

```sh
$ mkdir ~/src/function_compute/my_website
$ cd ~/src/function_compute/my_website
$ vim http.js
```

以下がhttp.jsです。

```js
// http.js
const getRawBody = require('raw-body')
module.exports.handler = function(request, response, context) {
  getRawBody(request, function(err, data){
    const respBody = new Buffer("<html><h1>hello FunctionCompute</h1></html>")
    response.setStatusCode(200)
    response.setHeader('content-type', 'text/html')
    response.send(respBody)
  })
};
```

`getRawBody()`でレスポンスを定義します。

## サービスと関数の作成
さて、次に新しくサービスと関数を作ります。サービス名は`my_website`、関数名は`http`にします。

```
>>> mks my_website
>>> cd my_website
>>> mkf http -t nodejs6 -h http.handler
```

`mks`が`make service`、`mkf`が`make function`ですね。

※ コマンド実行中に40xや50xが返ってきた場合は[こちらのトラブルシューティング](https://jp.alibabacloud.com/help/doc-detail/71229.htm#problem)を参照してください。

コード編集はGUIからもできますが、コマンドラインの使用をおすすめします。(たまに画面が微妙な挙動をするので)

## トリガーの作成
こっちも`fcli`でコマンドラインから作成したかったのですが、トリガー作成用の`mkt`が**まだhttpに対応していない**(2018/7/5)のでコンソール画面から作ります。

↓オプションの説明文にはサポートしてるって書いてある

```
>>> mkt --help
      --etag string              trigger etag for update
      --help
  -r, --invocation-role string   invocation role, timer type trigger optional
  -s, --source-arn string        event source arn, timer type trigger optional
  -c, --trigger-config string    trigger config file
  -t, --type string              trigger type, support oss, log, timer, http, cdn_events now (default "oss")

>>> mkt http -t http -c httpTrigger.yml
Error: unsupported trigger type, expect oss, log, timer, http, cdn_events, actual http
```

嘘やろhttpってあるやんけ

https://github.com/aliyun/fcli/issues/30

実装されていないっぽいですね。

追記:
v0.20で実装されたみたいで、ちゃんと使えました。

では、コンソールからトリガーを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131581/249cc493-2ba1-5228-3046-d31cdfb9c0f8.png)

これでOKを押せばトリガーが作成されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131581/205305d0-8c44-c06d-adad-17dccd9956c6.png)

## ブラウザで確認する
関数ページのコードタブにあるURLをコピーします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131581/c85e02bd-ebca-e83c-ef3f-6b891c1c1d1c.png)

コピーしたURLにアクセスしたらちゃんと見えました。完成。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131581/f7488f56-64c5-5d57-d007-fa47721912f1.png)

# まとめ
公式のドキュメントが最強。しかし新しいからかちょっとまだバグってる。

[FunctionComputeとTableStoreでサーバレスAPIを作る](https://asmsuechan.hatenablog.com/entry/2018/07/11/145118)