3
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS Cloud9 で AWS Lambda を開発する環境を構築してみる

Last updated at Posted at 2019-10-17

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を実行するリージョンを選択します。(今回は東京リージョン)
スクリーンショット 2019-10-17 17.41.59.png

AWS Resources をクリックして展開された場所にある、Lambda+ マークを押します。
スクリーンショット 2019-10-17 17.45.00.png

Create serverless application ダイアログが開くので、下記を入力します。

  • Function name に関数の名前を入力します。(kintoneWebhookTest)
  • Application name に、サーバーレスアプリケーションの名前を入力します。(kintoneWebhookTestApp)
スクリーンショット 2019-10-17 17.53.26.png

runtimeに Node.js を選択して、blueprintは empty-nodejs を選択します。

スクリーンショット 2019-10-17 17.56.09.png

Function trigger は API Gateway を選択。 Path は / (スラッシュ)を入れます。
その他もチュートリアルの通りに進みます。

Finish を選択して少し経つと作成された Lambda関数が表示されます。
左側が Cloud9 上のローカルLambda関数。右側がAWS リソースに表示されるLambda関数です。
スクリーンショット 2019-10-17 18.23.23.png

AWS Lambda サービスから確認

Cloud9 で設定した Lambda を Lambda サービス画面から確認してみます。
スクリーンショット 2019-10-17 18.30.34.png

作成されていることが確認できます。

テストコードの実行

テストコードの作成

ステップ 3: 関数にコードを追加する を参考に、テストコードを入れ替えます。

最初にあったコードはコメントアウトして、コンソールに'kintoneWebhookTest'、event
の中身をログ出力するように追加しています。

index.js
// 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 を選択します。
スクリーンショット 2019-10-18 7.19.55.png

Test payload 画面が開きます。
スクリーンショット 2019-10-18 7.20.36.png

テストコードに渡す入力値を JSON 形式で入力します。

{
  "option": "date",
  "period": "today"
}
スクリーンショット 2019-10-18 7.27.34.png

Run 押下して実行します。
スクリーンショット 2019-10-18 7.28.45のコピー.png

結果が 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' }

テストコードの説明

コードにコメントを入れました。

index.js
exports.handler = (event, context, callback) => {

exports は Node.js の機能です。 イhandler はイベント処理用の Lambda 関数内のメソッドで、exports.handler は handler 関数を エクスポートして外部から使えるようになります。

index.js
  /**
  * 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] を選択して本環境へデプロイします。
スクリーンショット 2019-10-18 12.49.40.png

AWS Lambda サービスを選択して、デプロイしたコードを確認すると反映されていることが分かります。

スクリーンショット 2019-10-18 12.59.47.png

本環境で実行結果の確認

ローカルの Lambda関数を右クリック、[Run][Run Remote]を実行します。
レスポンスから結果が同じことを確認します。
スクリーンショット 2019-10-18 12.50.56.png

API Gateway で確認

最終的には API Gateway 経由で外部から Lambda を実行することになるので、Cloud9 から API Gateway を実行してみます。

ローカル実行

エラーを確認

最初の設定でエラーになることを確認します。

スクリーンショット 2019-10-18 13.28.24.png

設定を変更します。
メソッド:POST
パラメータ:
{
"option": "date",
"period": "yesterday"
}

スクリーンショット 2019-10-18 13.28.51.png

OKを確認します。

リモート実行

リモートで確認します。
スクリーンショット 2019-10-18 13.31.28.png

OKを確認します。

CloudWatchのログも確認できます。
スクリーンショット 2019-10-18 14.06.47.png

AWS CodeCommit によるソースコード管理

開発中のソースコードを管理するために、AWS CodeCommit を利用します。

AWS Cloud9 の AWS CodeCommit サンプル を参考に環境を設定します。

IAM グループの作成

今回グループポリシーは [AWSCodeCommitFullAccess] にしておきます。
スクリーンショット 2019-10-19 7.56.31.png

リポジトリの作成

Cloud9を東京リージョンで作成していますので、東京リージョンのまま管理コンソールからCodeCommit サービスを選びます。

リポジトリ名を入力して作成します。
作成ができたら接続はCloud9のターミナルから行うので、コンソールを閉じます。
スクリーンショット 2019-10-19 8.20.03.png

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 してリモートに反映します。

スクリーンショット 2019-10-19 9.57.55.png

CodeCommit で確認すると追加されたファイルが確認できます。

新しい Lambda 関数の追加

Cloud9 から同じ Lambdaアプリケーション(Lambda関数のディレクトリ)に 新しい Lambda関数を追加します。

Lambda関数の追加

Lambdaアプリの上で右クリック → [Create Here...] を選択。
スクリーンショット 2019-10-19 15.30.54.png

関数名を入力。
スクリーンショット 2019-10-19 14.50.27.png

runtime を選択して、blueprint(雛形)から [api-gateway-hello-world] を選択。
スクリーンショット 2019-10-19 14.52.38.png

トリガーは [API Gateway]、Path は [/]、Security は [NONE] を選びます。
スクリーンショット 2019-10-19 14.54.56.png

実行ロールは前段で作成したロールを選択。
スクリーンショット 2019-10-19 14.55.41.png

確認画面で Finish を選択。
スクリーンショット 2019-10-19 14.56.28.png

エラーが出ますが、後ほど修正します。

API Gateway の実行Pathを修正

作成された Lambda関数の上で右クリック→ [Edit Config] を選択して、[template.yaml]が開くので、[Path: /] を [Path: /recordpost] に修正して保存します。
スクリーンショット 2019-10-19 15.23.38.png

ローカルで実行

Lambdaローカル実行

スクリーンショット 2019-10-19 15.46.11.png

API Gatewayローカル実行

スクリーンショット 2019-10-19 15.46.38.png

リモートにデプロイ

新しく作成した Lambda関数の上で右クリック→ [Deploy]を選択。
スクリーンショット 2019-10-19 15.52.56.png

リモートで実行

Lambdaリモート実行

スクリーンショット 2019-10-19 16.00.04.png

API Gatewayリモート実行

スクリーンショット 2019-10-19 16.00.39.png

リポジトリに反映

ここまでの変更をリモートリポジトリに反映しておきます。

git status
git add .
git commit -m "add new lambda function"
git push -u origin master

次は新しく作成した Lambda関数を修正して、kintone Webhook の通知から呼び出してみます。


関連リンク

AWS Cloud9 から Lambdaを使う関連リンク

CodeCommit

Node.js

書籍

  • 実践 AWS Lambda 西谷圭介著
3
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?