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 for Aurora PostgreSQL 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 for Aurora PostgreSQL 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 for Aurora PostgreSQL DB クラスターにバケットへのアクセス許可が必要です。AWS Identity and Access Management (IAM) ロールを使用し、クラスターのそのロールに IAM ポリシーをアタッチすることをお勧めします。これを行うには、「IAM ロールを使用した Amazon S3 バケットへのアクセス」のステップに従います。

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

aws_s3 エクステンションがある Amazon S3 を Babelfish for Aurora PostgreSQL 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 for Aurora PostgreSQL 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 for Aurora PostgreSQL は JSON をサポートしていません。関数が JSON を返す場合、ラッパーを使用して JSON を処理します。例えば、前に示した lambda_function.py は、Lambda に my-function として保存されています。

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

  2. ラッパーを作成します。この例では、PostgreSQL の手続き言語を SQL PL/pgSQL に使用します。詳細については、「PL/pgSQL–SQL Procedural Language」(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 の開始方法」を参照してください。