S3 互換オブジェクト ストレージの外部データにアクセスするように PolyBase を構成する

適用対象: SQL Server 2022 (16.x)

この記事では、PolyBase を使用して、S3 互換オブジェクト ストレージ内の外部データのクエリを実行する方法について説明します。

SQL Server 2022 (16.x) では、S3 互換オブジェクト ストレージに接続する機能が導入されています。認証には、基本認証とパススルー承認 (STS 承認とも呼ばれます) の 2 つのオプションがあります。

基本認証 (静的資格情報とも呼ばれます) では、ユーザーが access key idsecret key id を SQL Server に保存する必要があります。必要に応じて、ユーザーは資格情報を明示的に取り消してローテーションします。 きめ細かいアクセス制御では、管理者はログインごとに静的な資格情報を設定する必要があります。この方法は、数十または数百の一意の資格情報を処理する場合に困難な場合があります。

パススルー (STS) 承認は、SQL Server 独自のユーザーの ID を使用して S3 互換オブジェクト ストレージにアクセスできるようにすることで、これらの問題を解決します。 S3 互換オブジェクト ストレージには、Secure Token Service (STS) を使用することにより一時的な資格情報を割り当てる機能があります。 これらの資格情報は短期的で、動的に生成されます。

この記事には、基本認証とパススルー承認 (STS 承認) の両方の手順が含まれています。

前提条件

S3 互換オブジェクト ストレージ統合機能を使用するには、次のツールとリソースが必要です。

  • SQL Server の PolyBase 機能をインストールします。
  • SQL Server Management Studio (SSMS) または Azure Data Studio をインストールします。
  • S3 互換ストレージ。
  • 作成されている S3 バケット。 SQL Server からバケットを作成または構成することはできません。
  • ユーザー (Access Key ID) とユーザーに知られているシークレット (Secret Key ID)。 両方を S3 オブジェクト ストレージ エンドポイントに対して認証する必要があります。
  • 参照特権に対応する S3 ユーザーの ListBucket アクセス許可。
  • 読み取り特権に対応する S3 ユーザーの ReadOnly アクセス許可。
  • 書き込み特権に対応する S3 ユーザーの WriteOnly アクセス許可。
  • トランスポート層セキュリティ (TLS) を構成する必要があります。 すべての接続が HTTP ではなく HTTPS 経由で安全に送信されることを前提としています。 エンドポイントは、SQL Server OS ホストにインストールされている証明書によって検証されます。 TLS と認定資格証の詳細については、「データベース エンジンへの暗号化接続の有効化」を参照してください。

アクセス許可

プロキシ ユーザーが S3 バケットのコンテンツを読み取るには、ユーザーが S3 エンドポイントに対して次のアクションを実行できるようにする必要があります。

  • AWS S3 で、カスタム役割を作成し、S3 API にアクセスが必要な状態を具体的に指定します。
    • バックアップには、ListBucket (参照)、PutObject (書き込み - バックアップ用) のアクセス許可が必要です。
    • 復元には、ListBucket (参照)、GetObject (読み取り - 復元用)、GetObject (読み取り - 復元用) のアクセス許可が必要です。
  • 他の S3 互換ストレージの場合:
    • バックアップには、ユーザー (Access Key ID) に ListBucketWriteOnly の両方のアクセス許可が必要です。
    • 復元では、ユーザー (Access Key ID) に ListBucketReadOnly の両方のアクセス許可が必要です。

PolyBase を有効にする

  1. sp_configure で PolyBase を有効にする:

    EXEC sp_configure @configname = 'polybase enabled', @configvalue = 1;
    GO
    RECONFIGURE
    GO
    
  2. 設定を確認します。

    EXEC sp_configure @configname = 'polybase enabled';
    

認証

続行するには、基本認証またはパススルー (STS) 承認を選択します。

基本認証

データベース スコープ資格情報を作成する前に、ユーザー データベースに資格情報を保護するためのマスター キーが必要です。 詳細については、「CREATE MASTER KEY」を参照してください。

基本認証を使用してデータベース スコープの資格情報を作成する

