Amazon Web Services ブログ

Amazon AppFlow Custom Connector SDK を用いたカスタムコネクタの構築

この投稿は Sr. Specialist SA, Integration の Kamen Sharlandjiev、Principal PMT, Amazon AppFlow の Ray Jang、Sr. Specialist SA, Serverless の Dhiraj Mahapatro によって執筆されました。

Amazon AppFlowSalesforceSAPZendeskSlackServiceNow などの SaaS (Software-as-a-Service) アプリケーションと Amazon S3Amazon Redshift などの AWS サービス間でデータを安全に転送できるようにするフルマネージドサービスです。Amazon AppFlow では、エンタープライズ規模のデータフローを、スケジュールによる実行やビジネスイベントに応じた実行またはオンデマンドで実行できます。

Amazon AppFlow は、コネクタの開発、保守、更新という面倒な作業に代わるマネージド統合サービスです。外部 SaaS アプリケーションAWS サービス間の双方向統合をサポートします。

Custom Connector Software Development Kit (SDK) により、プライベート API エンドポイント、独自のアプリケーション、またはその他のクラウドサービスとの統合が容易になりました。利用可能なすべてのマネージドインテグレーションにアクセスでき、統合エクスペリエンスの一部として独自のカスタムインテグレーションを構築できます。SDK はオープンソースであり、Java または Python で利用できます。

SDK で構築されたカスタムコネクタは、以下の様々な方法でデプロイできます。

  • Private – コネクタはデプロイされている AWS アカウント内でのみ使用できます。
  • Shared – コネクタを共有して他の AWS アカウントで使用できます。
  • PublicAWS Marketplace でコネクタを無料で公開するか、サブスクリプション料金を請求します。詳細は「Sharing AppFlow connectors via AWS Marketplace」を参照ください。

概要

このブログでは、Java SDK を使用して独自の Amazon AppFlow カスタムコネクタを構築およびデプロイする方法について説明します。サンプルアプリケーションでは、Amazon AppFlow を使用して最初のカスタムコネクタを構築する方法を示しています。

カスタムコネクタを構築、デプロイ、使用するプロセスは以下の通りです。

  1. Amazon AppFlow Custom Connector SDK を使用して、AWS Lambda 関数としてカスタムコネクタを作成します。
  2. コネクタにサーバーレスコンピューティングを提供するカスタムコネクタの Lambda 関数をデプロイします。
  3. Lambda 関数は SaaS アプリケーションまたはプライベート API と統合されます。
  4. Amazon AppFlow にカスタムコネクタを登録します。
  5. これで、ユーザーは Amazon AppFlow サービスでこのカスタムコネクタを使用できるようになります。

Amazon AppFlow カスタムコネクタの構築

このブログで使用しているサンプルアプリケーションでは、 MySQL JDBC driver を実装する新しいカスタムコネクタを作成します。このコネクタを使用すると、リモート MySQL または MariaDB インスタンスに接続してデータを読み書きできます。
SDK では、カスタムコネクタを構築し、サービスに組み込まれている認証サポート (OAuth2、API キー、Basic 認証) を使用できます。JDBC などの他のユースケースでは、独自のカスタム認証実装を作成する必要があります。
SDK には、サンプルの Salesforce コネクタのソースコードが含まれています。これは、OAuth2 を認証として使用する送信元と送信先の Amazon AppFlow コネクタの完全なユースケースを示しています。

詳細

コネクタには実装しなければならない必須の Java インターフェースが 3 つあります。

  1. ConfigurationHandler.java: コネクタ構成と認証情報関連の操作を実装する機能を定義します。
  2. MetadataHandler.java: オブジェクトメタデータに実装する機能を表します。
  3. RecordHandler.java: レコード関連の CRUD 操作を実装する機能を定義します。

前提条件

ワークステーションに次のソフトウェアがインストールされていることを確認ください。

  1. Java 11
  2. Maven
  3. AWS CLI
  4. AWS SAM CLI

