S3 互換オブジェクト ストレージの外部データにアクセスするように PolyBase を構成する
適用対象: SQL Server 2022 (16.x)
この記事では、PolyBase を使用して、S3 互換オブジェクト ストレージ内の外部データのクエリを実行する方法について説明します。
SQL Server 2022 (16.x) では、S3 互換オブジェクト ストレージに接続する機能が導入されています。認証には、基本認証とパススルー承認 (STS 承認とも呼ばれます) の 2 つのオプションがあります。
基本認証 (静的資格情報とも呼ばれます) では、ユーザーが access key id
と secret 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 オブジェクト ストレージ エンドポイントに対して認証するには両方が必要です。 - トランスポート層セキュリティ (TLS) を構成する必要があります。 すべての接続が HTTP ではなく HTTPS 経由で安全に送信されることを前提としています。 エンドポイントは、SQL Server OS ホストにインストールされている証明書によって検証されます。 TLS と認定資格証の詳細については、「データベース エンジンへの暗号化接続の有効化」を参照してください。
アクセス許可
プロキシ ユーザーが S3 バケットのコンテンツを読み取るには、ユーザー (Access Key ID
) が S3 エンドポイントに対して次のアクションを実行できるようにする必要があります。
- S3 オブジェクト ストレージから特定のファイルを読み取るには、GetBucketLocation と GetObject のアクセス許可が必要です。
- ListBucket は、1 つのファイルではなく、S3 フォルダーの場所を指す外部テーブルまたは OPENROWSET クエリに必要です。 ListBucket のアクセス許可がないと、
Msg 4860, Level 16, State 7, Line 15 Cannot bulk load. The file "s3://<ip address>:9000/bucket/*.*" does not exist or you don't have file access rights.
というエラーを受け取ります
- ListBucket は、1 つのファイルではなく、S3 フォルダーの場所を指す外部テーブルまたは OPENROWSET クエリに必要です。 ListBucket のアクセス許可がないと、
- S3 オブジェクト ストレージに書き込むには PutObject アクセス許可が必要です。
ヒント
S3 互換のオブジェクト ストレージ プロバイダーでは、追加の API 操作のアクセス許可が必要な場合や、API 操作に対するアクセス許可を含むロールに別の名前を使用する場合があります。 製品ドキュメントを参照してください。
PolyBase を有効にする
sp_configure
で PolyBase を有効にする:EXEC sp_configure @configname = 'polybase enabled', @configvalue = 1; GO RECONFIGURE GO
設定を確認します。
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;
仮想ホスト URL
一部の S3 互換ストレージ システム (アマゾン ウェブ サービスなど) では、virtual_hosted
スタイルの URL を使用して S3 バケットにフォルダー構造を実装します。 次の CONNECTION_OPTIONS
を追加して、S3 バケット内のフォルダーの場所を指す外部テーブルを作成できるようにします (例: CONNECTION_OPTIONS = '{"s3":{"url_style":"virtual_hosted"}}'
)。
その CONNECTION_OPTIONS
設定がないと、フォルダーを指す外部テーブルに対してクエリを実行する時に、次のエラーが発生する可能性があります。
Msg 13807, Level 16, State 1, Line 23
Content of directory on path '/<folder_name>/' cannot be listed.
基本認証の制限事項
- S3 互換のオブジェクト ストレージの場合、ユーザーは
:
文字を含めてアクセス キー ID を作成することはできません。 - URL の長さは 259 文字に制限されます。 つまり、
s3://<hostname>/<objectkey>
を 259 文字以内にする必要があります。s3://
は制限に対してカウントされるため、パスの長さは 259 - 5 = 254 文字を超えることはできません。 - SQL 資格情報名は、UTF-16 形式では 128 文字までに制限されています。
- 作成される資格情報名には、この資格情報が新しい外部データ ソース用でない限り、バケット名を含める必要があります。
- アクセス キー ID とシークレット キー ID には、英数字のみを含める必要があります。
パススルー (STS) 承認
S3 互換オブジェクト ストレージには、Secure Token Service (STS) を使用することにより一時的な資格証明を割り当てる機能があります。 これらの資格情報は短期的で、動的に生成されます。
パススルー承認は、OpenID Connect (OIDC) ID プロバイダーとして機能する Active Directory フェデレーション サービス (ADFS) に依存します。S3 互換のオブジェクト ストレージ STS と通信し、STS を要求し、それを SQL Server に返すのは、ADFS が行います。
SQL Server でパススルー (STS) 承認を使用する
SQL Server と S3 互換ホスト サーバーの間に認定資格証のある TLS を構成する必要があります。 すべての接続が HTTP ではなく HTTPS 経由で安全に送信されることを前提としています。 エンドポイントは、SQL Server OS ホストにインストールされている証明書によって検証されます。 公開証明書や自己署名証明書はサポートされていません。
S3 互換オブジェクト ストレージに ID を渡すために使用するデータベース スコープの資格情報を作成します。 詳細については、「CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)」を参照してください。 次の例のようになります。
CREATE DATABASE SCOPED CREDENTIAL CredName WITH IDENTITY = 'User Identity'
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 チケットを取得するためにユーザーを再認証する必要があります。
- ADFS 2019 は Windows Server 2019 でサポートされます。
- S3 REST API 呼び出しでは、AWS シグネチャ バージョン 4 が使用されます。
SQL Server on Linux 上の PolyBase
SQL Server on Linux で PolyBase を利用する場合、より多くの構成が必要になります。
- TLS を構成する必要があります。 すべての接続が HTTP ではなく HTTPS 経由で安全に送信されることを前提としています。 エンドポイントは、SQL Server OS ホストにインストールされている証明書によって検証されます。
- Linux では証明書の管理が異なります。 S3 互換ストレージの Linux サポートで詳しく説明されている構成を確認し、それに従ってください。