Babelfish で Aurora PostgreSQL 拡張機能を使用する - Amazon Aurora

Babelfish で Aurora PostgreSQL 拡張機能を使用する

Aurora PostgreSQL には、他の AWS のサービスとの連携のための拡張機能が用意されています。これらは、データのインポートやエクスポートに DB クラスターで Amazon S3 を使用するなど、さまざまなユースケースをサポートするオプションの拡張機能です。

  • Amazon S3 バケットから Babelfish for Aurora PostgreSQL DB クラスターにデータをインポートするには、aws_s3 Aurora PostgreSQL 拡張機能をセットアップします。この拡張機能を使用すると、Aurora PostgreSQL DB クラスターから Amazon S3 バケットにデータをエクスポートすることもできます。

  • AWS Lambda はサーバーのプロビジョニングや管理をする必要がなく、コードを実行できるコンピューティングサービスです。DB インスタンスのイベント通知を処理するときなどに Lambda 関数を使用できます。Lambda の詳細については、AWS Lambda デベロッパーガイドの「AWS Lambda とは」を参照してください。Babelfish DB クラスターから Lambda 関数を呼び出すには、aws_lambda Aurora PostgreSQL 拡張機能をセットアップします。

Babelfish クラスターにこれらの拡張機能をセットアップするには、まず内部 Babelfish ユーザーに拡張機能をロードするアクセス許可を付与する必要があります。アクセス許可を付与した後、Aurora PostgreSQL 拡張機能をロードできます。

Babelfish DB クラスターで Aurora PostgreSQL 拡張機能を有効にする

aws_s3 または aws_lambda 拡張機能をロードする前に、Babelfish DB クラスターに必要な権限を付与します。

次の手順では、psql PostgreSQL コマンドラインツールを使用して DB クラスターに接続します。詳細については、「psql を使用したクラスターへの接続」を参照してください。pgAdmin を使用することもできます。詳細については、「pgAdmin を使用した DB クラスターへの接続」を参照してください。

この手順では、aws_s3aws_lambda の両方を順次ロードします。これらの拡張機能のうちの 1 つだけを使用する場合は、両方をロードする必要はありません。どちらにも aws_commons 拡張機能が必要で、これは出力に示すようにデフォルトでロードされます。

Aurora PostgreSQL 拡張機能の権限で Babelfish DB クラスターをセットアップするには
  1. Babelfish DB クラスターに接続します。Babelfish DB クラスターの作成時に指定した「マスター」ユーザー (-U) の名前を使用します。デフォルト (postgres) を例で示します。

    Linux、macOS、Unix の場合:

    psql -h your-Babelfish.cluster.444455556666-us-east-1.rds.amazonaws.com \ -U postgres \ -d babelfish_db \ -p 5432

    Windows の場合:

    psql -h your-Babelfish.cluster.444455556666-us-east-1.rds.amazonaws.com ^ -U postgres ^ -d babelfish_db ^ -p 5432

    コマンドは、ユーザー名 (-U) のパスワードを入力するプロンプトを表示します。

    Password:

    DB クラスターのユーザー名 (-U) のパスワードを入力します。接続が成功した場合は、次のような出力が表示されます。

    psql (13.4) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. postgres=>
  2. 内部 Babelfish ユーザーに拡張機能を作成およびロードする権限を付与します。

    babelfish_db=> GRANT rds_superuser TO master_dbo; GRANT ROLE
  3. aws_s3 拡張機能を作成してロードします。aws_commons 拡張機能が必要で、aws_s3 がインストールされるときに自動的にインストールされます。

    babelfish_db=> create extension aws_s3 cascade; NOTICE: installing required extension "aws_commons" CREATE EXTENSION
  4. aws_lambda 拡張機能を作成してロードします。

    babelfish_db=> create extension aws_lambda cascade; CREATE EXTENSION babelfish_db=>

Amazon S3 での Babelfish の使用

