Cloud Functions チュートリアルでデプロイに失敗する

# 概要
Cloud Functionsの[HTTPのチュートリアル](https://cloud.google.com/functions/docs/tutorials/http?hl=ja)のデプロイで詰まった時の話です。公式のチュートリアルに沿って話を進めます。
なお、コマンドラインを使ったデプロイの話になります。

# チュートリアルの目的
Cloud Functionsの書き込み、デプロイ、トリガーまでの流れを体験する。

# チュートリアルの流れ
[(Cloud Functions > ドキュメント) HTTP のチュートリアルより](https://cloud.google.com/functions/docs/tutorials/http?hl=ja)

### 1. 始める前に
環境構築がめんどうだったので、私はCloud Shellを利用しました。

### 2. アプリケーションの準備
ここは公式ドキュメントに沿って、そのまま実行します。
> １. アプリケーション コード用のディレクトリをローカル システム上に作成します。
> 


``` :ディレクトリを作成します。
mkdir ~/gcf_http
```

``` :作成したディレクトリに移動します。
cd ~/gcf_http
```

> ２.  gcf_http ディレクトリに index.js というファイルを作成し、次の内容を含めます。

``` :index.js
/**
 * HTTP Cloud Function.
 *
 * @param {Object} req Cloud Function request context.
 * @param {Object} res Cloud Function response context.
 */
exports.helloGET = (req, res) => {
  res.send('Hello World!');
};
```

### 3. 関数のデプロイ
ここで詰まりました。
> HTTP トリガーで helloGET 関数をデプロイするには、gcf_http ディレクトリで次のコマンドを実行します。

``` :helloGet関数のデプロイ
gcloud beta functions deploy helloGET --trigger-http
```
こいつをこのまま実行すると、次のようなエラーが出ます。
> ERROR: (gcloud.beta.functions.deploy) Missing required argument [runtime]: Flag `--runtime` is required for new functions.

「ん？？？なんでチュートリアル通りにやってるのにエラーが出るんだろう？」
と疑問でしたが、まあそれはひとまず置いておいてエラー文の内容を見てみます。

- Missing required argument [runtime]：`runtime`の引数がありません。
- Flag `--runtime` is required for new functions.：新しい関数にはフラグ `--runtime`が必要です。

ふむ？そもそも、**runtime**って何だ？と思ったので調べました。
> プログラムとかを動かすときに必要な部品のこと

んー？今回の場合、**runtime**って何を指すのでしょうか。
デプロイ方法について調査したところ、次のようなことが書いていました。
[ (Cloud Functions > Documentation) Deploying from Source Control](https://cloud.google.com/functions/docs/deploying/repo?hl=ja)


> --runtime RUNTIME
> The name of the runtime you are using. For a complete list, see the [gcloud reference](https://cloud.google.com/sdk/gcloud/reference/functions/deploy?hl=ja#--runtime). Note that you must include this flag the first time you deploy a function, but you can omit it on subsequent deployments. 

”使用しているランタイムの名前。完全なリストは、[ここ](https://cloud.google.com/sdk/gcloud/reference/functions/deploy?hl=ja#--runtime)見てね”
なんかこれっぽいですね。

> nodejs8: Node.js 8 
> nodejs10: Node.js 10 
> python37: Python 3.7 
> go111: Go 1.11 
> nodejs6: Node.js 6 (deprecated) 

お、これこれ。これが知りたかったのです。**runtime**は実行する言語のことで良いのでしょうか。
これを参考に書けば良いと。

``` :helloGet関数のデプロイ
gcloud beta functions deploy helloGET --trigger-http --runtime=nodejs8
```
``` :デプロイ中
Deploying function (may take a while - up to 2 minutes)...done.
```

やりました。デプロイ成功です。
ちなみに、`beta`の部分を除いても動きます。

``` :helloGet関数のデプロイ
gcloud functions deploy helloGET --trigger-http --runtime=nodejs8
```

### 公式ドキュメントについて
[ (Cloud Functions > Documentation) Deploying from Source Control](https://cloud.google.com/functions/docs/deploying/repo?hl=ja)
> The command uses the following arguments to 
> gcloud functions deploy:

ここを見る限り、`beta`の部分が書かれていないんですよね。
もしかして？と画面最下部の最終更新日を確認してみたところ
> 最終更新日: 4月 4, 2019 

[HTTPのチュートリアル]（日本語ドキュメント）(https://cloud.google.com/functions/docs/tutorials/http?hl=ja) は
> 最終更新日: 5月 21, 2018 

はい。恐らくCloud Functionsには、アルファ版、ベータ版、正式版（？）があり、最新のドキュメント（英語）は正式版で書かれてますが、古いドキュメント（日本語）はベータ版で書かれているみたいですね（2019年4月29日 現在）。
それで正式版になるときに、デプロイ方法に変更があった。今回はそこに引っかかっていた、ということでしょうか。


# まとめ
公式ドキュメントが全て正しいと思っていたので、その分ハマった気がします。公式だからといって最新の情報とは限らないのですね（特に日本語の記述の場合）。確かに、公式のどこかでそんな注意書きを見たような気がします。
また、**runtime**のこととか、知ってる人には当たり前だろ！とか言われそうですね。今回のことは勉強になりました。

最後に、今回の記事が同じようにチュートリアルで詰まっている人の参考になれば幸いです。