次のサンプル スクリプトでは、SQL Server インスタンスの database_name データベースにデータベース スコープの認証情報 s3-dc を作成します。 詳細については、「CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)」を参照してください。

USE [database_name];
GO
IF NOT EXISTS(SELECT * FROM sys.database_scoped_credentials WHERE name = 's3_dc')
BEGIN
 CREATE DATABASE SCOPED CREDENTIAL s3_dc
 WITH IDENTITY = 'S3 Access Key',
 SECRET = '<AccessKeyID>:<SecretKeyID>' ;
END
GO

sys.database_scoped_credentials (Transact-SQL) を使用して、新しいデータベース スコープ資格情報を確認します。

SELECT * FROM sys.database_scoped_credentials;

基本認証を使用して外部データ ソースを作成する

次のサンプル スクリプトでは、SQL Server のソース ユーザー データベースに外部データ ソース s3_ds を作成します。 外部データ ソースは、s3_dc データベース スコープの資格情報を参照します。 詳しくは、「CREATE EXTERNAL DATA SOURCE」をご覧ください。

CREATE EXTERNAL DATA SOURCE s3_ds
WITH
(   LOCATION = 's3://<ip_address>:<port>/'
,   CREDENTIAL = s3_dc
);
GO

sys.external_data_sources を使用して新しい外部データ ソースを確認します。

SELECT * FROM sys.external_data_sources;

基本認証の制限事項

  1. S3 互換のオブジェクト ストレージの場合、ユーザーは : 文字を含めてアクセス キー ID を作成することはできません。
  2. URL の長さは 259 文字に制限されます。 つまり、s3://<hostname>/<objectkey> を 259 文字以内にする必要があります。 s3:// は制限に対してカウントされるため、パスの長さは 259 - 5 = 254 文字を超えることはできません。
  3. SQL 資格情報名は、UTF-16 形式では 128 文字までに制限されています。
  4. 作成される資格情報名には、この資格情報が新しい外部データ ソース用でない限り、バケット名を含める必要があります。
  5. アクセス キー ID とシークレット キー ID には、英数字のみを含める必要があります。

パススルー (STS) 承認

S3 互換オブジェクト ストレージには、Secure Token Service (STS) を使用して一時的な資格情報を割り当てる機能があります。 これらの資格情報は短期的で、動的に生成されます。

パススルー承認は、OpenID Connect (OIDC) ID プロバイダーとして機能する Active Directory フェデレーション サービス (ADFS) に依存します。S3 互換のオブジェクト ストレージ STS と通信し、STS を要求し、それを SQL Server に返すのは、ADFS が行います。

SQL Server でパススルー (STS) 承認を使用する

  1. SQL Server と S3 互換ホスト サーバーの間に認定資格証のある TLS を構成する必要があります。 すべての接続が HTTP ではなく HTTPS 経由で安全に送信されることを前提としています。 エンドポイントは、SQL Server OS ホストにインストールされている証明書によって検証されます。 公開証明書や自己署名証明書はサポートされていません。

  2. S3 互換オブジェクト ストレージに ID を渡すために使用するデータベース スコープの資格情報を作成します。 詳細については、「CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)」を参照してください。 次の例のようになります。

    CREATE DATABASE SCOPED CREDENTIAL CredName
    WITH IDENTITY = 'User Identity'
    
  3. S3 互換オブジェクト ストレージにアクセスするための外部データ ソースを作成します。 ADFS と STS の両方に必要な情報を通知するには、JSON 形式として CONNECTION_OPTIONS を使用します。 詳しくは、「CREATE EXTERNAL DATA SOURCE」をご覧ください。 次の例のようになります。

    CREATE EXTERNAL DATA SOURCE EdsName
    WITH
    {
        LOCATION = 's3://<hostname>:<port>/<bucket_name>'
        , CREDENTIAL = <CredName>
        [ , CONNECTION_OPTIONS = ' {
            [ , "authorization": {
                    "adfs": {
                        "endpoint": "http[s]://hostname:port/servicepath",
                        "relying_party": "SQL Server Relying Party Identifier"
                    },
                    "sts": {
                        "endpoint": "http[s]://hostname:port/stspath",
                        "role_arn": "Role Arn"
                        [ , "role_session_name": "AD user login" ] -- default value if not provided
                        [ , "duration_seconds": 3600 ]             -- default value if not provided
                        [ , "version": "2011-06-15" ]              -- default value if not provided
                        [ , "request_parameters": "In request query string format" ]
                    }
                } ]
            [ , "s3": {
                "url_style": "Path"
                } ]
        }' ]
    }
    
  • ADFS オプションでは、ADFS の Windows 転送エンドポイントと SQL Server の relying_party 識別子を指定します。
  • STS オプションでは、S3 互換オブジェクト ストレージ STS エンドポイントと AssumeRoleWithWebIdentity 要求のパラメーターを指定します。 AssumeRoleWithWebIdentity は、認証に使用される一時的なセキュリティ資格情報を取得するために使用されるメソッドです。 省略可能なパラメーターを含むパラメーターの完全な一覧と、既定値に関する情報については、「STS API リファレンス」を参照してください。