Babelfish DB クラスターで使用する Amazon S3 バケットをまだ持っていない場合は、作成できます。使用するすべての Amazon S3 バケットに対して、アクセスを提供します。

Amazon S3 バケットを使用してデータをインポートまたはエクスポートする前に、次の 1 回限りの手順を完了してください。

Amazon S3 バケットへの Babelfish DB インスタンスのアクセスを設定するには
  1. 必要に応じて、Babelfish インスタンス用の Amazon S3 バケットを作成します。これを行うには、「Amazon Simple Storage Service ユーザーガイド」の「最初の S3 バケットを作成する」の手順に従います。

  2. ファイルを Amazon S3 バケットにアップロードします。これを行うには、「Amazon Simple Storage Service ユーザーガイド」の「バケットにオブジェクトをアップロードする」の手順に従います。

  3. 必要に応じてアクセス許可を次のように設定します。

    • Amazon S3 からデータをインポートするには、Babelfish DB クラスターにバケットへのアクセス許可が必要です。AWS Identity and Access Management (IAM) ロールを使用し、クラスターのそのロールに IAM ポリシーをアタッチすることをお勧めします。これを行うには、「IAM ロールを使用した Amazon S3 バケットへのアクセス」の手順を実行します。

    • Babelfish DB クラスターからデータをエクスポートするには、クラスターに Amazon S3 バケットへのアクセス権が付与されている必要があります。インポートの場合と同様に、IAM ロールとポリシーを使用することをお勧めします。これを行うには、「Amazon S3 バケットへのアクセスを設定する」の手順を実行します。

aws_s3 拡張機能がある Amazon S3 を Babelfish DB クラスターで使用できるようになりました。

Amazon S3 から Babelfish にデータをインポートし、Babelfish データを Amazon S3 にエクスポートするには
  1. Babelfish DB クラスターで aws_s3 拡張機能を使用します。

    その場合、PostgreSQL のコンテキスト内に存在するテーブルを参照するようにしてください。つまり、[database].[schema].[tableA] という名前の Babelfish テーブルにインポートする場合、そのテーブルを aws_s3 関数の database_schema_tableA として参照してください。

  2. aws_s3 拡張機能および Amazon S3 使用時には、次の表に示すように、PostgreSQL のネーミングを使用して Babelfish テーブルを参照するようにしてください。

Babelfish テーブル

Aurora PostgreSQL テーブル

database.schema.table

database_schema_table

Aurora PostgreSQL での Amazon S3 の使用の詳細については、「Amazon S3 から Aurora PostgreSQL DB クラスターにデータをインポートする」および「Aurora PostgreSQL DB クラスターから Amazon S3 へのデータのエクスポート」を参照してください。

AWS Lambda での Babelfish の使用

aws_lambda 拡張機能が Babelfish DB クラスターにロードされても、Lambda 関数の呼び出しができるようにするには、この手順に従って DB クラスターへの Lambda アクセスを許可する必要があります。

Babelfish DB クラスターが Lambda で動作するようにアクセスを設定するには

この手順では、AWS CLI を使用して、IAM ポリシーとロールを作成し、これらを Babelfish DB クラスターに関連付けます。

  1. Babelfish DB クラスターから Lambda へのアクセスを許可する IAM ポリシーを作成します。

    aws iam create-policy --policy-name rds-lambda-policy --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessToExampleFunction", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:aws-region:444455556666:function:my-function" } ] }'
  2. 実行時にポリシーが引き受けることができる IAM ロールを作成します。

    aws iam create-role --role-name rds-lambda-role --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'
  3. ロールへのポリシーの付与

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::444455556666:policy/rds-lambda-policy \ --role-name rds-lambda-role --region aws-region
  4. ロールを Babelfish DB クラスターにアタッチします。

    aws rds add-role-to-db-cluster \ --db-cluster-identifier my-cluster-name \ --feature-name Lambda \ --role-arn arn:aws:iam::444455556666:role/rds-lambda-role \ --region aws-region

