Workato：AWS Lambdaコネクターを利用してWorkatoからLambda関数を実行する

# はじめに

WorkatoにはAWS Lambdaコネクターがあり、このコネクターを利用するとWorkatoからAWS Lambda上のLambda関数を呼び出す（実行する）ことができます。また、実行結果を取得し、その値をWorkatoの後続の処理で利用することもできます。

以下では、AWS Lambdaを利用するメリットと、WorkatoでAWS Lambdaコネクターを利用する手順について、簡単に説明します。

# AWS Lambdaを利用するメリット

## １．Workato上からLambda関数を実行して、その結果を取得することができる

「はじめに」で記載した通りですが、作成した、あるいは既に作成済み（現在利用中）のLambda関数をWorkato上から実行することができます。また、実行後の結果（戻り値）を取得し、Workatoの後続の処理でその結果を利用することができます。

## ２．Lambda関数はWorkato以外でも利用可能で、他システムとの処理共通化にも有効

Lambda上に実装した処理（Lambda関数）は、Workatoに限らず、Lambdaに対応した他のiPaaS、EventBridgeなどのAWSサービス、自社で構築したシステム等と連携し、利用することができます。

例えば、Workatoと自社システムで共通する処理があれば、その処理をLambda関数として実装することで、それぞれに同じようなロジックを持つことなく（車輪の再開発を行うことなく）、処理の共通化を実現することができます。

また、AWSを使い続けることは前提となりますが、現在利用中のシステムから他のシステムへ移行する際、移行先のシステムがLambdaとの連携に対応していれば、これまで実装したLambda関数を移行後も継承して利用し続けることが出来ますので、資産継承の面でも有効です。

## ３．WorkatoのカスタムコネクターやRubyコネクター、JavaScriptコネクターで対応できない処理を実装できる

Workatoにはカスタムコネクターや、Rubyコネクター、JavaScriptコネクターが存在します。それらを利用することで、Community Libraryを含め、既存のコネクターとして提供されていない、あるいは既存のコネクターで提供されていない機能を実装することが出来ます。

しかし、これらのコネクターはRubyあるいはNode.jsのサブセットであり、それらの全てのメソッドやライブラリが利用できるわけではないため、実装可能な処理に制限があります。また、外部ライブラリのインポートもできないため、自ら同じ処理をスクラッチで実装することになります。よって、これらのコネクターを利用する際は、制限を理解しながら実装を進めていくことになります。

これに対してLambdaコネクターを利用すると、ほぼ制限なく様々な処理を実装できるようになります。例えば、SeleniumやPuppeteerを利用して、RPAっぽい感じでWebブラウザのオートメーションを行いたい場合、Lambdaコネクター以外でそのような処理を実現することはできませんが、Lambdaコネクターであれば実現することが可能です。

## ４．利用可能なランタイムやメソッド、ライブラリの制限を受けない

Workatoでコードを利用して実装する場合はRubyあるいはJavaScriptに制限されますが、AWS LambdaではLambda関数として実行可能なものであれば、どのような言語（ランタイム）でも利用することが可能です。また、WorkatoのRubyコネクターやJavaScriptコネクターでは利用可能なメソッドに制限がありますが、AWS Lambdaではその制限を受けることがありません。また、外部ライブラリも自由にインポートして利用することが出来ますので、自由度の高い開発が可能です。

## ５．使い慣れた開発環境で開発が可能

Lambda関数は、AWSマネジメントコンソール上でインラインで開発することが可能ですが、Visual Studio CodeやIntelliJ IDEAなど、使い慣れたテキストエディタやIDEを利用して開発することも可能です。また、Serverless Frameworkを使ったデプロイや、GitやSubversionを利用したバージョン管理にも対応できるため、効率の良い開発が行えます。


# 手順
## １．Lambda上に関数を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/09741d86-53e3-e04f-5974-551a2e50fd12.png)


### コード例
以下ではPython3.xのコードを例にしていますが、AWS Lambdaで利用可能なものであれば、言語（ランタイム）はどのようなものを選択しても構いません。

```python
import json

def lambda_handler(event, context):
    # TODO implement
    return {'result': 'Hello ' + event['name']}

```

## ２．Workatoに次のようなレシピを作成します。
例えば、特定の時間（間隔）でLambda関数を実行し、その結果をSlackの特定チャンネルへ返すレシピを作成する場合は、次の通りとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/bc24580e-6094-cec4-3cde-0dd3a3b428e7.png)


### １）トリガーを設定します。
利用用途に合わせて適切なコネクターを選択し、設定します。（以下では、Scheduler for Workatoを使用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/2f841d95-8710-4982-c3c5-9fb2ab79fa3b.png)

### ２） AWS Lambdaコネクターを追加し、設定します。
#### １で作成したLambda関数を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a02ec3d1-07a4-7a57-58e8-6d2cf7d21318.png)

#### Lambda関数へ渡すための引数のスキーマを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a94fcd72-8909-b1dd-c40f-19028b63b305.png)

#### Lambda関数からの戻り値のスキーマを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/aec09305-d0b6-687c-cf41-c6ea29f88f1f.png)

なお、WorkatoにおいてLambda関数からの戻り値は、以下のようにresponseというオブジェクトの配下にセットされるようになっていますので、スキーマも同様に（response配下に戻り値がセットされるように）定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/edcf8e68-faee-d212-ae1a-6a5357691b08.png)

### ３）Lambda関数実行後の戻り値を、後続のアクションで利用します。
利用用途に合わせて適切なコネクターを選択し、設定します。（以下では、Workbot for Slackを使用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b2e58d6a-0a2d-7f92-5c84-b40f58a04b89.png)

## ３．レシピを実行し、結果を確認します。
本レシピの場合、次のようにLambda関数で実行された結果が、Slackの特定チャンネルへメッセージとして投稿されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/3618fa8f-2b71-677c-ac1a-58bd1a7a24cb.png)


# 参考情報

https://docs.workato.com/connectors/aws_lambda.html