入門 Google Cloud Functions (Alpha) 「説明」〜「導入」〜「Hello, World」編（うまく動かない。2016/12/06, gcloud v136.0.0時点）



[Myuon Corp. Advent Calendar 2016](http://qiita.com/advent-calendar/2016/myuon) 6日目です。

---

![qiita-03-cloud-functions-lead.png](https://qiita-image-store.s3.amazonaws.com/0/41522/c5a01e88-9740-8acf-37f0-f85af031d3ce.png "qiita-03-cloud-functions-lead.png")


# 本記事の概要
- [Cloud Functions (ALPHA)とは](http://qiita.com/RyoAbe/items/afe0cfafc1b7238d87d4#-cloud-functions-alpha-とは) 
- [Cloud Functions 導入方法について](http://qiita.com/RyoAbe/items/afe0cfafc1b7238d87d4#-cloud-functions-導入方法について)
- [Cloud Functions を使用した Hello, World.](http://qiita.com/RyoAbe/items/afe0cfafc1b7238d87d4#-cloud-functions-でhello-world)

# 実施環境

- Macのバージョン

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.1
BuildVersion:	16B2555

```

- gcloud コマンドのバージョン

```
$ gcloud --version
Google Cloud SDK 136.0.0
alpha 2016.01.12
bq 2.0.24
bq-nix 2.0.24
core 2016.11.30
core-nix 2016.11.07
gcloud 
gsutil 4.22
gsutil-nix 4.20
```


# ■ Cloud Functions (ALPHA) とは

[CLOUD FUNCTIONS (ALPHA)](https://cloud.google.com/functions/)

![qiita-01-about-gcf.png](https://qiita-image-store.s3.amazonaws.com/0/41522/0570be57-14b9-e32e-77df-e0c95cb351f6.png "qiita-01-about-gcf.png")


> #### イベントベースの軽量なマイクロサービス
> 
> Google Cloud Functions は軽量、イベントベース、かつ非同期のコンピュート ソリューションです。クラウド イベントに対応できる、単一目的の小規模な関数を作成することができます。サーバーやランタイム環境を管理する必要はありません。Google Cloud Storage と Google Cloud Pub/Sub のイベントは Cloud Functions を非同期的にトリガーできます。また、HTTP からの呼び出しによって同期実行することもできます。
> 
> - Cloud Functions - サーバーレスなマイクロサービス  |  Google Cloud Platform
> https://cloud.google.com/functions/


私：「簡単に言えば AWS Lambda の Google版か。対抗馬ってことね。ん？『AWS Lambda』ってそもそもなんだっけ？」

### 「AWS Lambda」ってなんだっけ？

> #### AWS Lambda とは
> 
> AWS Lambda は、コードを AWS Lambda にアップロードすると、サービスが AWS インフラストラクチャを使用してコードの実行を代行するコンピューティングサービスです。コードをアップロードして、Lambda 関数と呼ばれる関数を作成することで、AWS Lambda がコードを実行するサーバーのプロビジョニングおよび管理を行います。AWS Lambda は次のように使用できます。
> 
> - AWS Lambda とは - AWS Lambda
> http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html


私「あー、非常駐型プロセスで、Event Driven で動いて、処理が終わったら、すぐ死ぬやつか。『サーバーレスアーキテクチャ』とかってやつと関係してるんだっけ？」

### 「サーバーレスアーキテクチャ」ってなんだっけ？

> #### サーバーレスアーキテクチャ登場の背景 - アプリケーションサーバーとの比較
> 
> 2015年になってから「サーバーレスアーキテクチャ」というコンセプトを耳にするようになった。その思想をシンプルに表現すれば「メンテナンスすべきアプリケーションサーバーがなければメンテナンスコストはかからない」となるだろう。
> 
> サーバーレスアーキテクチャは原始的なCommon Gateway Interface (CGI)に近いシンプルなアーキテクチャだ。サーバーレスアーキテクチャ上のファンクションは、何らかのイベントをトリガーとして呼び出される。イベントごとに実行プロセスが起動し、ファンクションの終了とともにプロセスが終了する。アプリケーションサーバーが「常駐型プロセス」を実行するインフラストラクチャだとすれば、サーバーレスアーキテクチャは「非常駐型プロセス」をイベントによってトリガーするインフラストラクチャだといえるだろう。
> 
> AWS Lambdaのようなクラウドインフラストラクチャ上でサーバーレスアプリケーションを構築すれば、インフラストラクチャのスケーラビリティや可用性（アベイラビリティ）はクラウド事業者の仕事になる。開発者はインフラストラクチャに関する仕事の多くから解放されるということだ。
> 
> - サーバーレスアーキテクチャという技術分野についての簡単な調査 - Qiita
> http://qiita.com/zerobase/items/3bc0d15980b472af841d

私「サーバメンテとかは任せて、イベントをトリガーに lambda とか動かす新しい設計パターンってことかね」

### なぜ Cloud Functions を触ろうと思ったか
前置きが長くなりすぎました。そんな AWS Lambda の対応馬の Cloud Functions

- 思ってたより「Cloud Functions 試した！」みたいな記事が少ない（まーAlphaだってのもあるけど）
- Lambda は業務で触ってるのでどんなもんか気になっていた
- Amazon クオリティーに嫌になる時が時々あったから浮気心が芽生えた

などの理由から試してみようと思った次第です。


# ■ Cloud Functions 導入方法について

[クイックスタート | Cloud Functions](https://cloud.google.com/functions/docs/quickstart) に沿って進めていきます。
![qiita-04-1-step.png](https://qiita-image-store.s3.amazonaws.com/0/41522/e9d55c9d-0ce3-a0ac-3a7e-29a4f5f1d817.png "qiita-04-1-step.png")


### 準備.1 ホワイトリストへの登録リクエスト
Cloud Functions はまだアルファ版のため、ホワイトリストへ登録する必要があります。

[Google Cloud Functions - Alpha Sign Up](https://docs.google.com/forms/d/1WQNWPK3xdLnw4oXPT_AIVR9-gd6DLo5ZIucyxzSQ5fQ/viewform)

![qiita-05-gcf_Alpha_Sign_Up.png](https://qiita-image-store.s3.amazonaws.com/0/41522/dcb8f582-740e-6902-166f-4911c9c03989.png "qiita-05-gcf_Alpha_Sign_Up.png")


### 準備.2  Cloud Platform Console プロジェクトを選択または作成
GPC用のプロジェクトの作成。（Google APIs など使ったことがある人は作ったことあるかと）

![qiita-06-create_project.png](https://qiita-image-store.s3.amazonaws.com/0/41522/ee502381-8529-3a88-5c70-d7720fc265a8.png "qiita-06-create_project.png")


### 準備.3 プロジェクトの課金を有効にする（クレジットカードの登録を行う）
準備.2 で作成したプロジェクトの課金を有効にします。

![qiita-07-enable_billing.png](https://qiita-image-store.s3.amazonaws.com/0/41522/ff4b9328-36fb-02a0-dbaf-c36132c6e9fb.png "qiita-07-enable_billing.png")

ちなみにクレカは登録しますが、今は無料トライアル中で 60日間の利用 or 300米ドル分の利用 が可能です。

[無料の試用版に申し込む  |  Google Cloud Platform](https://cloud.google.com/free-trial/)
![qiita-08-free_trial.png](https://qiita-image-store.s3.amazonaws.com/0/41522/2cf69062-e3de-be96-316b-a26e1bdc3922.png "qiita-08-free_trial.png")
> 無料試用を利用できる期間を教えてください。
> 
> 無料試用は、60 日が経過したとき、または 300 米ドル分の利用があったときに終了します。クレジット残額と試用期間終了までの残りの日数は Google Cloud Platform Console の上部に表示されます。

### 準備.4 Cloud Functions API を有効にする
[ENABLE THE API] ボタンをポチッと

### 準備.5 Google Cloud SDK をインストールし、初期化する
[Google Cloud SDK ドキュメント](https://cloud.google.com/sdk/docs/)

![qiita-09-Google_Cloud_SDK Doc.png](https://qiita-image-store.s3.amazonaws.com/0/41522/9f3d91b5-f8e2-0e3c-e9bd-a34d8e1187f8.png "qiita-09-Google_Cloud_SDK Doc.png")

```
$ python -V                      
Python 2.7.10
$ curl https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-121.0.0-darwin-x86_64.tar.gz > google-cloud-sdk-121.0.0-darwin-x86_64.tar.gz
$ tar zxvf google-cloud-sdk-121.0.0-darwin-x86_64.tar.gz
$ ./google-cloud-sdk/install.sh
$ ./google-cloud-sdk/bin/gcloud init
```

### 準備.6 gcloud アルファ版のコマンド コンポーネントをインストール
```
gcloud components install alpha
```

# ■ Cloud Functions で「Hello, World」
### ステップ.1 関数を作成
- ディレクトリを掘る

```
mkdir ~/gcf_hello_world
cd ~/gcf_hello_world
```

- index.jsを作成

```
$ vim index.js

exports.helloWorld = function helloWorld (context, data) {
  console.log('My Cloud Function: ' + data.message);
  context.success();
};
```

### ステップ.2 バケットの作成
クイックスタートでは新規に作成していたが、 `Starage` のバケットをコンソールから確認して見るとすでに生成されていたため、それを使用する（プロジェクト作成時に自動生成される？）
![スクリーンショット 2016-12-05 23.38.35.png](https://qiita-image-store.s3.amazonaws.com/0/41522/d3f20ab6-caf7-7330-f8c4-aef43b4b8484.png "スクリーンショット 2016-12-05 23.38.35.png")

### ステップ.3 関数をデプロイする😱
ここで問題が、、、なぜかデプロイがうまくいかない...😱😱😱

```
$ gcloud alpha functions deploy helloWorld --bucket [BUCKET_NAME] --trigger-topic hello_world
ERROR: (gcloud.alpha.functions.deploy) ResponseError: status=[403], code=[Forbidden], message=[Cannot access Google Cloud Functions API in project sample-151514]
```

403が返ってくる。。考えてみればホワイトリストに登録後、Google から返信があるらしいがこない。。😱

### gcloud バージョン

```
$ gcloud --version
Google Cloud SDK 136.0.0
alpha 2016.01.12
bq 2.0.24
bq-nix 2.0.24
core 2016.11.30
core-nix 2016.11.07
gcloud 
gsutil 4.22
gsutil-nix 4.20

$ date 
2016年 12月 6日 火曜日 01時57分31秒 JST
```


# 本当はここでこんな風に動くらしい...
- 関数のステータスを確認（READY 状態であることを確認）

```
$ gcloud alpha functions describe helloWorld

status: READY
triggers:
- pubsubTopic: projects/[PROJECT_ID]/topics/hello_world
```

- 関数実行（call ）

```
$ gcloud alpha functions call helloWorld --data '{"message":"Hello World!"}'
executionId: eTe2wjR29wZU-0 # gcloud は関数の実行 ID を次のような形式で返します
```

- ログ確認（実施結果が確認できる）

```
$ gcloud alpha functions get-logs helloWorld

LEVEL  NAME        EXECUTION_ID    TIME_UTC                 LOG
D      helloWorld  -               2016-03-17 20:35:41.043  User function helloWorld loaded
D      helloWorld  eTe2m2-RVmJU-0  2016-03-17 20:45:18.334  User function triggered, starting execution
I      helloWorld  eTe2m2-RVmJU-0  2016-03-17 20:45:18.335  My Cloud Function: Hello World!
D      helloWorld  eTe2m2-RVmJU-0  2016-03-17 20:45:18.335  Execution took 2 ms, user function completed successfully
```


# まとめ
以下のことを試したが結局ダメだった。。

- ホワイトリストに登録済みか確認（すでにフォーム入力済みですとなる...）
- Google アカウントを新規に作ってホワイトリストへ登録してみる
- バケットを作り直してみる
- バケットの権限を見直してみる
- gcloud コマンドを最新(136.0.0)にしてみる
- [google cloud shell](https://cloud.google.com/shell/docs/) から実行してみる

すみません、非常に残念な記事になってしまった。。Alpha版だからかな、、、時間をおいてまたチャレンジしたいと思います。。
何か情報をお持ちの方、教えていただけると幸いです...