こんにちは。CData Software Japanエンジニアの浦邊です。
本記事ではAWS Lambdaの関数(Java/Python)でZoomのミーティング情報を取得する方法を紹介します。 以下の記事ではLambdaでCData JDBC DriverやJDBC Python Driverを使う方法を紹介しました。
AWS LambdaでCData JDBC Driverを使う - CData Software Blog
AWS LambdaでCData Python Driverを使う - CData Software Blog
今回はZoomへのアクセスにCData JDBC/Python API DriverとZoom API Profileを使います。 CData Driverを使ったプログラムの作成、デプロイパッケージの作成、Lambdaへのアップロードなど基本的な操作は前述の記事の中で紹介した通りですが、今回はCData DriverとAPI Profileとを組み合わせて使用するための設定が必要になります。
構成
今回のシナリオではユーザIdを入力とし、指定したユーザが設定したミーティングの開始日時やトピックなどのミーティング情報を取得します。
Zoom APIへのアクセスにCData API Driverを利用します。 CData API Driverは様々なWebサービスのAPIに対してJDBCやODBCなどの汎用インタフェースによるアクセスを実現するドライバです。 API Driverは対象のWebサービスのAPI仕様を定義した「API Profile」と合わせて使用します。 今回はZoom APIにアクセスするための「Zoom API Profile」を使います。
事前準備
API Driverのインストール
以下のページからAPI Driver for JDBCをダウンロードしてください。
https://www.cdata.com/jp/apidriver/download/#drivers
API Driver for JDBCの[ダウンロード 評価版]をクリックすると必要事項入力画面が表示されます。 必要事項を入力し、[ダウンロード]をクリックするとCData Gmail JDBC Driver評価版のインストーラがダウンロードされます。 ダウンロードしたファイルをダブルクリックするとインストーラが起動しますので、ウィザードに従ってインストールしてください。
Zoom API Profileのダウンロード
以下のページからZoomのプロファイルをダウンロードしてください。
https://www.cdata.com/jp/apidriver/download/
同じく必要事項入力画面が表示されます。 必要事項を入力し、[Download]をクリックするとプロファイルがダウンロードされます。
API Profileの配置
API DriverはAPI Profileのファイルを参照します。 このときAPI Profileのロケーションは絶対パスで指定するため、デプロイパッケージに含めることはできません。 そこでAPI ProfileをAmazon EFS(Elastic File System)に配置し、それをLambdaの関数から参照できるようにします。
EFSの作成
EFSの画面から[ファイルシステムの作成]をクリックするとファイルシステムの作成画面が表示されます。 [名前]に任意の名前を入力し、[Virtual Private Cloud (VPC)]を選択し、[作成]をクリックします。
作成したファイルシステムを選択します。 [アクセスポイント]タブを選択し、[アクセスポイントを作成]をクリックします。
アクセスポイントが作成されればEFSの作成は完了です。
EFSへのプロファイルのアップロード
EFSにファイルを転送する方法はいくつかありますが、今回はEC2からEFSをマウントして転送しました。
LinuxのEC2にログインしEFSをマウントします。 コマンドはEFSの[アタッチ]をクリックすると取得できます。
$ sudo mount -t efs -o tls fs-e9846fc9:/ /mnt/efs
マウントが完了したらSCPなどでファイルを転送してください。
サンプルコード
ユーザIdを入力として、当該ユーザのミーティング情報(ミーティングId, 開始時刻, トピック)を出力するプログラムを作成します。 サンプルコードではプロファイルを参照するディレクトリのパスを「/mnt/cdata」と設定しています。 これは後ほど説明するLambdaの設定で、EFSを追加する際に設定するローカルマウントパスを指定します。 EFSのローカルマウントパスと一致していればどのようなパスでも構いません。
Javaコード
public Map<String, Object> handleRequest(Map<String, Object> input, Context context) { Map<String, Object> output = new HashMap<String, Object>(); try { Class.forName("cdata.jdbc.api.APIDriver"); // 1. 接続プロパティを指定して接続 Properties prop = new Properties(); prop.setProperty("Profile","//mnt//cdata//Zoom.apip"); prop.setProperty("InitiateOAuth","REFRESH"); prop.setProperty("OAuthClientId","your-client-id"); prop.setProperty("OAuthClientSecret","your-client-secret"); prop.setProperty("OAuthAccessToken","your-access-token"); prop.setProperty("OAuthRefreshToken", "your-refreseh-token"); prop.setProperty("OAuthSettingsLocation","//tmp//CData-API-Zoom-OAuthSettings.txt"); prop.setProperty("CallbackUrl","http://localhost:33333"); prop.setProperty("RTK","your-RTK"); Connection conn = DriverManager.getConnection("jdbc:api:",prop); // 2. Meetingsテーブルから指定したユーザIdに一致するレコードを取得 PreparedStatement stat = conn.prepareStatement("SELECT Id, StartTime, Topic FROM Meetings WHERE UserId = ?"); stat.setString(1, (String)input.get("UserId")); stat.execute(); ResultSet rs=stat.getResultSet(); // 3. JSON形式に変換してアウトプットオブジェクトに設定 JsonArray json = convertToJSON(rs); output.put("Meetings",json.toString()); } catch (Exception e) { e.printStackTrace(); } output.put("input", input); output.put("context", context); return output; }
Pythonコード
import json import collections import cdata.api as mod def lambda_handler(event, context): # 1. 接続プロパティを指定して接続 CONNECTION_STRING = \ 'Profile=//mnt//cdata//Zoom.apip;'\ 'OAuthClientId=your-oauth-client-id;'\ 'OAuthClientSecret=your-oauth-client-secret;'\ 'CallbackUrl=http://your-call-back-url;'\ 'AuthScheme=OAuth;'\ 'OAuthAccessToken=your-oauth-access-token;' meetinglist = [] conn = mod.connect(CONNECTION_STRING) cur = conn.cursor() # 2. Meetingsテーブルから指定したユーザIdに一致するレコードを取得 query = 'SELECT Id, StartTime, Topic FROM Meetings WHERE UserId = \'{}\''.format(event['UserId']) cur.execute(query) rs = cur.fetchall() for row in rs: d = collections.OrderedDict() d['Id'] = row[0] d['StartTime'] = row[1].isoformat() d['Topic'] = row[2] meetinglist.append(d) return { 'statusCode': 200, # 3. JSON形式に変換してアウトプットオブジェクトに設定 'body' : json.dumps(meetinglist) }
Lambdaの設定
デプロイパッケージの作成からLambdaでのテストまでの設定は以下の記事を参考にしてください。
Java
AWS LambdaでCData JDBC Driverを使う - CData Software Blog
Python
AWS LambdaでCData Python Driverを使う - CData Software Blog
上記設定に加えて、今回はEFS上のプロファイルを参照するための設定が必要です。
[ファイルシステム]セクションにある[ファイルシステムの追加]をクリックしてください。 EFSの設定画面で[EFSファイルシステム]と[アクセスポイント]をそれぞれ選択し、[ローカルマウントパス]にLambdaのプログラム上で参照するパスを設定します。 今回のサンプルプログラムではプロファイルのディレクトリのパスを「/mnt/cdata」としましたので、これを設定します。
実行結果
今回のサンプルプログラムでは「UserId」をキーとしてユーザIdを入力します。 以下のようなオブジェクトを入力として作成しました。
テストを実行すると、以下のように指定したユーザのミーティング情報が取得できました。
おわりに
本記事ではAWS LambdaでCData API DriverとAPI Profileを使い、ZoomのAPIと連携する方法を紹介しました。 CDataドライバを使うことでSalesforce, kintone, NetSuiteなど様々なクラウドサービスと連携する関数を効率的に作成することができます。 Lambdaでのクラウドサービス連携をご検討の方はぜひお試しください。