CData Software Blog

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

AWS LambdaでCData Python Driverを使う

こんばんは。CData Software Japanエンジニアの浦邊です。

本記事ではAWS LambdaでCData Python Driverを使用する方法を紹介します。

今回は例としてCData Salesforce Python Driverを使用します。 Salesforceの製品情報が格納されている「Product2」オブジェクトを参照し、入力した製品コードから製品名を取得します。

CData Salesforce Python Driverのインストール

CData Software Japan社のCData Salesforce Python Driverダウンロードページにアクセスしてください。 ダウンロードページの[ベータ版ダウンロード]をクリックすると必要事項入力画面が表示されます。

f:id:urabe_shintaro:20201204112759p:plain

必要事項を入力し、[ダウンロード]をクリックするとCData Salesforce Python Driver評価版のインストーラがダウンロードされます。 ダウンロードしたファイルをダブルクリックするとインストーラが起動しますので、ウィザードに従ってインストールしてください。 途中、ライセンスサーバーへのオンラインアクティベーションが行われるためネットワーク環境に接続されている必要があります。 ライセンスサーバにアクセス出来ないネットワーク環境の場合は、CData Software Japan テクニカルサポートまでお問い合わせください。

テストプログラムの作成

Lambdaで動作させるPythonプログラムを作成します。 テストプログラムではSalesforceの製品データが格納されているProduct2オブジェクトを参照します。 製品コードを入力し、そのコードに該当する製品名を取得します。

get_product_name.py

テストプログラムは以下の3つのステップで構成されています。

  1. アカウント情報を設定しSalesforceに接続
  2. データを取得するクエリを発行
  3. 取得したデータを出力オブジェクトに設定
import json
import cdata.salesforce as mod

def lambda_handler(event, context):
    CONNECTION_STRING = \
    'User=your-user-name;'\
    'Password=your-password;'\
    'SecurityToken=your-security-token'

    # 接続プロパティを指定して接続
    conn = mod.connect(CONNECTION_STRING)
    cur = conn.cursor()

    # 製品コードをもとに製品名を取得するクエリを実行
    query = 'Select Name from Product2 where ProductCode = \'{}\''.format(event['ProductCode']) 
    cur.execute(query)

    # 製品名(Name)を取得
    row = cur.fetchone()
    product_name = row[0]

    return {
        'statusCode': 200,
        'body' : json.dumps({'Name' : product_name})
    }  

デプロイパッケージの作成

今回はPythonコードと依存関係を1つのファイルにまとめたものをデプロイパッケージとしてアップロードします。

f:id:urabe_shintaro:20201204112837p:plain

CDataライブラリの展開

ダウンロードしたSalesforcePythonConnector.zipを展開し、以下のファイルをPythonファイルと同じフォルダにコピーしてください。 <ビルド番号>にはダウンロード時の最新のビルド番号が入ります。

CData.Python.Salesforce\unix\Python37\64\cdata_salesforce_connector-20.0.<ビルド番号>-cp37-cp37m-linux_x86_64.whl

上記コピー先フォルダに移動し、以下のコマンドを実行してwhlをインストールしてください。

pip install .\cdata_salesforce_connector-20.0.<ビルド番号>-cp37-cp37m-linux_x86_64.whl -t ./

デプロイパッケージの作成

ライブラリのインストールに成功すると以下のようなフォルダが作成されます。

f:id:urabe_shintaro:20201204112914p:plain

このうち、Pythonファイルと、ライブラリとしてインストールされたcdataフォルダをzipファイルとして圧縮してください。

zip -r package.zip .\get_product_name.py cdata

これでデプロイパッケージは完成です。

Lambda関数の作成と実行

AWS Lambdaのトップから[関数を作成]をクリックします。

[関数の作成]画面では関数の設定を行います。 今回は自前のコードを使用するため、オプションから[一から作成]を選択します。 [関数名]に適当な関数名を指定し、[ランタイム]Python 3.7を選択します。

f:id:urabe_shintaro:20201204113017p:plain

設定が完了したら右下の[関数を作成]ボタンをクリックしてください。

デプロイパッケージのアップロード

作成した関数を開きます。 [関数コード]セクションから[アクション]メニューを開き[.zipまたはjarファイルをアップロード]を選択します。

f:id:urabe_shintaro:20201204113031p:plain

[アップロード]ボタンをクリックするとファイル選択画面が開きます。 作成したデプロイパッケージ(zipファイル)を選択し、[保存]をクリックします。

f:id:urabe_shintaro:20201204113047p:plain

ハンドラの指定

[Runtime settings][Edit]をクリックして[ランタイム設定]画面を開きます。 [ハンドラ]に作成したメソッド名を入力し[保存]をクリックします。

f:id:urabe_shintaro:20201204113328p:plain

イベントの作成

続いてテストイベントを作成します。 テストイベントが選択されていない状態で[テスト]をクリックすると[テストイベントの設定]ダイアログが表示されます。 [イベント名]に任意の名前を入力し、関数の入力値を指定します。 今回は製品コード(ProductCode)を指定しています。

f:id:urabe_shintaro:20201204113355p:plain

入力が完了したら[作成]ボタンをクリックしてください。

関数の実行

作成したテストイベントが選択されていることを確認し[テスト]をクリックしてください。

f:id:urabe_shintaro:20201204113229p:plain

実行が完了すると以下のように結果が表示されます。 指定した製品コード「GC3060」に該当する製品名「GenWatt Propane 1500kW」が取得できていることが確認できました。

f:id:urabe_shintaro:20201204113216p:plain

タイムアウトエラーの対応

ドライバによる外部サービスへの接続には時間がかかる場合があります。 このとき以下のようにTask Timed Outのエラーが発生して実行に失敗することがあります。

f:id:urabe_shintaro:20201204113455p:plain

このエラーが発生した際にはタイムアウトの時間を変更してください。

関数の[基本設定]セクションの[編集]をクリックし、[基本設定の編集]画面を開きます。 [タイムアウト]の時間を1分など長い時間に変更し、[保存]をクリックしてください。

f:id:urabe_shintaro:20201204113543p:plain

おわりに

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