Snowflake内部ステージからSSL証明書を取得し、MySQL(AWS RDS)に接続する方法

こんにちは!今回は Snowflake の内部ステージに保存された PEMファイル(SSL証明書) を活用し、AWS RDS (MySQL) に安全に接続する方法 を解説します。

Snowflake の UDF(User Defined Function)を活用して PEMファイルを読み込み、MySQL の SSL接続 に利用する方法を順を追って説明します。実際に試したエラーとその解決方法も含めているので、同じ課題に直面している方の参考になれば幸いです!


目次

ステップ1: Snowflake 内部ステージにSSL証明書をアップロード

まず、SSL証明書(PEMファイル)を Snowflake の 内部ステージ に保存します。これは、後の UDF で使用するための準備です。

1.1 内部ステージを作成

CREATE OR REPLACE STAGE my_stage;

1.2 ローカルの SSL 証明書をアップロード

PUT file://path/to/your/ca-bundle.pem @my_stage AUTO_COMPRESS=FALSE;

1.3 ステージ内のファイルを確認

LIST @my_stage;

これで、証明書ファイルが Snowflake の内部ステージに格納されました。次に、この証明書を Python UDF で読み込む方法を紹介します。


ステップ2: Snowflake UDF で SSL 証明書を取得

Snowflake の Python UDF を作成し、内部ステージから PEMファイルを読み込む 関数を作成します。

CREATE OR REPLACE FUNCTION read_pem_file()
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
HANDLER = 'read_file'
AS $$
import _snowflake

def read_file():
    # ステージ上のファイルパスを指定
    file_path = "@my_stage/ca-bundle.pem"

    try:
        # Snowflakeのステージからファイルを読み込み
        with _snowflake.open(file_path, 'r', require_scoped_url=False) as f:
            content = f.read()
        return content
    except Exception as e:
        return f"Error reading file: {str(e)}"
$$;

この関数を呼び出せば、ステージ内の証明書ファイルの内容を取得できます。

SELECT read_pem_file();

ポイント

  • _snowflake.open() を使って、内部ステージのファイルを Python UDF で読み込む。
  • require_scoped_url=False を指定して、スコープ付きURLのチェックを回避する。

ステップ3: Snowflake の UDF を活用して MySQL (AWS RDS) に接続

次に、取得した SSL 証明書を使って AWS RDS (MySQL) に安全に接続 する方法を解説します。

3.1 AWS RDS の IAM 認証トークンを生成

AWS RDS に接続する際、IAM 認証を利用してセキュリティを強化します。boto3 を使ってトークンを生成し、MySQL のパスワードとして使用します。

3.2 MySQL に接続する Snowflake UDF の作成

CREATE OR REPLACE FUNCTION connect_rds()
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
PACKAGES = ('boto3', 'pymysql')
HANDLER = 'main'
AS $$
import _snowflake
import boto3
import pymysql
import tempfile

# RDSインスタンス情報
rds_host = "your-rds-endpoint"
username = "jane_doe"
db_name = "your-database-name"
region = "your-region"

def main():
    try:
        # Snowflake内部ステージからSSL証明書を取得
        ssl_cert_stage_path = "@my_stage/ca-bundle.pem"
        with _snowflake.open(ssl_cert_stage_path, 'r', require_scoped_url=False) as cert_file:
            ssl_cert_content = cert_file.read()
        
        # AWS IAM認証トークンを生成
        boto_session = boto3.Session(region_name=region)
        rds_client = boto_session.client('rds')
        token = rds_client.generate_db_auth_token(DBHostname=rds_host, Port=3306, DBUsername=username)
        
        # 証明書を一時ファイルに保存
        with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix=".pem") as tmp_cert_file:
            tmp_cert_file.write(ssl_cert_content)
            tmp_cert_path = tmp_cert_file.name
        
        # MySQL に接続
        conn = pymysql.connect(
            host=rds_host,
            user=username,
            password=token,
            database=db_name,
            ssl_ca=tmp_cert_path,  # SSL証明書を使用
            port=3306
        )
        return "Successfully connected to RDS with SSL!"
    
    except Exception as e:
        return f"Error: {str(e)}"
$$;

3.3 UDF を実行

SELECT connect_rds();

ポイント

  1. ステージから証明書を取得
    • _snowflake.open() を使い、SSL 証明書の内容を取得。
  2. AWS IAM 認証トークンを生成
    • boto3.client('rds') を使用し、MySQL の認証にトークンを利用。
  3. 一時ファイルを作成し SSL 証明書を保存
    • tempfile.NamedTemporaryFile() で証明書を一時保存し、ssl_ca に設定。
  4. MySQL に接続
    • pymysql.connect() を使って MySQL に接続。

まとめ

今回は、Snowflake の 内部ステージ に保存された SSL証明書 (PEMファイル) を活用し、AWS RDS (MySQL) に接続する方法を紹介しました。

学んだポイント

Snowflake のステージから _snowflake.open() を使ってファイルを読み込む方法
AWS RDS の IAM 認証を使ってセキュアに MySQL に接続する方法
Python UDF を使って MySQL に接続する方法

これにより、Snowflake 上のデータと AWS RDS のデータを安全に統合できる ようになります。
同じような課題を抱えている方の参考になれば幸いです!💡

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です