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();
✅ ポイント
- ステージから証明書を取得
_snowflake.open()
を使い、SSL 証明書の内容を取得。
- AWS IAM 認証トークンを生成
boto3.client('rds')
を使用し、MySQL の認証にトークンを利用。
- 一時ファイルを作成し SSL 証明書を保存
tempfile.NamedTemporaryFile()
で証明書を一時保存し、ssl_ca
に設定。
- MySQL に接続
pymysql.connect()
を使って MySQL に接続。
まとめ
今回は、Snowflake の 内部ステージ に保存された SSL証明書 (PEMファイル) を活用し、AWS RDS (MySQL) に接続する方法を紹介しました。
学んだポイント
✅ Snowflake のステージから _snowflake.open()
を使ってファイルを読み込む方法
✅ AWS RDS の IAM 認証を使ってセキュアに MySQL に接続する方法
✅ Python UDF を使って MySQL に接続する方法
これにより、Snowflake 上のデータと AWS RDS のデータを安全に統合できる ようになります。
同じような課題を抱えている方の参考になれば幸いです!💡