これらのタスクの完了後、Lambda 関数を呼び出すことができます。AWS Lambda での Aurora PostgreSQL DB クラスターへの AWS Lambda の設定の詳細と例については、「ステップ 2: Aurora PostgreSQL DB クラスターおよび AWS Lambda のために IAM を設定する」を参照してください。

Babelfish DB クラスターから Lambda 関数を呼び出すには

AWS Lambda は、Java、Node.js、Python、Ruby、および他の言語で書かれた関数をサポートしています。関数が呼び出されたときにテキストを返す場合は、Babelfish DB クラスターから呼び出すことができます。次の例は、挨拶を返すプレースホルダー Python 関数です。

lambda_function.py import json def lambda_handler(event, context): #TODO implement return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!')

現在、Babelfish は JSON をサポートしていません。関数が JSON を返す場合、ラッパーを使用して JSON を処理します。例えば、前に示した lambda_function.py は、Lambda に my-function として保存されています。

  1. psql クライアント (または pgAdmin クライアント) を使用して Babelfish DB クラスターに接続します。詳細については、「psql を使用したクラスターへの接続」を参照してください。

  2. ラッパーを作成します。この例では、PostgreSQL の手続き言語を SQL、PL/pgSQL に使用します。詳細については、「PL/pgSQL – SQL 手続き言語」を参照してください。

    create or replace function master_dbo.lambda_wrapper() returns text language plpgsql as $$ declare r_status_code integer; r_payload text; begin SELECT payload INTO r_payload FROM aws_lambda.invoke( aws_commons.create_lambda_function_arn('my-function', 'us-east-1') ,'{"body": "Hello from Postgres!"}'::json ); return r_payload ; end; $$;

    この関数は、Babelfish TDS ポート (1433) または PostgreSQL ポート (5433) から実行できるようになりました。

    1. PostgreSQL ポートからこの関数を起動する (呼び出す) には、次の操作を実行します。

      SELECT * from aws_lambda.invoke(aws_commons.create_lambda_function_arn('my-function', 'us-east-1'), '{"body": "Hello from Postgres!"}'::json );

      出力は次の例のようになります。

      status_code | payload | executed_version | log_result -------------+-------------------------------------------------------+------------------+------------ 200 | {"statusCode": 200, "body": "\"Hello from Lambda!\""} | $LATEST | (1 row)
    2. TDS ポートからこの関数を起動する (呼び出す) には、SQL Server sqlcmd コマンドラインクライアントを使用してポートに接続します。詳細については、「SQL Server クライアントを使用した DB クラスターへの接続」を参照してください。接続したら、以下を実行します。

      1> select lambda_wrapper(); 2> go

      このコマンドにより、以下のような出力が返されます。

      {"statusCode": 200, "body": "\"Hello from Lambda!\""}

Aurora PostgreSQL での Lambda の使用の詳細については、「Aurora PostgreSQL DB クラスターから AWS Lambda 関数を呼び出す」を参照してください。Lambda 関数の操作の詳細については、AWS Lambda デベロッパーガイドの「Lambda の開始方法」を参照してください。

Babelfish での pg_stat_statements の使用

Babelfish for Aurora PostgreSQL は 3.3.0 からの pg_stat_statements 拡張機能をサポートしています。詳細については、pg_stat_statements を参照してください。

Aurora PostgreSQL でサポートされているこの拡張機能の詳細については、「拡張機能バージョン」を参照してください。

pg_stat_statements 拡張機能の作成

pg_stat_statements を有効にするには、クエリ ID 計算を有効にする必要があります。compute_query_id がパラメータグループで on または auto に設定されている場合、これは自動的に実行されます。compute_query_id パラメータのデフォルト値は auto です。また、この機能をオンにするには、この拡張機能も作成する必要があります。T-SQL エンドポイントから拡張機能をインストールするには、次のコマンドを使用します。

1>EXEC sp_execute_postgresql 'CREATE EXTENSION pg_stat_statements WITH SCHEMA sys';

