CData Software Blog

クラウド連携のCData Software の技術ブログです。

AWS LambdaでAPI Driverを使ってZoomのデータを取得する

こんにちは。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に対してJDBCODBCなどの汎用インタフェースによるアクセスを実現するドライバです。 API Driverは対象のWebサービスAPI仕様を定義した「API Profile」と合わせて使用します。 今回はZoom APIにアクセスするための「Zoom API Profile」を使います。

f:id:urabe_shintaro:20201207003436p:plain

事前準備

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/

f:id:urabe_shintaro:20201207003501p:plain

同じく必要事項入力画面が表示されます。 必要事項を入力し、[Download]をクリックするとプロファイルがダウンロードされます。

API Profileの配置

API DriverはAPI Profileのファイルを参照します。 このときAPI Profileのロケーションは絶対パスで指定するため、デプロイパッケージに含めることはできません。 そこでAPI ProfileをAmazon EFS(Elastic File System)に配置し、それをLambdaの関数から参照できるようにします。

f:id:urabe_shintaro:20201207003520p:plain

EFSの作成

EFSの画面から[ファイルシステムの作成]をクリックするとファイルシステムの作成画面が表示されます。 [名前]に任意の名前を入力し、[Virtual Private Cloud (VPC)]を選択し、[作成]をクリックします。

f:id:urabe_shintaro:20201207010714p:plain

作成したファイルシステムを選択します。 [アクセスポイント]タブを選択し、[アクセスポイントを作成]をクリックします。

f:id:urabe_shintaro:20201207010725p:plain

アクセスポイントが作成されればEFSの作成は完了です。

EFSへのプロファイルのアップロード

EFSにファイルを転送する方法はいくつかありますが、今回はEC2からEFSをマウントして転送しました。

docs.aws.amazon.com

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」としましたので、これを設定します。

f:id:urabe_shintaro:20201207003615p:plain

実行結果

今回のサンプルプログラムでは「UserId」をキーとしてユーザIdを入力します。 以下のようなオブジェクトを入力として作成しました。

f:id:urabe_shintaro:20201207003639p:plain

テストを実行すると、以下のように指定したユーザのミーティング情報が取得できました。

f:id:urabe_shintaro:20201207003703p:plain

おわりに

本記事ではAWS LambdaでCData API DriverとAPI Profileを使い、ZoomのAPIと連携する方法を紹介しました。 CDataドライバを使うことでSalesforce, kintone, NetSuiteなど様々なクラウドサービスと連携する関数を効率的に作成することができます。 Lambdaでのクラウドサービス連携をご検討の方はぜひお試しください。