次の方法で共有


Azure Database for PostgreSQL フレキシブル サーバーの Azure Storage 拡張機能のクイック スタート例

適用対象: Azure Database for PostgreSQL - フレキシブル サーバー

Azure Storage 拡張機能の使用方法を学習するのに役立つ例の一覧を次に示します。

Azure Storage アカウントを作成し、データを設定する

  1. Azure Storage アカウントを作成します。 Azure Storage アカウントを作成するには、まだお持ちでない場合は、 <resource_group><location><account_name><container_name>の値をカスタマイズし、次の Azure CLI コマンドを実行します。
    random_suffix=$(tr -dc 'a-z0-9' </dev/urandom | head -c8)
    resource_group="resource-group-$random_suffix"
    location="eastus2"
    storage_account="storageaccount$random_suffix"
    blob_container="container-$random_suffix"
    az group create --name $resource_group --location $location
    az storage account create --resource-group $resource_group --name $storage_account --location $location --sku Standard_LRS --kind BlobStorage --public-network-access enabled --access-tier hot
    echo "Take note of the storage account name, which you'll have to replace in subsequent examples, whenever you find a reference to <account_name>:"
    echo $storage_account
    echo "Take note of the container name, which you'll have to replace in subsequent examples, whenever you find a reference to <container_name>:"
    echo $blob_container
    
  2. BLOB コンテナーを作成します。 BLOB コンテナーを作成するには、次の Azure CLI を実行します。
    az storage container create --account-name $storage_account --name $blob_container -o tsv
    
  3. ストレージ アカウントに割り当てられている 2 つのアクセス キーのいずれかをフェッチします。 後の手順で azure_storage.account_add の引数として渡す必要があるため、必ずaccess_keyの値をコピーしてください。 2 つのアクセス キーの 1 つ目をフェッチするには、次の Azure CLI コマンドを実行します。
    access_key=$(az storage account keys list --resource-group $resource_group --account-name $storage_account --query [0].value)
    echo "Following is the value of your access key:"
    echo $access_key
    
  4. 例で使用したデータ セットを含むファイルをダウンロードし、BLOB コンテナーにアップロードします。 データ セットを含むファイルをダウンロードするには、次の Azure CLI コマンドを実行します。
    mkdir --parents azure_storage_examples
    cd azure_storage_examples
    curl -O https://examples.citusdata.com/tutorial/events.csv
    gzip -k events.csv
    cp events.csv events_blob_without_extension
    cp events.csv events_pipe.csv
    cp events.csv.gz events_compressed
    sed -i 's/,/|/g' events_pipe.csv
    az storage blob upload-batch --account-name $storage_account --destination $blob_container --source . --pattern "events*" --account-key $access_key --overwrite --output none --only-show-errors
    

特定のストレージ アカウントに格納されているコンテナーまたは BLOB を一覧表示できますが、postgreSQL ユーザーまたはロールに、 azure_storage.account_user_add を使用して、そのストレージ アカウントへの参照に対するアクセス許可が付与されている場合に限ります。 azure_storage_admin ロールのメンバーには、azure_storage.account_add を使用して追加されたすべての Azure Storage アカウントに対して、この特権が付与されます。 既定では、 azure_pg_admin のメンバーにのみ azure_storage_admin ロールが付与されます。

データが読み込まれるテーブルを作成する

ストレージ アカウントにアップロードした CSV ファイルの内容をインポートするテーブルを作成しましょう。 これを行うには、 PgAdminpsql、または好みのクライアントを使用して Azure Database for PostgreSQL フレキシブル サーバーのインスタンスに接続し、次のステートメントを実行します。

CREATE TABLE IF NOT EXISTS events
        (
         event_id bigint
        ,event_type text
        ,event_public boolean
        ,repo_id bigint
        ,payload jsonb
        ,repo jsonb
        ,user_id bigint
        ,org jsonb
        ,created_at timestamp without time zone
        );

拡張機能を使用できるように準備する