次のクエリを使用してクエリの統計にアクセスできます。

postgres=>select * from pg_stat_statements;
注記

インストール中に拡張機能のスキーマ名を指定しない場合、デフォルトではパブリックスキーマに作成されます。これにアクセスするには、次に示すように、スキーマ修飾子付きの角括弧を使用する必要があります。

postgres=>select * from [public].pg_stat_statements;

PSQL エンドポイントから拡張機能を作成することもできます。

拡張機能の認証

デフォルトでは、T-SQL データベース内で実行されたクエリの統計を認証なしで表示できます。

他のユーザーが作成したクエリ統計にアクセスするには、pg_read_all_stats PostgreSQL ロールが必要です。以下の手順に従って GRANT pg_read_all_stats コマンドを作成します。

  1. T-SQL では、内部 PG ロール名を返す以下のクエリを使用します。

    SELECT rolname FROM pg_roles WHERE oid = USER_ID();
  2. rds_superuser 権限で次のコマンドを使用して、Babelfish for Aurora PostgreSQL データベースに接続します。

    GRANT pg_read_all_stats TO <rolname_from_above_query>

T-SQL エンドポイントから:

1>SELECT rolname FROM pg_roles WHERE oid = USER_ID(); 2>go
rolname ------- master_dbo (1 rows affected)

PSQL エンドポイントから:

babelfish_db=# grant pg_read_all_stats to master_dbo;
GRANT ROLE

pg_stat_statements ビューを使用してクエリ統計にアクセスできます。

1>create table t1(cola int); 2>go 1>insert into t1 values (1),(2),(3); 2>go
(3 rows affected)
1>select userid, dbid, queryid, query from pg_stat_statements; 2>go
userid dbid queryid query ------ ---- ------- ----- 37503 34582 6487973085327558478 select * from t1 37503 34582 6284378402749466286 SET QUOTED_IDENTIFIER OFF 37503 34582 2864302298511657420 insert into t1 values ($1),($2),($3) 10 34582 NULL <insufficient privilege> 37503 34582 5615368793313871642 SET TEXTSIZE 4096 37503 34582 639400815330803392 create table t1(cola int) (6 rows affected)

クエリの統計のリセット

pg_stat_statements_reset() を使用して、これまで pg_stat_statements によって収集された統計をリセットできます。詳細については、pg_stat_statements を参照してください。現在、PSQL エンドポイントでのみサポートされています。rds_superuser 権限で、次のコマンドを使用して Babelfish for Aurora PostgreSQL に接続します。

SELECT pg_stat_statements_reset();

制限事項

  • 現在、pg_stat_statements() は T-SQL エンドポイントではサポートされていません。pg_stat_statements ビューは、統計を収集するのに推奨される方法です。

  • 一部のクエリは、Aurora PostgreSQL エンジンによって実装された T-SQL パーサーによって書き直される可能性があります。pg_stat_statements ビューには、元のクエリではなく、書き直されたクエリが表示されます。

    select next value for [dbo].[newCounter];

    上記のクエリは pg_stat_statements ビューで次のように書き直されます。

    select nextval($1);
  • ステートメントの実行フローに基づき、一部のクエリは pg_stat_statements によって追跡されず、ビューに表示されない場合があります。これには、use dbnamegotoprintraise errorsetthrowdeclare cursor のステートメントが含まれます。

  • CREATE LOGIN ステートメントと ALTER LOGIN ステートメントでは、クエリとクエリ ID は表示されません。権限が不十分だと表示されます。

  • pg_stat_statements ビューには常に以下の 2 つのエントリが含まれます。これらは sqlcmd クライアントによって内部的に実行されるからです。

    • SET QUOTED_IDENTIFIER OFF

    • SET TEXTSIZE 4,096

Babelfish での pgvector の使用