Active Directory でパススルー (STS) 承認を使用する

  • S3 互換ストレージへのパススルーを許可するために、AD の SQL Server ユーザー アカウントのプロパティを機密ではないとマークします。
  • SQL Server SPN (サービス プリンシパル名) に関連するユーザーに対して、ADFS サービスへの Kerberos の制約付き委任を許可します。

Active Directory フェデレーション サービスでパススルー (STS) 承認を使用する

  • SQL Server を Active Directory のクレーム プロバイダー信頼に設定できるようにします。
  • ADFS の認証方法としてイントラネット Windows 認証を許可します。
  • イントラネットで Windows 転送サービス エンドポイントを有効にします。
  • OIDC (OpenID Connect) エンドポイントを有効にします。
  • SQL Server を証明書利用者信頼として登録します。
    • 一意識別子を指定します。
    • JWT (JSON Web Token) の要求ルールを設定します。
  • カスタム要求 - これらの要求は、ストレージ側のアクセス ポリシーを決定するために必要な場合に、顧客が追加できます。
  • ベンダー固有の詳細情報については、S3 互換プラットフォーム プロバイダーに問い合わせてください。

S3 互換オブジェクト ストレージでパススルー (STS) 承認を使用する

  • S3 互換ストレージ プロバイダーから提供されるドキュメントに従って、外部 OIDC ID プロバイダーを設定します。 ID プロバイダーを設定するには、ほとんどの場合、次の値が必要です。

    • OIDC プロバイダーの構成エンドポイント。
    • OIDC プロバイダーのサムプリント。
    • S3 互換オブジェクト ストレージへのパススルー承認

パススルー (STS) 承認の制限事項

  • Windows 認証を使用した SQL Server ログインでは、S3 互換オブジェクト ストレージへのパススルー認証 (STS) がサポートされます。
  • S3 互換オブジェクト ストレージの BACKUP to URL には STS トークンを使用できません。
  • ADFS と SQL Server は同じドメインに存在する必要があります。 エクストラネットから ADFS Windows 転送エンドポイントを無効にする必要があります。
  • ADFS には、要求信頼プロバイダーとしての SQL Server と同じ AD (Active Directory) が必要です。
  • S3 互換ストレージには、クライアントが外部 ID の JWT を使用して一時的な資格情報を要求できるようにする STS エンドポイント サービスが必要です。
  • OPENROWSET および CETAS (Select として外部テーブルを作成する) クエリは、Parquet と CSV 形式でサポートされます。
  • 既定では、Kerberos チケットの更新期間は 7 日間で、有効期間は Windows では 10 時間、Linux では 2 時間です。 SQL Server は、ユーザーの Kerberos トークンを最大 7 日間更新します。 7 日後にユーザーのチケットの有効期限が切れるので、S3 互換ストレージへのパススルーは失敗します。 この場合、SQL Server は、新しい Kerberos チケットを取得するためにユーザーを再認証する必要があります。
  • Windows Server 2019 での ADFS 2019 がサポートされます。
  • S3 REST API 呼び出しでは、AWS シグネチャ バージョン 4 が使用されます。