続行する前に、次の点を確認してください。

  1. 拡張機能のライブラリを読み込む
  2. 拡張機能を許可リストする
  3. 拡張機能を作成する

ストレージ アカウントのアクセス キーを追加する

この例では、ストレージ アカウントへの参照と、そのストレージ アカウントのアクセス キーを追加する方法を示します。このキーは、Azure Database for PostgreSQL フレキシブル サーバーのインスタンスで azure_storage 拡張機能によって提供される機能を介してそのコンテンツにアクセスするために必要です。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

同様に、 <access_key> は、ストレージ アカウントからフェッチした値に設定する必要があります。

SELECT azure_storage.account_add('<account_name>', '<access_key>');

ヒント

Azure portal からストレージ アカウント名とそのアクセス キーの 1 つを取得する場合は、ストレージ アカウントを検索し、リソース メニューで [アクセス キー] を選択し、ストレージ アカウント名をコピーして key1 セクションからキーをコピーします (最初にキーの横にある [表示] を選択する必要があります)。

Azure Blob Storage リファレンスでユーザーまたはロールへのアクセスを許可する

この例では、 <regular_user>という名前のユーザーまたはロールへのアクセスを許可する方法を示します。これにより、そのような PostgreSQL ユーザーは、 azure_storage 拡張機能を使用して、参照先の Azure ストレージ アカウントによってホストされているコンテナーに格納されている BLOB にアクセスできます。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

<regular_user> は、既存のユーザーまたはロールの名前に設定する必要があります。

SELECT * FROM azure_storage.account_user_add('<account_name>', '<regular_user>');

コンテナー内のすべての BLOB を一覧表示する

この例では、ストレージ アカウント <container_name>のコンテナー <account_name>内のすべての既存の BLOB を一覧表示する方法を示します。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

<container_name> は、BLOB コンテナーの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでblob_container環境変数に設定した値と一致する必要があります。

SELECT * FROM azure_storage.blob_list('<account_name>','<container_name>');

特定の名前プレフィックスを持つ BLOB を一覧表示する

この例では、<container_name>で始まるストレージ アカウント <account_name>のコンテナー <blob_name_prefix>内のすべての既存の BLOB を一覧表示する方法を示します。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

<container_name> は、BLOB コンテナーの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでblob_container環境変数に設定した値と一致する必要があります。

<blob_name_prefix> は、列挙された BLOB の名前に含めるプレフィックスに設定する必要があります。 すべての BLOB を返す場合は、このパラメーターを空の文字列に設定するか、このパラメーターの値を指定しないでください。この場合、値の既定値は空の文字列になります。

SELECT * FROM azure_storage.blob_list('<account_name>','<container_name>','<blob_name_prefix>');

または、次の構文を使用できます。

SELECT * FROM azure_storage.blob_list('<account_name>','<container_name>') WHERE path LIKE '<blob_name_prefix>%';

COPY FROM ステートメントを使用してデータをインポートする

次の例は、events.csv コマンドを使用して、Azure Storage アカウント <container_name>の BLOB コンテナー <account_name>に存在する COPY という名前の BLOB からのデータのインポートを示しています。

  1. ソース ファイルのスキーマに一致するテーブルを作成します。

    CREATE TABLE IF NOT EXISTS events
            (
             event_id bigint
            ,event_type text
            ,event_public boolean
            ,repo_id bigint
            ,payload jsonb
            ,repo jsonb
            ,user_id bigint
            ,org jsonb
            ,created_at timestamp without time zone
            );
    
  2. COPY ステートメントを使用して、ターゲット テーブルにデータをコピーします。 最初の行に列ヘッダーが含まれていることを指定します。

    COPY events
    FROM 'https://<account_name>.blob.core.windows.net/<container_name>/events.csv'
    WITH (FORMAT 'csv', header);
    
  3. 次の SELECT ステートメントを実行して、データがテーブルに読み込まれたことを確認します。

    SELECT *
    FROM events
    LIMIT 100;
    