オープンソースの拡張機能である pgvector を使用すると、Postgres データベース内で同様のデータを直接検索できます。Babelfish は、バージョン 15.6 および 16.2 以降、この拡張機能をサポートするようになりました。詳細については、「pgvector Open source Documentation」を参照してください。

前提条件

pgvector 機能を有効にするには、次のいずれかの方法を使用して、拡張機能を sys スキーマにインストールします。

  • sqlcmd クライアントで次のコマンドを実行します。

    exec sys.sp_execute_postgresql 'CREATE EXTENSION vector WITH SCHEMA sys';
  • psql クライアントで次のコマンドを実行して、babelfish_db に接続して実行します。

    CREATE EXTENSION vector WITH SCHEMA sys;
注記

pgvector 拡張機能をインストールした後、ベクトルデータ型は、確立した新しいデータベース接続でのみ使用できます。既存の接続では、新しいデータ型は認識されません。

サポートされている機能

Babelfish は T-SQL 機能を拡張して、以下をサポートします。

  • 保存

    Babelfish はベクトルデータ型互換構文をサポートするようになり、T-SQL の互換性が強化されました。pgvector を使用したデータの保存の詳細については、「Storing」を参照してください。

  • クエリ

    Babelfish は T-SQL 式のサポートを拡張して、ベクトル類似度演算子をサポートしています。ただし、他のすべてのクエリでは、標準の T-SQL 構文が引き続き必要です。

    注記

    T-SQL は配列型をサポートしておらず、データベースドライバーにはそれらを処理するインターフェイスがありません。この問題を避けるため、Babelfish はテキスト文字列 (varchar/nvarchar) を使用してベクトルデータを保存します。例えば、ベクトル値 [1,2,3] を要求すると、Babelfish は文字列「[1,2,3]」をレスポンスとして返します。この文字列は、必要に応じてアプリケーションレベルで解析および分割できます。

    pgvector を使用したデータのクエリの詳細については、「Querying」を参照してください。

  • インデックス作成

    T-SQL Create IndexUSING INDEX_METHOD 構文をサポートするようになりました。インデックスの作成時に、特定の列で使用する類似度検索演算子を定義できるようになりました。

    また、文法は必要な列 (column_name_list_with_order_for_vector 文法を参照) でのベクトル類似度オペレーションをサポートするように拡張されています。

    CREATE [UNIQUE] [clustered] [COLUMNSTORE] INDEX <index_name> ON <table_name> [USING vector_index_method] (<column_name_list_with_order_for_vector>) Where column_name_list_with_order_for_vector is: <column_name> [ASC | DESC] [VECTOR_COSINE_OPS | VECTOR_IP_OPS | VECTOR_L2_OPS] (COMMA simple_column_name [ASC | DESC] [VECTOR_COSINE_OPS | VECTOR_IP_OPS | VECTOR_L2_OPS])

    pgvector を使用したデータのインデックス作成の詳細については、「Indexing」を参照してください。

  • パフォーマンス

    • SET BABELFISH_STATISTICS PROFILE ON を使用して、T-SQL エンドポイントからクエリプランをデバッグします。

    • T-SQL でサポートされている set_config 関数を使用して max_parallel_workers_get_gather を増やします。

    • 近似検索に IVFFlat を使用します。詳細については、「IVFFlat」を参照してください。

    pgvector のパフォーマンスを向上させるには、「Performance」を参照してください。

制限事項

  • Babelfish は、ハイブリッド検索の全文検索をサポートしていません。詳細については、「Hybrid Search」を参照してください。

  • Babelfish は現在、インデックスの再作成機能をサポートしていません。ただし、PostgreSQL エンドポイントを使用してインデックスを再作成することはできます。詳細については、「Vacuuming」を参照してください。

Babelfish での Amazon Aurora 機械学習の使用

Amazon Aurora の機械学習と統合することで、Babelfish for Aurora PostgreSQL DB クラスターの機能を拡張できます。このシームレスな統合により、Amazon Comprehend、Amazon SageMaker、Amazon Bedrock などのさまざまな強力なサービスにアクセスできます。それぞれのサービスは、個別の機械学習ニーズに対応するようにカスタマイズされています。

