概要
先日Google Cloud FunctionsのBetaがリリースされました。
実行エンジンのNode.jsのバージョンは現在6.9.1(2017/03/12時点)ですが、async/await等の更に新しい構文を使いたい場合はBabelを利用する必要があります。今回はBabelでコンパイルしてデプロイが出来るようにしてみたいと思います。
Babel設定
以下、Babel関連のライブラリと設定ファイルです。
{
...
"devDependencies": {
"babel-cli": "^6.23.0",
"babel-core": "^6.23.1",
"babel-loader": "^6.3.2",
"babel-preset-es2015": "^6.22.0",
"babel-preset-es2016": "^6.22.0",
"babel-preset-es2017": "^6.22.0",
"babel-register": "^6.23.0"
},
...
.babelrc
{
"presets": [
"es2015",
"es2016",
"es2017"
]
}
ES2015, ES2016, ES2017のPresetが使えるようにしています。
npm installしておきます。
npm install
Functionコード
FunctionのタイプはHTTPをトリガーにしたものとBackgroundで起動するものとありますが、今回はHTTPのものを作成します。ソースコードはsrcディレクトリ以下に配置します。
import uuid from 'uuid'
export const helloBabel = (req, res) => {
res.send(`Hello babel gcf! - ${uuid()}`)
}
依存ライブラリを追加した場合の動作も確認するため、
Handling Dependencies | Cloud Functions Documentation | Google Cloud Platform
の例に参考にし、uuidを利用しています。
npm install uuid --save
Bucketを用意
デプロイ前に、Functionを配置するためのBucketを用意しておく必要があります。
PROJECT_ID=your-project
BUCKET_NAME=your-bucket
gsutil mb -p $PROJECT_ID gs://$BUCKET_NAME
※gsutilコマンドを使うにはCloud Tools をインストールする必要があります
デプロイ
Google Cloud Functionのデプロイコマンド(gcloud beta functions deploy
)では、index.jsファイルが直下に配置されていることを想定しているようです。どのfunctionを起動させるかfunction名を指定することはできるんですが、ファイルパスを指定することは出来無さそうでした(出来るなら知りたいです..)。
※2017/10/02 コメントで指摘頂き修正しました。package.jsonの"main"
で対象ファイルパスを指定可能です。
package.jsonのscriptsに以下のスクリプトを登録しておきます。
{
...,
"scripts": {
"clean": "rm -fr ./dist",
"transpile": "babel src --out-dir dist",
"deploy": "npm run clean && npm run transpile && gcloud beta functions deploy hello-babel-gcf --entry-point helloBabel --stage-bucket hello-cloud-functions --trigger-http"
},
...
}
npm run deploy
でデプロイ実行できます。
Functionの実行
HTTPでリクエストを送ってみると、以下のように結果が返ってくることが確認できます。
$ curl https://us-central1-cloud-function-sandbox.cloudfunctions.net/hello-babel-gcf
Hello babel gcf! - 790c9410-9b2a-4593-b86f-fca40375e8ff
まとめ
ひとまずこれでバベることが出来るようになりました。