Snowflake Connector for MySQL エージェントコンテナの設定

注釈

Snowflake Connector for MySQL は コネクタ規約 に従います。

このトピックでは、 Snowflake Connector for MySQL エージェントコンテナを設定する手順について説明します。データベースコネクタエージェントは、インフラストラクチャ内で実行され、データベースとSnowflakeに直接接続するコンテナ化されたアプリケーションです。

Snowflake Connector for MySQL エージェントを構成するプロセスには、次のタスクが含まれます。

  1. 前提条件の確認とオーケストレーションシステムの選択

  2. エージェントの構成と実行

  3. [オプション] Kubernetesを使用したオーケストレーションの構成

  4. エージェントの監視

前提条件の確認とオーケストレーションシステムの選択

すべての前提条件を確認および完了し、 エージェントの構成と実行 に進みます。

コンテナオーケストレーションシステムの選択

エージェントは標準的なDockerコンテナイメージとしてパッケージ化されており、標準をサポートするオーケストレーションシステムで実行できます。これには、スタンドアロンの Docker インスタンス、 KubernetesRedHat OpenShiftAWS Fargate などのクラウド管理ソリューションが含まれます。組織には、使用が推奨される既存のシステムが存在することがよくあります。

オーケストレーションシステムに応じて制約が異なるため、このドキュメントのエージェントの構成セクションをよく確認してください。使用中のシステムまたは特定の設定によっては、書き込み可能なボリュームをマウントできない場合があります(エージェントの主な構成オプションで必要な場合)。

後の例では、最も一般的なオーケストレーションシステムであるKubernetesに焦点を当てます。他のシステムでも同様のアプローチをとることが多く、各自の設定に合わせて例を調整する必要があります。

必要なシステムリソースの確認

  • エージェントはメモリを大量に消費するアプリケーションであり、正しく動作するためには最低 6GB の RAM が必要です。

  • 最適な CPUs の数は4です。CPUs が少ないとパフォーマンスが低下する可能性があります。CPUs を増やしてもパフォーマンスは向上しません。

接続の設定

エージェントは、データを読み取ろうとするすべてのソースデータベースに接続する必要があります。直接接続を可能にし、 MySQL の従来のクライアントポートに到達できるように、ネットワークとファイアウォールを構成します。通常はポート 3306 です。詳細については、 MySQL のポート参照表 をご参照ください。

ソースデータベースが分離されたネットワークに存在し、単一のエージェントから接続できない場合は、コネクタのネイティブアプリケーションの追加インスタンスをインストールし、それぞれに独自のエージェントをインストールする必要があります。この機能は現在プライベートプレビュー中です。アクセスをリクエストするには、 Snowflakeサポート にご連絡ください。

エージェントは、Snowflakeデプロイメントに直接接続することもできます。使用可能にする必要があるホスト名の詳細については、 ホスト名の許可 をご参照ください。

エージェントの接続のいずれかがプロキシを通過する場合は、エージェントに追加の構成を渡す必要があります。 オプションの構成環境変数を確認する をご参照ください。

エージェントの構成と実行

エージェントの構成と実行は、次のステップで構成されます。

  1. MariaDB JDBC ドライバーをダウンロードする

  2. [オプション]ソースデータベースの SSL 証明書を取得および準備する

  3. エージェントの構成 ファイルまたはエージェントの環境変数を準備し、エージェントを起動する

  4. オプションの構成環境変数を確認する

  5. 必要に応じて、 PrivateLink 接続を設定する

MariaDB JDBC ドライバーをダウンロードする

このドライバーを使用し、エージェントは MySQL データベースに接続してやり取りします。名目上は MariaDB 用のドライバーですが、互換性があります。

ライセンスの制限により、 JDBC ドライバーはエージェントと一緒に配布できないため、自分で提供する必要があります。 MariaDB JDBC コネクタ3.4.1 をダウンロードし、エージェントのコンテナにマウントできるディレクトリに保存します。

[オプション]ソースデータベースの SSL 証明書を取得および準備する

エージェントが SSL 経由でソースデータベースに接続する場合、接続を検証するために証明書が必要になります。これらの証明書は、エージェントのコンテナ内のJava Truststoreのパス /opt/java/openjdk/lib/security/cacerts で使用できる必要があります。

エージェントに証明書を供給する最も簡単な方法は、ホストマシンの既存の cacerts ファイルに証明書を追加し、そのファイルを実行中のコンテナにマウントすることです。