COPY TO ステートメントを使用してデータをエクスポートする

次の例は、events コマンドを使用して、events_exported.csv という名前のテーブルから、Azure Storage アカウント <container_name>の BLOB コンテナー <account_name>に存在する COPY という名前の BLOB にデータをエクスポートする方法を示しています。

  1. ソース ファイルのスキーマに一致するテーブルを作成します。

    CREATE TABLE IF NOT EXISTS events
            (
             event_id bigint
            ,event_type text
            ,event_public boolean
            ,repo_id bigint
            ,payload jsonb
            ,repo jsonb
            ,user_id bigint
            ,org jsonb
            ,created_at timestamp without time zone
            );
    
  2. テーブルにデータを読み込みます。 INSERT ステートメントを実行して複数の合成行を設定するか、 COPY FROM ステートメントの例を使用してデータのインポートを使用 してサンプル データ セットの内容を設定します。

  3. COPY ステートメントを使用して、ターゲット テーブルにデータをコピーします。 最初の行に列ヘッダーが含まれていることを指定します。

    COPY events
    TO 'https://<account_name>.blob.core.windows.net/<container_name>/events_exported.csv'
    WITH (FORMAT 'csv', header);
    
  4. 次の SELECT ステートメントを実行して、BLOB がストレージ アカウントに存在することを確認します。

    SELECT * FROM azure_storage.blob_list('<account_name>','<container_name>') WHERE path = 'events_exported.csv';
    

BLOB からコンテンツを読み取る

blob_get関数は、events.csv ストレージの参照されるコンテナー <container_name>内の 1 つの特定の BLOB (この場合<account_name>) の内容を取得します。 blob_getがデータを解析する方法を知るために、NULL::table_name形式で値を渡すことができます。ここで、table_nameは、読み取られる BLOB のスキーマと一致するテーブルを参照します。 この例では、最初に作成した events テーブルを参照しています。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

<container_name> は、BLOB コンテナーの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでblob_container環境変数に設定した値と一致する必要があります。

<blob_name> は、読み取る内容を持つ BLOB の完全なパスに設定する必要があります。

SELECT * FROM azure_storage.blob_get
        ('<account_name>'
        ,'<container_name>'
        ,'events.csv'
        , NULL::events)
LIMIT 5;

または、blob_get関数の後に AS 句を使用して、結果のスキーマを明示的 定義することもできます。

SELECT * FROM azure_storage.blob_get('<account_name>','<container_name>','events.csv.gz')
AS res (
         event_id BIGINT
        ,event_type TEXT
        ,event_public BOOLEAN
        ,repo_id BIGINT
        ,payload JSONB
        ,repo JSONB
        ,user_id BIGINT
        ,org JSONB
        ,created_at TIMESTAMP WITHOUT TIME ZONE)
LIMIT 5;

BLOB から読み取られたコンテンツの読み取り、フィルター処理、および変更

この例では、SQL テーブルに読み込む前に、BLOB からインポートされたコンテンツをフィルター処理して変更する可能性を示します。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

<container_name> は、BLOB コンテナーの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでblob_container環境変数に設定した値と一致する必要があります。

SELECT concat('P-',event_id::text) FROM azure_storage.blob_get
        ('<account_name>'
        ,'<container_name>'
        ,'events.csv'
        , NULL::events)
WHERE event_type='PushEvent'
LIMIT 5;

カスタム オプション (ヘッダー、列区切り記号、エスケープ文字) を使用してファイルからコンテンツを読み取る

この例では、 options_copyの結果options 引数に渡すことで、カスタム区切り記号とエスケープ文字を使用する方法を示します。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

<container_name> は、BLOB コンテナーの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでblob_container環境変数に設定した値と一致する必要があります。

SELECT * FROM azure_storage.blob_get
        ('<account_name>'
        ,'<container_name>'
        ,'events_pipe.csv'
        ,NULL::events
        ,options := azure_storage.options_csv_get(delimiter := '|' , header := 'true')
        );