サンプルアプリケーションの実行の流れは以下の通りです。

  1. コードリポジトリのクローンを作成します。
    git clone https://github.com/aws-samples/amazon-appflow-custom-jdbc-connector.git
    cd amazon-appflow-custom-jdbc-connector
  2. サンプルアプリケーションのクローンを作成した後に、以下の Java クラスを参照して詳細を確認します。

他のデータベースエンジン用の JDBC クライアントを追加するには、JDBCClient.java インターフェイスを実装します。カスタムコネクタは Lambda 関数を POJO クラスとして使用してリクエストを処理します。SDK には抽象的な BaseLambdaConnectorHandler クラスが用意されています。このクラスは以下のように使用できます。

import com.amazonaws.appflow.custom.connector.lambda.handler.BaseLambdaConnectorHandler;

public class JDBCConnectorLambdaHandler extends BaseLambdaConnectorHandler {

  public JDBCConnectorLambdaHandler() {
    super(
      new JDBCConnectorMetadataHandler(),
      new JDBCConnectorRecordHandler(),
      new JDBCConnectorConfigurationHandler()
    );
  }
}

ローカルテストとデバッグ

コネクタ固有の機能を開発する際、開発者はビルドとデバッグを高速化するためにローカルテスト機能を必要とします。SDK とサンプルコネクタにはカスタムコネクタのテストのサンプルが用意されています。
さらに、JUnit や SDK が提供する DSL ビルダーを試すこともできます。JUnit テストでは Lambda 関数への適切なリクエストをシミュレートすることで、この実装をローカルでテストできます。組み込みの IDE デバッガーを使用してデバッグポイントを設けてコード実装を最初から最後まで進めることができます。サンプルアプリケーションには、デバッグポイントで使用できる JUnit テストのサンプルが付属しています。

認証情報の管理

Amazon AppFlow はすべての機密情報を AWS Secrets Manager に保存します。シークレットは、コネクタプロファイルを作成する時に作成されます。シークレット ARN は、Lambda 関数の呼び出しリクエストの一部を構成する ConnectorContext で渡されます。

ローカルでテストするには以下を行います。

  • CredentialsProvider” をモックして、GetCredentials API のレスポンスをスタブアウトします。CredentialProvider には、使用する認証に応じて異なる getCredentials メソッドが用意されていることに注意します。
  • AWS Secrets Manager でシークレットを作成します。secretsmanager:GetSecretValue アクションを許可し、CredentialsProvider が Secrets Manager をローカルで呼び出せるように、プログラムによるアクセスと十分な権限を持つ IAM ユーザーを設定します。引数を指定せずに新しいサービスクライアントを初期化すると、SDK はデフォルトの認証情報プロバイダーチェーンを使用して AWS 認証情報を検索します。

詳細については「Working with AWS Credentials (SDK for Java)」と「Creating an IAM user with programmatic access」を参照ください。

AWS アカウントに Lambda 関数をデプロイ

このサンプルのコネクタパッケージは、プロジェクトフォルダに AWS Serverless Application Model (AWS SAM) テンプレートを提供します。以下のリソースが記述されています。

  1. カスタムコネクタコードを含む Lambda 関数
  2. AWS Secrets Manager からシークレットの読み取りを許可する AWS IAM ポリシー
  3. Amazon AppFlow が Lambda 関数を呼び出すことを許可する AWS Lambda リソースベースポリシー
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: Template to deploy the lambda connector in your account.
Resources:
  ConnectorFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: "org.custom.connector.jdbc.handler.JDBCConnectorLambdaHandler::handleRequest"
      CodeUri: "./target/appflow-custom-jdbc-connector-jdbc-1.0.jar"
      Description: "AppFlow custom JDBC connector example"
      Runtime: java11
      Timeout: 30
      MemorySize: 1024
      Policies:
        Version: '2012-10-17'
        Statement:
          Effect: Allow
          Action: 'secretsmanager:GetSecretValue'
          Resource: !Sub 'arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:appflow!${AWS::AccountId}-*'

  PolicyPermission:
    Type: 'AWS::Lambda::Permission'
    Properties:
      FunctionName: !GetAtt ConnectorFunction.Arn
      Action: lambda:InvokeFunction
      Principal: 'appflow.amazonaws.com'
      SourceAccount: !Ref 'AWS::AccountId'
      SourceArn: !Sub 'arn:aws:appflow:${AWS::Region}:${AWS::AccountId}:*'