openssl x509 -outform der -in ca-root.pem -out ca-root.der
keytool -import -alias server-root \
    -keystore $JAVA_HOME/jre/lib/security/cacerrts -file ca-root.der
Copy

エージェントの構成の準備

エージェントは、コンテナにマウントされた JSON ファイルまたは環境変数、あるいはその両方を組み合わせて構成できます。Snowflakeへの接続に必要なアクセスキーは、ホストのファイルシステムからマウントするか、コンテナシークレットとして提供するか、環境変数として提供することができます。

次のセクションでは、最も簡単なものから最も包括的なものまで、さまざまな構成オプションについて説明します。インフラストラクチャの詳細に基づいてアプローチを選択します。

エージェントを構成する最も簡単な方法は、実行時に2つの JSON ファイルをコンテナにマウントすることです。

  • snowflake.json には、エージェントがSnowflakeアカウントに接続するための構成が含まれています。

    このファイルは、Snowsightで利用可能なウィザードを使用して、コネクタの設定プロセスの最後にダウンロードします。

  • datasources.json には、エージェントが接続するソースデータベースのリストが含まれています。

    このファイルは自分で準備する必要があります。

ダウンロード直後、 snowflake.json にはエージェントを表すSnowflakeサービスアカウントの一時的な秘密キーが含まれます。エージェントを初めて起動すると、エージェントは自動で一時的なキーを新しい永続的なキーセットに置き換え、コンテナ内のパス /home/agent/.ssh/ に出力します。エージェントを起動するには、 snowflake.json/home/agent/.ssh/ のパスの両方を書き込み可能としてマウントする必要があります。

あるいは、エージェントのサービスアカウントに独自の秘密キーを提供することもできます。渡す必要がある環境変数については、 オプションの構成環境変数を確認する をご参照ください。

注意

エージェントがマウントされたファイルまたは環境変数として既存の秘密キーを見つけた場合、 snowflake.json にまだ存在する可能性がある一時的なキーは無視されます。

次のテンプレートを使用して datasources.json ファイルを準備します。

{
    "<data_source_name_1>": {
        "url": "jdbc:mariadb://<host>:<port>/[?<key1>=<value1>[&<key2>=<value2>]]",
        "username": "<mysql_db_username>",
        "password": "<mysql_db_password>"
    },
    "<data_source_name_2>": {
        "url": "jdbc:mariadb://<host>:<port>/[?<key1>=<value1>[&<key2>=<value2>]]",
        "username": "<mysql_db_username>",
        "password": "<mysql_db_password>"
    }
}
Copy

ファイル作成時の注意事項は次のとおりです。

  • URL を使用して少なくとも1つのデータソースを追加する必要があります。そうしないと、エージェントは起動しません。

  • エージェントがすべてのデータソースに直接接続できる限り、必要な数だけデータソースを追加できます。

  • 入力した名前は、後でコネクタのネイティブアプリを呼び出してレプリケーションを有効にするために必要な識別子になります。名前はデータソースごとに一意である必要があります。

  • データソースの名前には、文字と数字のみを含めることができます。すべての小文字は、エージェントによって自動的に大文字に変換されます。

両方の JSON ファイル、 JDBC ドライバーを含む JAR ファイル、新しいキーのセットを出力するディレクトリが準備できたら、コンテナを実行できます。

docker run -d \
   --restart unless-stopped \
   --name database-connector-agent \
   --volume </path/to/ssh/keys/directory>:/home/agent/.ssh \
   --volume </path/to/mariadb/jdbc/jar>:/home/agent/libs/mariadb-jdbc-driver \
   --volume </path/to/snowflake/json/file>:/home/agent/snowflake.json \
   --volume </path/to/datasources/json/file>:/home/agent/datasources.json \
   -m 6g \
   snowflakedb/database-connector-agent:latest
Copy

オプションの構成環境変数を確認する

エージェントは、コンテナに追加の環境変数を設定することで使用できる、次のオプション設定をサポートしています。

SNOWFLAKE_PRIVATEKEYPATH

エージェントユーザーの秘密キーを含むファイルへの絶対パスを指定します。これは、通常オーケストレーションシステムのシークレットを介して、独自の秘密キーをコンテナにマウントするときに使用されます。

SNOWFLAKE_PRIVATEKEYPASSWORD