デコーダー オプションを使用する

この例では、 decoder オプションの使用方法を示します。 通常、形式はファイルの拡張子から推論されますが、ファイルの内容に一致する拡張子がない場合は、デコーダー引数を渡すことができます。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

<container_name> は、BLOB コンテナーの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでblob_container環境変数に設定した値と一致する必要があります。

SELECT * FROM azure_storage.blob_get
        ('<account_name>'
        ,'<container_name>'
        ,'events_blob_without_extension'
        , NULL::events
        , decoder := 'csv')
LIMIT 5;

デコーダー オプションで圧縮を使用する

この例では、名前が .gz 拡張子で終わらない gzip 圧縮 BLOB に対して gzip 圧縮の使用を強制する方法を示します。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

<container_name> は、BLOB コンテナーの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでblob_container環境変数に設定した値と一致する必要があります。

SELECT * FROM azure_storage.blob_get
        ('<account_name>'
        ,'<container_name>'
        ,'events_compressed'
        , NULL::events
        , decoder := 'csv'
        , compression := 'gzip')
LIMIT 5;

BLOB のコンテンツに対するコンピューティング集計

この例では、BLOB コンテナーに格納されている情報に対して集計操作を実行する方法を示します。BLOB の内容を PostgreSQL テーブルにインポートする必要はありません。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

<container_name> は、BLOB コンテナーの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでblob_container環境変数に設定した値と一致する必要があります。

SELECT event_type, COUNT(*) FROM azure_storage.blob_get
        ('<account_name>'
        ,'<container_name>'
        ,'events.csv'
        , NULL::events)
GROUP BY event_type
ORDER BY 2 DESC
LIMIT 5;

BLOB にコンテンツを書き込む

blob_put関数は、1 つの特定の BLOB (この場合eventscopy.csv) の内容を構成し、<container_name> ストレージの参照されるコンテナー <account_name>にアップロードします。 この例では、 blob_get を使用して 5 行のセットを作成し、 blob_put 集計関数に渡し、 eventscopy.csvという名前の BLOB としてアップロードします。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

<container_name> は、BLOB コンテナーの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでblob_container環境変数に設定した値と一致する必要があります。

SELECT azure_storage.blob_put
        ('<account_name>'
        ,'<container_name>'
        ,'eventscopy.csv'
        , top_5_events)
FROM (SELECT * FROM events) LIMIT 5) AS top_5_events;

Azure ストレージ アカウントへのすべての参照を一覧表示する

この例では、このデータベースで azure_storage 拡張機能が参照できる Azure ストレージ アカウントと、各ストレージ アカウントにアクセスするために使用される認証の種類、および azure_storage.account_user_add 関数を使用してアクセス許可が付与されているユーザーまたはロールを確認し、拡張機能によって提供される機能を使用してその Azure ストレージ アカウントにアクセスする方法を示します。

SELECT * FROM azure_storage.account_list();

Azure Blob Storage リファレンスのユーザーまたはロールからのアクセスを取り消す

この例では、 <regular_user>という名前のユーザーまたはロールからのアクセスを取り消して、そのような PostgreSQL ユーザーが azure_storage 拡張機能を使用して、参照先の Azure ストレージ アカウントによってホストされているコンテナーに格納されている BLOB にアクセスできないようにする方法を示します。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

<regular_user> は、既存のユーザーまたはロールの名前に設定する必要があります。

SELECT * FROM azure_storage.account_user_remove('<account_name>', '<regular_user>');

ストレージ アカウントへの参照を削除する

この例では、ストレージ アカウントへの参照を削除して、現在のデータベースのユーザーが azure_storage 拡張機能機能を使用してそのストレージ アカウントにアクセスできないようにする方法を示します。

<account_name> は、ストレージ アカウントの名前に設定する必要があります。 前のスクリプトを使用した場合、この値は、これらのスクリプトでstorage_account環境変数に設定した値と一致する必要があります。

SELECT azure_storage.account_remove('<account_name>');