以下のコマンドを使用して amazon-appflow-custom-jdbc-connector のベースディレクトリからカスタムコネクタをデプロイします。

mvn package && sam deploy –-guided

デプロイが完了したら、以下の手順に従ってコネクタを登録して使用します。

カスタムコネクタの登録

カスタムコネクタの登録には 2 つの方法があります。

1. AWS マネジメントコンソールからの登録

  1. AWS マネジメントコンソールから Amazon AppFlow に移動します。左側のメニューで [コネクタ] を選択します。[新しいコネクタを登録] ボタンを選択します。
  2. Lambda 関数を選択し、コネクタラベルを入力してコネクタを登録します。

    このチュートリアルの手順に従って AWS SAM を使用してデプロイした場合、新しく作成されたカスタムコネクタ Lambda 関数がリストに表示されます。Lambda 関数を手動でデプロイした場合は、「Lambda Permissions and Resource Policy section」で説明されているように、適切な Lambda パーミッションが設定されていることを確認してください。
  3. コネクタラベルを入力します。ラベルはアカウントごと、リージョンごとに一意でなければなりません。[登録] を選択します。
  4. カスタムコネクタのリストにコネクタが表示されます。

2. API による登録

以下のリクエストペイロードを使用して registerConnector パブリック API エンドポイントを呼び出します。

{
   "connectorLabel":"TestCustomConnector",
   "connectorProvisioningType":"LAMBDA",
   "connectorProvisioningConfig":{
      "lambda":{ "lambdaArn":"arn:aws:lambda:<region>:<aws_account_id>:function:<lambdaFunctionName>"
      }
   }
}

connectorLabel には固有のラベルを使用します。また、現在サポートされている connectorProvisioningType は LAMBDA だけです。

新しいカスタムコネクタの使用

  1. 左側のメニューから [接続] に移動します。登録されているコネクタをドロップダウンから選択します。
  2. [接続を作成] を選択します。
  3. コネクタ固有のセットアップを完了します。
  4. フローの作成と新しい接続の選択に進みます。
  5. コネクタ登録・コネクタプロファイルの作成・フロー実行プロセスでエラーが発生した場合は Lambda 関数の Amazon CloudWatch Logs を確認することでトラブルシューティングできます。

本番環境に関する考慮事項

このサンプルは PoC です。本番環境に対応したソリューションを構築するには、サンプルソリューションと本番環境対応ソリューションの相違点について非網羅的なリストを参考に確認ください。
同時実行性の高いカスタムコネクタを使用する場合は、AWS Lambda のクォータと制限を確認ください。

カスタムコネクタのクリーンアップ

コネクタの削除の流れは以下の通りです。

  1. このチュートリアルの一環として作成した Amazon AppFlow のフローをすべて削除します。
  2. コネクタプロファイルをすべて削除します。
  3. カスタムコネクタの登録を解除します。
  4. スタックを削除するには amazon-appflow-custom-jdbc-connector のベースディレクトリから以下のコマンドを実行します。
sam delete

結論

このブログ記事では Amazon AppFlow サービスを拡張して SaaS エンドポイントとカスタム API 間でデータを転送する方法を示しています。Amazon AppFlow Custom Connector SDK を使用してカスタムコネクタを構築できるようになりました。

Amazon AppFlow でカスタムコネクタを使用すると、サイロ化されたアプリケーションを最小限のコードで統合できます。例えば、組織内でレガシーアプリケーションを使用している様々な事業部門が Amazon AppFlow Custom Connector SDK を介してサービスを統合できるようになります。

選択したフレームワークに応じて、GitHub からオープンソースの Python SDK または Java SDK を使用できます。詳細は「Custom Connector SDK Developer Guide」を参照ください。

その他のサーバーレス学習リソースは Serverless Land をご覧ください。

翻訳はソリューションアーキテクトの松岡勝也が担当しました。原文はこちらです。