エージェントユーザーの秘密キーのパスワードを指定します。エージェントにキーを生成させると、このパスワードが秘密キーに設定されます。既存のキーを再利用する場合、このパスワードは既存の秘密キーにアクセスするために使用されます。

SNOWFLAKE_PRIVATEKEY

エージェントユーザーの秘密キーの内容を指定します。コンテナ内のファイルとして秘密キーをマウントできない場合に、これを設定できます。

SNOWFLAKE_ENFORCEDURL

エージェント独自の検出メカニズムを上書きして、Snowflakeに接続するための URL を指定します。これは主に PrivateLink デプロイメントに接続するために使用されます。

JAVA_OPTS

エージェントのプロセスに渡される追加のJava設定またはプロパティを指定します。

最もよく使用されるものは次のとおりです。

  • 最大Javaヒープサイズを設定するための -Xmx オプション。Snowflakeでは、この値をコンテナで使用可能なメモリ量から 1GB を引いた値に設定することを推奨しています。

    たとえば、コンテナで 6GB の RAM が使用可能な場合は、次のように設定します。

    JAVA_OPTS=-Xmx5g
    
    Copy
  • エージェントからSnowflakeへの接続にプロキシが必要な場合は、次のように設定します。

    JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port>
    
    Copy
  • ソースデータベースなど、一部のホストまたは IP アドレスのプロキシをバイパスするには、追加の http.nonProxyHosts プロパティを設定します。パイプ記号(|)を使用して複数のホスト名を区切ります。アスタリスク(*)をワイルドカード文字として使用します。

    JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port>
      -Dhttp.nonProxyHosts='*.my_company.com|localhost|myorganization-myaccount.snowflakecomputing.com|192.168.91.*'
    
    Copy
  • プロキシの認証情報を渡すには、 http.proxyUser および http.proxyPassword システムプロパティを設定します。

    JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port>
      -Dhttp.proxyUser=<proxy-user> -Dhttp.proxyPassword=<proxy-pass>
    
    Copy

Snowflakeのアクセスキーを理解する

エージェントは、Snowsightのコネクタのセットアップウィザードで作成されたサービスアカウントとして、アクセスキーのセットを使用してSnowflakeと認証します。設定ウィザードは一時的なアクセスキーを作成し、 秘密 キーを snowflake.json ファイルの temporaryPrivateKey という名前のフィールドに追加します。

エージェントは、最初の起動時にこれらの一時的なキーを次のように置き換えます。

  1. 新しいアクセスキーのセットを生成し、コンテナ内の /home/agent/.sshdatabase-connector-agent-app-private-key.p8 および database-connector-agent-app-public-key.pub として保存します。このディレクトリは、コンテナがシャットダウンしてもキーが保持されるように、コンテナへの外部の書き込み可能なボリュームとしてマウントする必要があります。

  2. 新しいキーを使用するようにサービスアカウントを変更します。

  3. snowflake.json ファイルから temporaryPrivateKey フィールドを削除します。

最初のキーの置き換え後、エージェントはアクセスキーをローテーションしません。

エージェントによって生成されたキーを使用できます。または、独自のセットを作成し、サービスアカウントを変更して、エージェントに秘密キーを提供することもできます。

エージェントの秘密キーの検出順序は次のとおりです。

  1. SNOWFLAKE_PRIVATEKEY 環境変数を使用して渡される任意のキー。この値が見つかった場合、コネクタは snowflake.json からの一時的なキーを無視します。

  2. /home/agent/.ssh/database-connector-agent-app-private-key.p8 にマウントされたボリュームで見つかったキー。このファイルが見つかった場合、コネクタは snowflake.json からの一時的なキーを無視します。

  3. snowflake.json ファイルの temporaryPrivateKey フィールドの値。

Kubernetesを使用したオーケストレーションの構成

注釈

このセクションではKubernetesに焦点を当てていますが、コネクタはどのコンテナオーケストレーションシステムでも起動できます。構成構文は、多くの場合似ています。詳細については、システムのドキュメントをご参照ください。

Kubernetesを使用する場合、書き込み可能なボリュームをマウントすることは通常できません。そのため、エージェントはSnowflakeユーザーアカウントのキーを自動的に置き換えることができません。キーのセットを手動で作成し、ユーザーを変更してから、エージェントを実行しているコンテナに通常はマウントされたシークレットとして秘密キーを提供する必要があります。Snowflakeユーザーのキーペア設定の詳細については、 キーペア認証の構成 をご参照ください。

