kintone の Webhook を理解する為に、AWS Lambda に API Gateway 経由で Webhook通知を投げてみます。
その前段階として、Cloud9 から Lambdaを実行する環境を整えます。
本記事のキーワード一覧
本記事では下記のキーワードについて取り上げています。
- AWS Cloud9
- AWS API Gateway
- AWS Lambda
- AWS CodeCommit
- Node.js
AWS Cloud9 に Lambda 環境を設定する
AWS Cloud9 の AWS Lambda チュートリアルを参考に進めます。
Cloud9環境のセットアップが終わっていれば、[ステップ 2: Lambda 関数と API を作成する]から進めます。
AWS Settings から Lambdaを実行するリージョンを選択します。(今回は東京リージョン)
AWS Resources をクリックして展開された場所にある、Lambda+ マークを押します。
Create serverless application ダイアログが開くので、下記を入力します。
- Function name に関数の名前を入力します。(kintoneWebhookTest)
- Application name に、サーバーレスアプリケーションの名前を入力します。(kintoneWebhookTestApp)
runtimeに Node.js を選択して、blueprintは empty-nodejs を選択します。
Function trigger は API Gateway を選択。 Path は / (スラッシュ)を入れます。
その他もチュートリアルの通りに進みます。
Finish を選択して少し経つと作成された Lambda関数が表示されます。
左側が Cloud9 上のローカルLambda関数。右側がAWS リソースに表示されるLambda関数です。
AWS Lambda サービスから確認
Cloud9 で設定した Lambda を Lambda サービス画面から確認してみます。
作成されていることが確認できます。
テストコードの実行
テストコードの作成
ステップ 3: 関数にコードを追加する を参考に、テストコードを入れ替えます。
最初にあったコードはコメントアウトして、コンソールに'kintoneWebhookTest'、event
の中身をログ出力するように追加しています。
// exports.handler = (event, context, callback) => {
// // TODO implement
// callback();
// };
'use strict';
console.log('kintoneWebhookTest');
exports.handler = (event, context, callback) => {
console.log(event);
if (event.body) {
event = JSON.parse(event.body);
}
省略
関数の内容は特に気にしないで進めます。
テストコードの実行
Cloud9 にて Lambda を実行します。
ステップ 4: 関数をローカルで実行またはデバッグする を参考に進めます。
作成した Lambda 関数の上で右クリック → Run → Run Local を選択します。
テストコードに渡す入力値を JSON 形式で入力します。
{
"option": "date",
"period": "today"
}
結果が Response として表示されます。
テスト実行結果の確認
テスト1
実行日は 2019年10月18日です。
ペイロード(JSONで送るデータ)
{
"option": "date",
"period": "yesterday"
}
レスポンスとログを確認
Response
{
"statusCode": 200,
"headers": {
"Content-type": "application/json"
},
"body": "{\"month\":10,\"day\":17,\"year\":2019}"
}
Function Logs
2019-10-18 00:05:33.389 kintoneWebhookTest
2019-10-18 00:05:33.390 { option: 'date', period: 'yesterday' }
テストコードの説明
コードにコメントを入れました。
exports.handler = (event, context, callback) => {
exports は Node.js の機能です。 イhandler はイベント処理用の Lambda 関数内のメソッドで、exports.handler は handler 関数を エクスポートして外部から使えるようになります。
/**
* payload で渡された JSON の option, period で 分岐します。
* 1段目→ date 2段目→ yesterday, today, tomorrow, その他はエラー
* 1段目→ time 現在の時間を返す
* その他はエラー
*
*/
switch(event.option) {
case "date":
switch(event.period) {
case "yesterday":
result = setDateResult("yesterday");
sc = 200;
break;
case "today":
result = setDateResult();
sc = 200;
break;
case "tomorrow":
省略
default:
result = {
"error": "Must specify 'date' or 'time'."
};
sc = 400;
break;
}
const response = {
statusCode: sc,
headers: { "Content-type": "application/json" },
body: JSON.stringify( result )
};
callback(null, response);
呼び出し元からのJSONデータを使い、分岐して戻り値を変えています。
callback は 第1引数に エラー、第2引数に レスポンスをセットします。
テストコードでは、エラーの場合はレスポンスのbodyに "error": "Must specify 'date' or 'time'." の文字列をセットして、第1引数のエラーには null をセットしています。
エラーの確認
payloadの値を変更してエラーの出力を確認します。
{
"option": "date",
"period": "nextday"
}
結果。
レスポンスにエラーが表示されます。
{
"statusCode": 400,
"headers": {
"Content-type": "application/json"
},
"body": "{\"error\":\"Must specify 'yesterday', 'today', or 'tomorrow'.\"}"
}
本環境へのデプロイ
ここまでは、Cloud9 にて Lambda関数を作成していました。(ローカル環境)
実際の AWS Lambda 環境に修正したコードをデプロイします。
デプロイ
手順は ステップ 6: 関数を本稼働環境で実行する の内容になります。
ローカルの Lambda関数を右クリック、[Deploy] を選択して本環境へデプロイします。
AWS Lambda サービスを選択して、デプロイしたコードを確認すると反映されていることが分かります。
本環境で実行結果の確認
ローカルの Lambda関数を右クリック、[Run][Run Remote]を実行します。
レスポンスから結果が同じことを確認します。
API Gateway で確認
最終的には API Gateway 経由で外部から Lambda を実行することになるので、Cloud9 から API Gateway を実行してみます。
ローカル実行
エラーを確認
最初の設定でエラーになることを確認します。
設定を変更します。
メソッド:POST
パラメータ:
{
"option": "date",
"period": "yesterday"
}
OKを確認します。
リモート実行
OKを確認します。
AWS CodeCommit によるソースコード管理
開発中のソースコードを管理するために、AWS CodeCommit を利用します。
AWS Cloud9 の AWS CodeCommit サンプル を参考に環境を設定します。
IAM グループの作成
今回グループポリシーは [AWSCodeCommitFullAccess] にしておきます。
リポジトリの作成
Cloud9を東京リージョンで作成していますので、東京リージョンのまま管理コンソールからCodeCommit サービスを選びます。
リポジトリ名を入力して作成します。
作成ができたら接続はCloud9のターミナルから行うので、コンソールを閉じます。
Cloud9 から CodeCommit に接続する
ステップ 3: 環境 をリモートリポジトリに接続する を参考に進めます。
Cloud9 のターミナルからコマンドを入力して設定を行います。
リポジトリにコードを追加
作成したコードをリポジトリに追加します。
今回は現在Git管理前の Cloud9 で作成したコードを、前段の CodeCommit で作成したリモートリポジトリに追加します。
ローカルリポジトリを CodeCommit リポジトリに接続する を参考に進めます。
$ ls -la
total 24
drwxr-xr-x 3 ec2-user ec2-user 4096 Oct 19 00:02 .
drwxr-xr-x 5 ec2-user ec2-user 4096 Oct 17 09:21 ..
-rw-r--r-- 1 ec2-user ec2-user 379 Oct 18 03:50 .application.json
-rw-r--r-- 1 ec2-user ec2-user 18 Oct 17 09:21 .gitignore
drwxr-xr-x 2 ec2-user ec2-user 4096 Oct 17 22:20 kintoneWebhookTest
-rw-r--r-- 1 ec2-user ec2-user 862 Oct 17 09:21 template.yaml
:~/environment/kintoneWebhookTestApp $ git init
Initialized empty Git repository in /home/ec2-user/environment/kintoneWebhookTestApp/.git/
:~/environment/kintoneWebhookTestApp (master) $ ls -la
total 28
drwxr-xr-x 4 ec2-user ec2-user 4096 Oct 19 00:09 .
drwxr-xr-x 5 ec2-user ec2-user 4096 Oct 17 09:21 ..
-rw-r--r-- 1 ec2-user ec2-user 379 Oct 18 03:50 .application.json
drwxrwxr-x 7 ec2-user ec2-user 4096 Oct 19 00:09 .git
-rw-r--r-- 1 ec2-user ec2-user 18 Oct 17 09:21 .gitignore
drwxr-xr-x 2 ec2-user ec2-user 4096 Oct 17 22:20 kintoneWebhookTest
-rw-r--r-- 1 ec2-user ec2-user 862 Oct 17 09:21 template.yaml
Cloud9のターミナルを開き、前段で作成したディレクトリに移って git init
します。
Cloud9 上から作成した Lambda 関数は初めからディレクトリに [.gitignore] を含みます。
git init 後に、[.git] ディレクトリができている事が確認できます。
:~/environment/kintoneWebhookTestApp (master) $ git remote add origin https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/kintoneCustomizeRepo
:~/environment/kintoneWebhookTestApp (master) $
:~/environment/kintoneWebhookTestApp (master) $ git remote -v
origin https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/kintoneCustomizeRepo (fetch)
origin https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/kintoneCustomizeRepo (push)
git remote add origin
してリモートリポジトリ情報をローカルに設定します。
git remote -v
で確認します。
git add
, git commit
したら git push
してリモートに反映します。
CodeCommit で確認すると追加されたファイルが確認できます。
新しい Lambda 関数の追加
Cloud9 から同じ Lambdaアプリケーション(Lambda関数のディレクトリ)に 新しい Lambda関数を追加します。
Lambda関数の追加
Lambdaアプリの上で右クリック → [Create Here...] を選択。
runtime を選択して、blueprint(雛形)から [api-gateway-hello-world] を選択。
トリガーは [API Gateway]、Path は [/]、Security は [NONE] を選びます。
エラーが出ますが、後ほど修正します。
API Gateway の実行Pathを修正
作成された Lambda関数の上で右クリック→ [Edit Config] を選択して、[template.yaml]が開くので、[Path: /] を [Path: /recordpost] に修正して保存します。
ローカルで実行
Lambdaローカル実行
API Gatewayローカル実行
リモートにデプロイ
新しく作成した Lambda関数の上で右クリック→ [Deploy]を選択。
リモートで実行
Lambdaリモート実行
API Gatewayリモート実行
リポジトリに反映
ここまでの変更をリモートリポジトリに反映しておきます。
git status
git add .
git commit -m "add new lambda function"
git push -u origin master
次は新しく作成した Lambda関数を修正して、kintone Webhook の通知から呼び出してみます。
関連リンク
AWS Cloud9 から Lambdaを使う関連リンク
- AWS Cloud9 の AWS Lambda チュートリアル
- AWS Cloud9 Integrated Development Environment (IDE) で AWS Lambda 関数を操作する
- AWS Lambda の制限
CodeCommit
Node.js
書籍
- 実践 AWS Lambda 西谷圭介著