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