【Hinemos】AWS Lambda関数をHinemosから実行する
投稿日: / 更新日:
この記事は2年以上前に書かれたものです。情報が古い可能性があります。
今回は、Hinemosのジョブを使用して、AWS Lambda関数をAPI Gateway経由で呼び出す設定例をご紹介します。
AWS Lambdaは、AWS上で任意のコードを実行するための仕組みで、実行にEC2インスタンスを必要としない点が大きな特徴です。AWS Lambda関数は、指定した間隔での定期実行、またはcronベースのスケジュール実行が可能となっていますが、待ち条件等の複雑な実行制御を行いたい場合は、外部ツールの力を借りる必要があります。このような場合に、Hinemosのジョブ機能を利用すると便利です。
それでは、実際の設定例をご紹介します。
1. AWS Lambda関数の作成
まず、AWS Lambda関数を作成します。ここではシンプルに、Hello Worldのjsonを返すだけのロジックを実装します。
AWS Lambdaの管理コンソール上から、”Create a Lambda function”ボタンをクリックすると、”Step 1: Select blueprint”の画面に遷移します。ここで、Lambda関数のテンプレートを選択することも可能ですが、今回はテンプレートを使用しないため、右下の”Skip”をクリックします。
“Configure function”の画面に遷移したら、関数の名前と説明を”Name”と”Description”欄に入力します。ここでは、いずれも”testfunction”としています。また、使用する処理系を”Runtime”欄で選択し、テキストエリア内にコードを入力します。今回は、”Runtime”は”Node.js”のままとし、以下のコードを貼り付けます。
1 2 3 4 5 |
console.log('Loading event'); exports.handler = function(event, context) { context.done(null, {"Hello":"World"}); // SUCCESS with message }; |
下図は、実際に入力した様子です。
画面の下部では、関数ハンドラー(Handler)とロール(Role)を指定します。今回は、以下のように設定します。なおロールについては、リストボックスのプルダウンメニューから、”Create new role”直下の”*Basic Execution role”を選択すると、必要な権限を持ったロールが作成されます。今回は、そのようにして事前に作成したロール(lambda_basic_execution)を指定しています。
“Next”をクリックし、最終確認画面に遷移します。内容に問題がなければ、”Create function”をクリックします。
以上で、Lambda関数の作成は完了ですが、念のため、期待どおり動作するかテストしてみます。”Test”ボタンをクリックすると、関数へ渡すイベント(json)の設定ダイアログが表示されますが、今回の関数はイベントを単純に無視するようになっていますので、このまま”Save and test”をクリックします。
Lambda関数が実行され、結果が表示されます。”Execution result: succeeded”と表示され、期待どおり”Hello World”のjsonが返っていれば、テストは成功です。
2. ポリシーのアタッチ
次に、先ほどのLambda関数に割り当てたロールに対して、API Gateway経由でコードを実行するためのポリシーをアタッチします。
AWS管理コンソール右上のアカウント名をクリックし、プルダウンメニューから”認証情報”を選択し、遷移先の画面の左側のメニューで”ポリシー”をクリックします。既存のポリシーが一覧表示されますので、”フィルター”のテキストボックスに”apigateway”と入力します。ポリシーが絞り込み表示されたら、”AmazonAPIGatewayInvoke…”のポリシーの先頭にチェックを入れます。
この状態で、”ポリシーアクション”メニューの”アタッチ”をクリックします。”ポリシーのアタッチ”画面に遷移しますので、ここでは、先ほどLambda関数に割り当てたロール(lambda_basic_execution)にチェックを入れ、”ポリシーのアタッチ”をクリックします。
以上で、Lambda関数の実行ロールに対して、API Gateway経由で呼び出しを行うために必要なポリシーがアタッチされました。
3. APIの作成
続いて、Lambda関数をHTTPで呼び出すためのAPIを作成します。
まず、API Gatewayの管理コンソール上で、”Create API”をクリックします。作成するAPIの名前(API name)と説明(Description)を入力する画面に遷移しますが、ここではシンプルに、両方とも”apitest”と入力し、”Create API”をクリックします。
APIが作成され、既存のAPIのリソースツリー表示画面に遷移します(API Gatewayにおいて、”リソース”とは、APIを通してアクセスできる論理的なエンティティです。ざっくばらんにいえば、URLの”R”と同じ意味と考えて差し支えないと思います)。ここでは、新しいリソースを作成するために、”Create Resource”をクリックします。
“New Child Resource”の画面に遷移しますので、リソース名(Resource Name)とパス(Resource Path)を入力します。ここでは、リソース名に”testresource”を入力します。パスについては、リソース名を小文字に変換したものが自動的にセットされますので、そのままで構いません(パスのみ、別の文字列を入力することも可能です)。パスは文字どおり、APIを呼び出すためのURLのパスとして使用されます。入力後は、”Create Resource”をクリックし、リソースの作成を完了します。
リソースが作成されたら、左側のリソースツリー上で、先ほど作成した”/testresource”をクリックして選択し、”Create Method”をクリックします。ツリーの配下にリストボックスが出現しますので、プルダウンから”GET”を選択します。これにより、リソースをGETメソッドで呼び出すための設定画面が表示されます。
設定画面上では、”Integration type”に”Lambda Function”を選択します。すると、その下の設定項目がLambda用のものに変化しますので、Lambda関数を作成したリージョンと、Lambda関数の名前をそれぞれ設定し、”Save”をクリックします。
Lambda関数を起動するためのAPI Gatewayの許可を与えて良いかどうかの確認ダイアログが表示されます。”OK”をクリックします。
GETメソッドが作成され、リクエストからレスポンスまでのフローが表示されます。
ここで、作成されたAPIを実際にテストしてみます。”Client”ボックスの”TEST”をクリックします。GETメソッドをテストするための画面に遷移しますので、右端の”Test”をクリックします。
API経由でLambda関数が実行され、結果が表示されます。
画面上部の”<- Method Execution”をクリックして、前の画面に戻ったら、仕上げにAPIをデプロイします。”Deploy API”ボタンをクリックすると、デプロイ先のステージの設定ダイアログが表示されます。”ステージ”とは、APIのデプロイの設定(パス、APIキャッシュの有効化、CloudWatchのロギングの有効化など)をひとまとめにしたもので、同じAPIでも、ステージを例えばテスト用/本番用のように切り替えることが可能です。ここでは、新しいステージを作成するために”New Stage”を選び、ステージ名(Stage Name)やその他の説明を下図のように設定します。なお、ステージ名はAPI起動用URLのパスの一部として使用されます。
“Deploy”をクリックすると、APIがステージにデプロイされ、”Invoke URL”にAPI起動用のURLが表示されます。
ただし今回の場合、このURLにアクセスしても期待どおりの動作になりません。左側のツリー上で”teststage”を展開し、”/testresource”配下のGETをクリックすると、GETメソッドを起動するためのURLが表示されます(先ほどのURLの末尾に”/testresource”が追加されています)。
このURLをクリックすると、APIが実行され、Hello Worldのjsonがめでたくブラウザに返されます。
以上で、API Gateway経由でLambda関数を実行できるようになりました。
4. Hinemosジョブの作成
ここまで来れば、あとはHinemosでジョブを作成するだけです。今回は、Hinemosマネージャサーバ上のHinemosエージェントでジョブを実行しますので、あらかじめマネージャとエージェントを起動しておきます。また、今回はAPIの呼び出しにcurl
コマンドを使用しますので、このサーバ上にcurlパッケージをあらかじめインストールしておきます。
Hinemosマネージャサーバをリポジトリにノードを登録したら、そのノードを対象としたジョブを作成します。ジョブの”コマンド”タブには、先ほどデプロイしたAPIのURLを、次のように設定します。
1 2 |
curl https://**********.execute-api.ap-northeast-1.amazonaws.com/teststage/testresource (一部伏字にしています) |
ジョブをHinemosマネージャに登録したら、試しに実行してみます。期待どおり、Lambda関数の戻り値が標準出力として得られていることが分かります。
あとは、このジョブをジョブネットに組み込めば、待ち条件等の複雑な実行制御が可能となります。
以上、簡単ですが、Hinemosのジョブを使用して、AWS Lambda関数をAPI Gateway経由で呼び出す設定例をご紹介しました。