【AWS】【Salesforce】CTIフローからLambda関数を呼び出す

# 1.はじめに
どうも、ARIの名古屋支社に勤務している愛知県民です♪
(/・ω・)/

今回は少し応用として、**CTIフローからLambda関数を呼び出す方法**について記事にしたいと思います。
以下の記事の内容を組み合わせて、CTIフローからApexクラスのメソッドを、
ApexクラスのメソッドからLamda関数を呼び出すことで実現します。

https://qiita.com/Aichi_Lover/items/7d7e865a8c0ab85ef7e5

https://qiita.com/Aichi_Lover/items/30d58a7213caf8df14cc

この記事がAWSやSalesforceについて勉強中の方の参考になれば幸いです♪
(*^^)v

# 2.用語の説明

## 2.1.Apexとは
Apexとは、JavaベースのSalesforce独自のプログラム言語です。

Salesforce内のオブジェクトの検索や作成をするメソッド等が提供されており、
それらを組み合わせて処理を記述することができます。

Apexクラスとは、オブジェクト指向におけるクラスと同様のものとなります。

## 2.2.CTIフローとは
CTIフローとはCTI Adapterの機能の1つで、
ボタンのクリックや着信をトリガーとして特定のレコードを作成したり、
ポップアップを表示したりすることができます。
（Salesforce内のコンタクトフロー的なものという認識です。）

ちなみに、他のCTI Adapterの機能としては以下の3種類があります。

* Attributes
* Presence Sync Rules
* Features

## 2.3.Lambdaとは
LambdaとはAWSのサービスの1つで、コードを書くだけで即実行ができるサービスのことです。
サーバの設定等が不要なため、便利です。

ただし、15分以上続けて実行することはできないため、
複雑なアプリケーションの場合はEC2やECRでの実行が必要となります。

# 3.前提条件
以下に前提条件を示します。

* Sandboxが作成済であること
* CTI Adapterのインストールが完了していること
※本記事におけるCTI Adapterのバージョンは5.17です

# 4.概要
今回は例として「statusCode = 200」および「message = Salesforce-Test」を
返す以下のLambda関数を呼び出し、画面上にポップアップさせたいと思います。

```Python:lambda_function.py
import json

def lambda_handler(event, context):
    return {
        'statusCode':'200',
        'message':'Salesforce-Test'
    }
```

また、構成図は以下となります。

|![010_構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/0eea242d-9d6e-250b-9ae0-9a792e410b50.png)|
|:--|


# 5.AWSでの設定

5.1.AWS環境にログインします。
5.2.以下の記事を参考に、裏でLambda関数が動くREST APIを作成します。
（他の方の記事ですが、いつか自分で同様の記事を作成するかもです・・・）

:::note info
API GatewayのURLをメモしておいてください。
後ほどSalesforceの設定で使用します。
:::

https://qiita.com/naoki_koreeda/items/c2a32198c86e8d9a5bb6

# 6.SalesforceのSandboxでの設定

6.1.Sandboxにログインします。
6.2.記事の手順を参考に、以下のコンポーネント3つを作成し、本番環境にアップロードします。
* Apexクラス「CallLambda」
* 「CallLambda」のテストクラス
* Mock

https://qiita.com/Aichi_Lover/items/7d7e865a8c0ab85ef7e5

# 7.Salesforceの本番環境での設定
7.1.本番環境にログインします。
7.2.記事の手順を参考に、CTIフローを作成します。

https://qiita.com/Aichi_Lover/items/30d58a7213caf8df14cc

また、記事の手順5.3における設定は以下となります。

|![010_CTIフローの詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/08ed02b2-c48a-b27e-1ec2-830d514b0be0.png)|
|:--|

|番号|項目|設定内容|
|---|---|---|
|①|apexClass | CallLambda |
|①|methodName | callLambda |
|①|methodParams | want=statusCode もしくは want=message|
|②|message | $.actions.uid-（ブロック①のID）.results.runApex |
|③|message | エラー |

7.3.設定画面を開き、検索欄に「リモート」と入力し、「リモートサイトの設定」を選択します。

|![100_リモートサイトの設定を選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/4ec60c76-4c75-46ad-6767-ca0d0fabdf92.png)|
|:--|

7.4.「新規リモートサイト」を選択します。

|![110_新規リモートサイトを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/c1c95175-7141-3a60-4e6e-b7c196031bc3.png)|
|:--|

7.5.「リモートサイト名」を入力し、「リモートサイトのURL」にAPI GatewayのURLを入力し、「保存」を選択します。

|![120_リモートサイトのURLを設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/bf3ca9a5-1431-ea16-8a22-d0e2a32210e8.png)|
|:--|

# 8.動作確認
8.1.Salesforce上でCCP開き、右側にある「<」を選択します。

|![030_CCPの＜マークを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/efe725af-f046-21b7-5b86-84a8b26d95d0.png)|
|:--|

8.2.CTI Actionの右の「Execute」を選択します。

|![040_CTI_Actionを起動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/5e3f5299-2d73-84f3-51d7-c9fd7467e014.png)|
|:--|

8.3.1.手順7.2の設定でmethodParamsを「want=statusCode」にした場合は、以下のポップアップが表示されます。
|![020_want=statusCodeの場合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/db710dd7-43ef-016d-f2b2-617797bae78d.png)|
|:--|

8.3.2.手順7.2の設定でmethodParamsを「want=message」にした場合は、以下のポップアップが表示されます。
|![030_want=messageの場合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/ac9299a0-f4e5-c220-aa6b-7e3fe7bcf4fe.png)|
|:--|

# 9.おわりに
ここまで読んで下さり、ありがとうございます！！！
(^^)

今までに使った知識を利用して、CTIフローからLambda関数を呼び出すことができました。
構成自体はシンプルでも、Apexクラスのテストや、APIゲートウェイの設定等、色々やることが多く勉強になりました。

次はVisualforceからApexクラスを呼び出す方法について書く・・・かもしれません。
(:3_ヽ)_