Myuon Corp. Advent Calendar 2016 6日目です。
本記事の概要
実施環境
- 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) とは
イベントベースの軽量なマイクロサービス
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 に沿って進めていきます。
準備.1 ホワイトリストへの登録リクエスト
Cloud Functions はまだアルファ版のため、ホワイトリストへ登録する必要があります。
Google Cloud Functions - Alpha Sign Up
準備.2 Cloud Platform Console プロジェクトを選択または作成
GPC用のプロジェクトの作成。(Google APIs など使ったことがある人は作ったことあるかと)
準備.3 プロジェクトの課金を有効にする(クレジットカードの登録を行う)
準備.2 で作成したプロジェクトの課金を有効にします。
ちなみにクレカは登録しますが、今は無料トライアル中で 60日間の利用 or 300米ドル分の利用 が可能です。
無料の試用版に申し込む | Google Cloud Platform
無料試用を利用できる期間を教えてください。
無料試用は、60 日が経過したとき、または 300 米ドル分の利用があったときに終了します。クレジット残額と試用期間終了までの残りの日数は Google Cloud Platform Console の上部に表示されます。
準備.4 Cloud Functions API を有効にする
[ENABLE THE API] ボタンをポチッと
準備.5 Google Cloud SDK をインストールし、初期化する
$ 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
のバケットをコンソールから確認して見るとすでに生成されていたため、それを使用する(プロジェクト作成時に自動生成される?)
ステップ.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 から実行してみる
すみません、非常に残念な記事になってしまった。。Alpha版だからかな、、、時間をおいてまたチャレンジしたいと思います。。
何か情報をお持ちの方、教えていただけると幸いです...