秘密情報は、 HashiCorp Vaultなどの安全な保管場所に保存することを推奨します。これらの保管場所は通常、Kubernetesとの既存の統合を備えています。たとえば、 Vaultは専用のオペレーターを提供 しています。統合の詳細は、コンテナオーケストレーションシステムおよび安全な保管場所に固有のものになります。詳細については、それぞれのドキュメントをご参照ください。

Kubernetesは通常マルチノードクラスターで実行され、ホストマシンからファイルをマウントする方法はありません。エージェントのコンテナに構成 JSON ファイルを供給するには、3つのファイルすべてを保存する Kubernetes ConfigMap を作成します。

Kubernetesでエージェントを構成する基本的な例を次に示します。

  1. JDBC ドライバーと snowflake.json を保存する ConfigMap を作成します。

    kubectl create configmap database-connector-config \
      --from-file=jdbc-driver.jar=</path/to/mariadb/jdbc/jar> \
      --from-file=snowflake.json=</path/to/snowflake/json/file>
    
    Copy

    Tip

    この記事の執筆時点では、 JDBC ドライバー JAR のサイズは約 650KB で、Kubernetesによって課せられた ConfigMap の 1MB という制限をはるかに下回っています。これほど多くのデータを ConfigMap に入れたくない場合は、エージェントの公式なものに基づいて、 JDBC JAR を追加したカスタムDockerイメージを構築するのが一般的なパターンです。

  2. エージェントユーザーの秘密キーと datasources.json の内容を保存するシークレットを作成します。

    kubectl create secret generic database-connector-secrets \
      --from-file=private-key=</path/to/private/key/file> \
      --from-file=datasources.json=</path/to/datasources.json>
    
    Copy
  3. エージェントのPodを構成し、構成ファイルと秘密キーをボリュームとしてマウントします。

    apiVersion: v1
    kind: Pod
    metadata:
      name: database-connector-agent
    spec:
      restartPolicy: Always
      containers:
        - name: database-connector-agent
          image: snowflakedb/database-connector-agent:latest
          resources:
            requests:
              memory: "6Gi"
            limits:
              memory: "8Gi"
          volumeMounts:
            - name: config
              mountPath: /home/agent/libs/jdbc-driver.jar
              subPath: jdbc-driver.jar
            - name: config
              mountPath: /home/agent/snowflake.json
              subPath: snowflake.json
            - name: secrets
              mountPath: /home/agent/datasources.json
              subPath: datasources.json
            - name: secrets
              mountPath: /etc/private-key/private-key
              subPath: private-key
          env:
            - name: MYSQL_DATASOURCE_DRIVERPATH
              value: /home/agent/libs/jdbc-driver.jar
            - name: SNOWFLAKE_PRIVATEKEYPATH
              value: /etc/private-key/private-key
      volumes:
        - name: config
          configMap:
            name: database-connector-config
        - name: secrets
          secret:
           secretName: database-connector-secrets
    
    Copy
  4. Podの構成を YAML ファイルとして保存し、たとえば database-connector.yaml として開始します。

    kubectl apply -f database-connector.yaml
    
    Copy

エージェントの監視

エージェントのコンテナは、Dockerを使用してアクセスできる stdout にログを出力します。たとえば、コンテナの名前が database-connector-agent の場合、ログを表示するコマンドは次のようになります。

docker container logs database-connector-agent
Copy

これらのログはSnowflakeにもストリーミングされます。アクセス方法については、 Snowflake Connector for MySQL のモニター をご参照ください。

ヘルスチェックエンドポイントへのアクセス

エージェントは健全性の情報を含む HTTP エンドポイントを公開します。オーケストレーションシステムでエージェントを実行するときにこのエンドポイントを使用すると、エージェントが完全に起動したかどうか、また健全であるかどうかを判断できます。エンドポイントはポート 8080 とパス /actuator/health で使用できます。

エンドポイントをKubernetesのライブネスプローブとして使用するには、Pod構成に次を追加します。

apiVersion: v1
kind: Pod
spec:
  containers:
  - ...
    livenessProbe:
      httpGet:
        path: /actuator/health
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
Copy

次のステップ

これらの手順を完了したら、 Snowflake Connector for MySQL のレプリケーションの構成 のステップに従います。