AWS Glueを使ってコードを書かずにSalesforceへのリバースETLをやってみた
データ事業本部インテグレーション部機械学習チーム・新納(にいの)です。
本記事は毎年恒例AWS Analytics Advent Calendar 2024の19日目のエントリです。
2024年5月、AWS GlueでSalesforceコネクタがサポートされたと発表されました。このアップデートにより、GlueのビジュアルエディタでSalesforceに簡単に接続できるようになりました!
うれしいことにデータを読み込むのはもちろんのこと、Salesforceへデータを書き出すこともできます。いわゆるリバースETLも実現可能になりました。
というわけでGlue Stuidoのビジュアルエディタを利用し、コードを書かずにSalesforceへのリバースETLを試してみました。
リバースETLとは
データウェアハウスやデータレイクに集約されたデータをSaaS等の運用システムに書き戻して活用するプロセスをリバースETLと呼びます。従来のETL(Extract, Transform, Load)はSaaS等のデータをデータ分析基盤にロードするプロセスですが、この逆の流れを実現します。
営業部門で使っているSalesforceを例に考えてみましょう。顧客情報を分析した結果、「このお客様は新しい商品に興味を持ちそう」「このお客様はサービスの解約を考えているかもしれない」といった発見が得られたとします。
このような分析結果をSalesforceに自動で反映できれば、営業担当者は「このお客様に連絡したほうが良さそうだな」とすぐに分かります。このように、リバースETLを活用することでデータ分析の結果を日々の業務に活かし、より効果的な施策につなげられるという利点があります。
想定シナリオ
今回の構成は以下の通りです。S3上のファイルをSalesforceへ連携します。
以下のようなユースケースを考えています。
- Salesforceの取引先オブジェクトの評価(Hot/Warm/Cold)をアップデートする
- 顧客分析の結果、取引先の評価を定期的にアップデートしたい
- 対応するIDと評価はCSVファイルでS3バケットに連携される
- CSVファイルをAWS Glueを使ってSalesforceへUPSERTする
リバースETLする前のSalesforceの取引先オブジェクトは以下の通り、評価が空欄になっています。この項目をジョブ実行によってアップデートします。
事前準備:Salesforce側で外部IDを設定
今回のユースケースでは取引先情報をUPSERTするため、Glue側で外部IDの指定が必須となります。今回の検証では取引先に新しく外部IDを作成しました。
SalesforceでオブジェクトマネージャーからリバースETLの対象(今回は取引先)を選択し、「項目とリレーション」から「新規」へ遷移します。
テキストを選択します。
表示ラベル、文字数、項目名それぞれの必須項目に任意の値を設定し、「外部システムの一意のレコード識別子として設定する」チェックボックスを有効にします。
最終画面まで遷移し、保存します。
「項目とリレーション」画面から外部IDとして設定した項目を確認できるようになりました。項目名にcが付いたもの(今回はExternalID__c
)を連携するファイル内とGlueでの設定時に利用するので覚えておいてください。
取引先の画面に移動し、外部IDを設定可能です。
事前準備:データアップデート用CSVファイルをS3バケットに配置
以下のCSVファイルを作成しました。外部IDのカラム名は__c
で終わる項目名を指定する必要があります。このIDをキーとして一致するオブジェクトを更新します。Ratingは取引先オブジェクトの「評価」項目に反映されます。
ExternalID__c,Rating
ACC001,Hot
ACC002,Warm
ACC003,Hot
ACC004,Cold
ACC005,Warm
ACC006,Hot
ACC007,Warm
ACC008,Hot
ACC009,Warm
ACC010,Cold
このファイルを任意のS3バケット上に配置します。
GlueでSalesforceコネクタを作成
以下の手順に沿ってSalesforceコネクタをAWS Glueで作成します。
大雑把にまとめると、以下を実施します。
- Salesforce側で接続アプリケーションを作成し、コンシューマーシークレットを生成
- Secrets Managerにコンシューマーシークレットをストア
- GlueでSalesforceコネクタを設定
Salesforceでコンシューマーシークレットを生成
まずはSalesforceでコンシューマーシークレットを取得します。
アプリケーションマネージャーから「新規接続アプリケーション」へ移動します。
「接続アプリケーションを作成」を選びます。
接続アプリケーション名、API参照名、取引先責任者メールに任意の値を設定します。ここで指定したメールアドレスは認証に利用されます。
「OAuth設定の有効化」を有効にし、以下の通り設定します。
設定項目 | 値 |
---|---|
コールバックURL | https://<Glueのリージョン>.console.aws.amazon.com/gluestudio/oauth |
選択したOAuth範囲 | - APIを使用してユーザーデータを管理(api) - ID URLサービスにアクセス(id,profile,email,address,phone) - いつでも要求を実行(refresh_token,offline_access) - カスタム権限にアクセス(custom_permissions) - 一意のユーザー識別子にアクセス(openid) |
サポートされる認証フローにPKCE拡張を要求 | 有効化 |
Webサーバーフローの秘密が必要 | 有効化 |
更新トークンフローの秘密が必要 | 有効化 |
保存すると以下のような画面に遷移します。「コンシューマーの詳細を管理」へアクセスします。このとき、取引先責任者メールに指定したアドレスへ認証コードが送られます。
「コンシューマーの秘密」をコピーしておきます。
Secrets Managerにストア
先ほどコピーした「コンシューマーの秘密」をSecrets Managerに保存します。キー名は必ずUSER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET
を設定してください。
GlueでSalesforceコネクタを設定
ここまでくれば、あとはGlueでコネクタを設定するだけです。Data Connectionsから新規コネクタ作成画面へ移動し、Data SourceにSalesforceを選びます。
Connection Detailsでは以下を設定します。
設定項目 | 値 |
---|---|
Instance URL | SalesforceのインスタンスURL(例:https://example.my.salesforce.com ) |
Salesforce environment | Salesforceの環境(ProductionもしくはSandbox) |
IAM service role | 前項で設定したSecrets ManagerへアクセスできるIAMロール |
他にはJWT認証もありますが、今回は認証方式として「Authorization Code」を利用します。AWS Secretには前項で設定したSecrets Managerをドロップダウンリストから選択します。
最後にTest Connectionから接続テストを実施し、接続が確認できれば保存して終了です。
Glue StudioでリバースETLジョブを作成・実行
Glue StudioからVisual ETLを選択し、ビジュアルエディタからフローを作成します。
データソースにはAmazon S3ノードを配置し、CSVファイルを置いたS3バケットを指定します。データフォーマットはCSVで、必要に応じてデリミタやクォーテーションを設定します。
S3ノードに接続し、データターゲットはSalesforceを選択します。Entity NameにはUPSERT対象となるSalesforceオブジェクト(今回は取引先)、Write OperationにはUPSERTを指定します。
Id field namesには外部ID(今回はExternalID__c
)を指定します。この項目はUPSERT・UPDATEを実施する際は必須です。ソースのCSVファイルとID名が異なる場合にはエラーとなります。
ジョブを保存して実行します。今回はGlueのバージョンを4.0に指定しました。
実行後、Salesforceを確認するとこれまで空欄だった評価欄にCSVで指定した値が反映されていることが確認できました。
最後に
AWS Glueを使ってSalesforceへのリバースETLを実施しました。ビジュアルエディタを利用しても実態はSparkのコードが裏側で生成されていますが、コードを使って実装することなくリバースETLジョブを作成できました。AppFlowでもSalesforceへの書き込みがサポートされていますが、GlueはData Catalogをデータソースとして指定することもできますし、生成されたSparkを編集すればより柔軟な条件での実装も可能です。AppFlowとはまた違った良さがありますね。
この記事がどなたかのお役に立てば幸いです。