Babelfish のユーザーは、Aurora の機械学習を使用する際に T-SQL 構文とセマンティクスに関する既存の知識を使用できます。Aurora PostgreSQL の AWS ドキュメントに記載されている手順に従ってください。詳細については、「Aurora PostgreSQL で Amazon Aurora 機械学習を使用する」を参照してください。

前提条件

  • Babelfish for Aurora PostgreSQL DB クラスターを設定して Aurora 機械学習の使用を開始する前に、関連する要件と前提条件を確認してください。詳細については、「Aurora 機械学習 を Aurora PostgreSQL で使用するための要件」を参照してください。

  • Postgres エンドポイントまたは sp_execute_postgresql ストアプロシージャを使用して、aws_ml 拡張機能をインストールします。

    exec sys.sp_execute_postgresql 'Create Extension aws_ml'
    注記

    現在、Babelfish は Babelfish での sp_execute_postgresql を使用したカスケードオペレーションをサポートしていません。aws_mlaws_commons に依存するため、Postgres エンドポイントを使用して個別にインストールする必要があります。

    create extension aws_common;

aws_ml 関数を使用した T-SQL 構文とセマンティクスの処理

次の例では、T-SQL 構文とセマンティクスが Amazon ML サービスにどのように適用されるかを説明します。

例 : aws_bedrock.invoke_model – Amazon Bedrock 関数を使用したシンプルなクエリ
aws_bedrock.invoke_model( model_id varchar, content_type text, accept_type text, model_input text) Returns Varchar(MAX)

次の例は、invoke_model を使用して Bedrock の Anthropic Claude 2 モデルを呼び出す方法を示しています。

SELECT aws_bedrock.invoke_model ( 'anthropic.claude-v2', -- model_id 'application/json', -- content_type 'application/json', -- accept_type '{"prompt": "\n\nHuman: You are a helpful assistant that answers questions directly and only using the information provided in the context below. \nDescribe the answerin detail.\n\nContext: %s \n\nQuestion: %s \n\nAssistant:","max_tokens_to_sample":4096,"temperature" :0.5,"top_k":250,"top_p":0.5,"stop_sequences":[]}' -- model_input );
例 : aws_comprehend.detect_sentiment – Amazon Comprehend 関数を使用したシンプルなクエリ
aws_comprehend.detect_sentiment( input_text varchar, language_code varchar, max_rows_per_batch int) Returns table (sentiment varchar, confidence real)

次の例は、Amazon Comprehend サービスを呼び出す方法を示しています。

select sentiment from aws_comprehend.detect_sentiment('This is great', 'en');
例 : aws_sagemaker.invoke_endpoint – Amazon SageMaker 関数を使用したシンプルなクエリ
aws_sagemaker.invoke_endpoint( endpoint_name varchar, max_rows_per_batch int, VARIADIC model_input "any") -- Babelfish inherits PG's variadic parameter type Rerurns Varchar(MAX)

model_input は VARIADIC としてマークされ、型が「any」であるため、ユーザーは任意の長さと任意のデータ型のリストをモデルへの入力として機能する関数に渡すことができます。次の例は、Amazon SageMaker サービスを呼び出す方法を示しています。

SELECT CAST (aws_sagemaker.invoke_endpoint( 'sagemaker_model_endpoint_name', NULL, arg1, arg2 -- model inputs are separate arguments ) AS INT) -- cast the output to INT

Aurora PostgreSQL での Aurora 機械学習の詳細については、「Aurora PostgreSQL で Amazon Aurora 機械学習を使用する」を参照してください。

制限事項

  • Babelfish では配列の作成を行えませんが、配列を表すデータは処理することができます。配列を返す aws_bedrock.invoke_model_get_embeddings のような関数を使用すると、結果は配列要素を含む文字列として返されます。