Snowflake Connector for MySQL エージェントコンテナの設定¶
注釈
Snowflake Connector for MySQL は コネクタ規約 に従います。
このトピックでは、 Snowflake Connector for MySQL エージェントコンテナを設定する手順について説明します。データベースコネクタエージェントは、インフラストラクチャ内で実行され、データベースとSnowflakeに直接接続するコンテナ化されたアプリケーションです。
Snowflake Connector for MySQL エージェントを構成するプロセスには、次のタスクが含まれます。
前提条件の確認とオーケストレーションシステムの選択¶
すべての前提条件を確認および完了し、 エージェントの構成と実行 に進みます。
コンテナオーケストレーションシステムの選択¶
エージェントは標準的なDockerコンテナイメージとしてパッケージ化されており、標準をサポートするオーケストレーションシステムで実行できます。これには、スタンドアロンの Docker インスタンス、 Kubernetes、 RedHat OpenShift、 AWS Fargate などのクラウド管理ソリューションが含まれます。組織には、使用が推奨される既存のシステムが存在することがよくあります。
オーケストレーションシステムに応じて制約が異なるため、このドキュメントのエージェントの構成セクションをよく確認してください。使用中のシステムまたは特定の設定によっては、書き込み可能なボリュームをマウントできない場合があります(エージェントの主な構成オプションで必要な場合)。
後の例では、最も一般的なオーケストレーションシステムであるKubernetesに焦点を当てます。他のシステムでも同様のアプローチをとることが多く、各自の設定に合わせて例を調整する必要があります。
必要なシステムリソースの確認¶
エージェントはメモリを大量に消費するアプリケーションであり、正しく動作するためには最低 6GB の RAM が必要です。
最適な CPUs の数は4です。CPUs が少ないとパフォーマンスが低下する可能性があります。CPUs を増やしてもパフォーマンスは向上しません。
接続の設定¶
エージェントは、データを読み取ろうとするすべてのソースデータベースに接続する必要があります。直接接続を可能にし、 MySQL の従来のクライアントポートに到達できるように、ネットワークとファイアウォールを構成します。通常はポート 3306
です。詳細については、 MySQL のポート参照表 をご参照ください。
ソースデータベースが分離されたネットワークに存在し、単一のエージェントから接続できない場合は、コネクタのネイティブアプリケーションの追加インスタンスをインストールし、それぞれに独自のエージェントをインストールする必要があります。この機能は現在プライベートプレビュー中です。アクセスをリクエストするには、 Snowflakeサポート にご連絡ください。
エージェントは、Snowflakeデプロイメントに直接接続することもできます。使用可能にする必要があるホスト名の詳細については、 ホスト名の許可 をご参照ください。
エージェントの接続のいずれかがプロキシを通過する場合は、エージェントに追加の構成を渡す必要があります。 オプションの構成環境変数を確認する をご参照ください。
エージェントの構成と実行¶
エージェントの構成と実行は、次のステップで構成されます。
エージェントの構成 ファイルまたはエージェントの環境変数を準備し、エージェントを起動する
必要に応じて、 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
エージェントの構成の準備¶
エージェントは、コンテナにマウントされた 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>"
}
}
ファイル作成時の注意事項は次のとおりです。
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
snowflake.json
および datasources.json
を介して渡される構成オプションは、環境変数を通じて提供できます。
重要
環境変数は、いずれかの JSON ファイルを通じて提供される設定よりも優先されます。
環境変数名は、両方の JSON ファイル内のパスと同じ構造に従います。ネストされたキーはアンダースコア _
で区切る必要があり、すべての変数には SNOWFLAKE_
のプレフィックスが付けられ、配列エントリには整数インデックスのプレフィックスが付けられる必要があります。
docker run \
-e SNOWFLAKE_USERNAME="MYSQL_AGENT_USER" \
-e SNOWFLAKE_APPLICATION_NAME="SNOWFLAKE_CONNECTOR_FOR_MYSQL" \
-e SNOWFLAKE_ALLOWLIST_0_HOST="example_account.us-west-2.aws.snowflakecomputing.com" \
-e SNOWFLAKE_ALLOWLIST_0_PORT=443 \
-e SNOWFLAKE_ALLOWLIST_0_TYPE="SNOWFLAKE_DEPLOYMENT" \
...
次と同等:
{
"userName": "MYSQL_AGENT_USER",
"applicationName": "SNOWFLAKE_CONNECTOR_FOR_MYSQL",
"allowlist": [
{
"host": "example_account.us-west-2.aws.snowflakecomputing.com",
"port": 443,
"type": "SNOWFLAKE_DEPLOYMENT"
}
]
}
allowList
または allowlistPrivatelink
配列のすべてのエントリをコピーする必要はありません。代わりに、 SNOWFLAKE_DEPLOYMENT
の type
を持つ allowList
エントリを見つけ、この URL を使用して、次のように変数 SNOWFLAKE_ENFORCEDURL
を設定します。
docker run \
-e SNOWFLAKE_USERNAME="CONNECTOR_MYSQL_AGENT" \
-e SNOWFLAKE_APPLICATION_NAME="CONNECTOR_MYSQL_INSTANCE" \
-e SNOWFLAKE_ENFORCEDURL="example_account.us-west-2.aws.snowflakecomputing.com:443" \
...
データソースも同様の構造に従い、 SNOWFLAKE_DATASOURCES_
のプレフィックスが付きます。
例:
docker run \
-e SNOWFLAKE_DATASOURCES_MYSQLDS1_URL="jdbc:mariadb://example.internal:3306/" \
-e SNOWFLAKE_DATASOURCES_MYSQLDS1_USERNAME="example_user" \
-e SNOWFLAKE_DATASOURCES_MYSQLDS1_PASSWORD="example_password" \
...
次と同等:
{
"MYSQLDS1": {
"url": "jdbc:mariadb://example.internal:3306/",
"username": "example_user",
"password": "example_password"
}
}
オプションの構成環境変数を確認する¶
エージェントは、コンテナに追加の環境変数を設定することで使用できる、次のオプション設定をサポートしています。
SNOWFLAKE_PRIVATEKEYPATH
エージェントユーザーの秘密キーを含むファイルへの絶対パスを指定します。これは、通常オーケストレーションシステムのシークレットを介して、独自の秘密キーをコンテナにマウントするときに使用されます。
SNOWFLAKE_PRIVATEKEYPASSWORD
エージェントユーザーの秘密キーのパスワードを指定します。エージェントにキーを生成させると、このパスワードが秘密キーに設定されます。既存のキーを再利用する場合、このパスワードは既存の秘密キーにアクセスするために使用されます。
SNOWFLAKE_PRIVATEKEY
エージェントユーザーの秘密キーの内容を指定します。コンテナ内のファイルとして秘密キーをマウントできない場合に、これを設定できます。
SNOWFLAKE_ENFORCEDURL
エージェント独自の検出メカニズムを上書きして、Snowflakeに接続するための URL を指定します。これは主に PrivateLink デプロイメントに接続するために使用されます。
JAVA_OPTS
エージェントのプロセスに渡される追加のJava設定またはプロパティを指定します。
最もよく使用されるものは次のとおりです。
最大Javaヒープサイズを設定するための
-Xmx
オプション。Snowflakeでは、この値をコンテナで使用可能なメモリ量から 1GB を引いた値に設定することを推奨しています。たとえば、コンテナで 6GB の RAM が使用可能な場合は、次のように設定します。
JAVA_OPTS=-Xmx5g
エージェントからSnowflakeへの接続にプロキシが必要な場合は、次のように設定します。
JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port>
ソースデータベースなど、一部のホストまたは 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.*'
プロキシの認証情報を渡すには、
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>
PrivateLink 接続の設定¶
PrivateLink デプロイメントに接続する場合は、 SNOWFLAKE_ENFORCEDURL
環境変数を設定して、エージェントが接続する URL を明示的に指定する必要があります。
アカウントの PrivateLink URL を確認するには、次のいずれかの方法を実行します。
構成プロセス中に取得した
snowflake.json
ファイルを開きます。allowlistPrivatelink
という名前の配列を見つけ、次にSNOWFLAKE_DEPLOYMENT
のtype
を持つエントリーを見つけます。SYSTEM$GET_PRIVATELINK_CONFIG 関数を使用します。
Snowflakeのアクセスキーを理解する¶
エージェントは、Snowsightのコネクタのセットアップウィザードで作成されたサービスアカウントとして、アクセスキーのセットを使用してSnowflakeと認証します。設定ウィザードは一時的なアクセスキーを作成し、 秘密 キーを snowflake.json
ファイルの temporaryPrivateKey
という名前のフィールドに追加します。
エージェントは、最初の起動時にこれらの一時的なキーを次のように置き換えます。
新しいアクセスキーのセットを生成し、コンテナ内の
/home/agent/.ssh
にdatabase-connector-agent-app-private-key.p8
およびdatabase-connector-agent-app-public-key.pub
として保存します。このディレクトリは、コンテナがシャットダウンしてもキーが保持されるように、コンテナへの外部の書き込み可能なボリュームとしてマウントする必要があります。新しいキーを使用するようにサービスアカウントを変更します。
snowflake.json
ファイルからtemporaryPrivateKey
フィールドを削除します。
最初のキーの置き換え後、エージェントはアクセスキーをローテーションしません。
エージェントによって生成されたキーを使用できます。または、独自のセットを作成し、サービスアカウントを変更して、エージェントに秘密キーを提供することもできます。
エージェントの秘密キーの検出順序は次のとおりです。
SNOWFLAKE_PRIVATEKEY
環境変数を使用して渡される任意のキー。この値が見つかった場合、コネクタはsnowflake.json
からの一時的なキーを無視します。/home/agent/.ssh/database-connector-agent-app-private-key.p8
にマウントされたボリュームで見つかったキー。このファイルが見つかった場合、コネクタはsnowflake.json
からの一時的なキーを無視します。snowflake.json
ファイルのtemporaryPrivateKey
フィールドの値。
Kubernetesを使用したオーケストレーションの構成¶
注釈
このセクションではKubernetesに焦点を当てていますが、コネクタはどのコンテナオーケストレーションシステムでも起動できます。構成構文は、多くの場合似ています。詳細については、システムのドキュメントをご参照ください。
Kubernetesを使用する場合、書き込み可能なボリュームをマウントすることは通常できません。そのため、エージェントはSnowflakeユーザーアカウントのキーを自動的に置き換えることができません。キーのセットを手動で作成し、ユーザーを変更してから、エージェントを実行しているコンテナに通常はマウントされたシークレットとして秘密キーを提供する必要があります。Snowflakeユーザーのキーペア設定の詳細については、 キーペア認証の構成 をご参照ください。
秘密情報は、 HashiCorp Vaultなどの安全な保管場所に保存することを推奨します。これらの保管場所は通常、Kubernetesとの既存の統合を備えています。たとえば、 Vaultは専用のオペレーターを提供 しています。統合の詳細は、コンテナオーケストレーションシステムおよび安全な保管場所に固有のものになります。詳細については、それぞれのドキュメントをご参照ください。
Kubernetesは通常マルチノードクラスターで実行され、ホストマシンからファイルをマウントする方法はありません。エージェントのコンテナに構成 JSON ファイルを供給するには、3つのファイルすべてを保存する Kubernetes ConfigMap を作成します。
Kubernetesでエージェントを構成する基本的な例を次に示します。
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>
Tip
この記事の執筆時点では、 JDBC ドライバー JAR のサイズは約 650KB で、Kubernetesによって課せられた ConfigMap の 1MB という制限をはるかに下回っています。これほど多くのデータを ConfigMap に入れたくない場合は、エージェントの公式なものに基づいて、 JDBC JAR を追加したカスタムDockerイメージを構築するのが一般的なパターンです。
エージェントユーザーの秘密キーと
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>
エージェントの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
Podの構成を YAML ファイルとして保存し、たとえば
database-connector.yaml
として開始します。kubectl apply -f database-connector.yaml
エージェントの監視¶
エージェントのコンテナは、Dockerを使用してアクセスできる stdout
にログを出力します。たとえば、コンテナの名前が database-connector-agent
の場合、ログを表示するコマンドは次のようになります。
docker container logs database-connector-agent
これらのログは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
次のステップ¶
これらの手順を完了したら、 Snowflake Connector for MySQL のレプリケーションの構成 のステップに従います。