設定 PolyBase 以存取 S3 相容物件儲存體中的外部資料
適用於:SQL Server 2022 (16.x)
本文說明如何使用 PolyBase,查詢位於 S3 相同物件儲存體中的外部資料。
SQL Server 2022 (16.x) 引進連線到任何 S3 相容物件儲存體的能力,有兩個可用的驗證選項:基本驗證或傳遞授權 (也稱為 STS 授權)。
基本驗證 (也稱為靜態認證) 需要使用者將 access key id
和 secret key id
儲存在 SQL Server 中,使用者可視需要明確撤銷和輪替認證。 精細的存取控制需要系統管理員為每個登入設定靜態認證,在處理數十或數百個唯一認證時,這種方法可能很有挑戰。
傳遞 (STS) 授權提供這些問題的解決方案,方法是使用 SQL Server 自己的使用者身分識別來存取 S3 相容物件儲存體。 S3 相容物件儲存體能夠透過使用 Security 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)。 假設所有連線皆會透過 HTTPS 而非 HTTP 進行安全傳輸。 端點將會由安裝在 SQL Server OS 主機上的憑證進行驗證。 如需 TLS 和憑證詳細資訊,請參閱啟用資料庫引擎的加密連線。
權限
為了讓 Proxy 使用者能夠讀取 S3 貯體的內容,使用者 (Access Key ID
) 必須允許針對 S3 端點執行下列動作:
- 需要 GetBucketLocation 和 GetObject 權限,才能從 S3 物件儲存體讀取特定檔案。
- 指向 S3 資料夾位置的外部資料表或 OPENROWSET 查詢需要 ListBucket,而非單一檔案。 如果沒有 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.
- 指向 S3 資料夾位置的外部資料表或 OPENROWSET 查詢需要 ListBucket,而非單一檔案。 如果沒有 ListBucket 權限,您會接收到錯誤
- 需要 PutObject 權限才能寫入 S3 物件儲存體。
提示
您的 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 相容儲存系統(例如 Amazon Web Services)會利用 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 相容物件儲存體,不允許客戶建立其中含
:
字元的存取金鑰識別元。 - URL 總長度會限制在 259 個字元內。 這表示
s3://<hostname>/<objectkey>
不應超過 259 個字元。s3://
會計入此限制,因此路徑長度不能超過 259-5 = 254 個字元。 - 在 UTF-16 格式中,SQL 認證名稱受制於 128 個字元。
- 除非此認證適用於新的外部資料來源,否則所建立的認證名稱必須包含貯體名稱。
- 存取金鑰識別碼和秘密金鑰識別碼只能包含英數字元值。
傳遞 (STS) 授權
S3 相容物件儲存體能夠透過使用 Security Token Service (STS) 來指派暫時認證。 這些認證是短期且動態產生的。
傳遞授權依賴 Active Directory 同盟服務 (ADFS) 做為 OpenID Connect (OIDC) 識別提供者,由 ADFS 與 S3 相容物件儲存體 STS 通訊、要求 STS,並將它提供回給 SQL Server。
在 SQL Server 上使用傳遞 (STS) 授權
必須使用 SQL Server 與 S3 相容主機伺服器之間的憑證設定 TLS。 假設所有連線皆會透過 HTTPS 而非 HTTP 進行安全傳輸。 端點將會由安裝在 SQL Server OS 主機上的憑證進行驗證。 不支援公開或自我簽署憑證。
建立資料庫範圍認證,用來將身分識別傳遞至 S3 相容物件儲存體。 如需詳細資訊,請參閱 CREATE DATABASE SCOPED CREDENTIAL (Transact-SQL)。 下列範例:
CREATE DATABASE SCOPED CREDENTIAL CredName WITH IDENTITY = 'User Identity'
建立外部資料來源以存取 S3 相容物件儲存體。 使用
CONNECTION_OPTIONS
做為 JSON 格式,以通知 ADFS 和 STS 的必要資訊。 如需詳細資訊,請參閱 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 中 SQL Server 的 Windows 傳輸端點和relying_party
識別碼。STS
選項會針對AssumeRoleWithWebIdentity
要求指定 S3 相容物件儲存體 STS 端點和參數。AssumeRoleWithWebIdentity
是用來取得用來驗證之暫存安全性認證的方法。 如需參數的完整清單,包括選擇性參數,以及預設值的相關資訊,請參閱 STS API 參照。
使用傳遞 (STS) 授權搭配 Active Directory
- 將 AD 中的 SQL Server 使用者帳戶屬性標示為非敏感性,以允許傳遞至 S3 相容儲存體。
- 針對與 SQL Server SPN (服務主體名稱) 相關的使用者,允許對 ADFS 服務的 Kerberos 限制委派。
使用傳遞 (STS) 授權搭配 Active Directory 同盟服務
- 讓 SQL Server 成為 Active Directory 中的宣告提供者信任。
- 允許內部網路 Windows 驗證作為 ADFS 的驗證方法。
- 在您的內部網路中啟用 Windows 傳輸服務端點。
- 啟用 OIDC (OpenID Connect) 端點。
- 將 SQL Server 註冊為信賴憑證者信任。
- 提供唯一識別碼。
- 設定 JWT (JSON Web 權杖) 的宣告規則。
- 自訂宣告 - 如果需要這些宣告來決定儲存體端的存取原則,客戶可以新增這些宣告。
- 如需更多廠商特定的資訊,請洽詢您的 S3 相容平台提供者。
在 S3 相容物件儲存體上使用傳遞 (STS) 授權
請遵循 S3 相容儲存體提供者所提供的文件,設定外部 OIDC 識別提供者。 若要設定識別提供者,通常需要下列值。
- OIDC 提供者的設定端點。
- OIDC 提供者的指紋。
- 傳遞授權至 S3 相容物件儲存體
傳遞 (STS) 授權的限制
- SQL Server 使用 Windows 驗證登入,支援授權 (STS) 傳遞至 S3 相容物件儲存體。
- STS 權杖無法用於備份至 S3 相容物件儲存體的 URL。
- ADFS 和 SQL Server 必須位於相同的網域中。 應該從外部網路停用 ADFS Windows 傳輸端點。
- ADFS 應該具有與宣告信任提供者相同的 AD (Active Directory) 即 SQL Server 。
- S3 相容儲存體應該具有 STS 端點服務,可讓用戶端使用外部身分識別的 JWT 要求暫時認證。
- OPENROWSET 和 CETAS (Create External Table as Select) 查詢會支援 Parquet 和 CSV 格式。
- 根據預設,Kerberos 票證更新時間是七天,存留期在 Windows 上為 10 小時,在 Linux 上為 2 小時。 SQL Server 可更新使用者最多 7 天的 Kerberos 權杖。 七天之後,使用者的票證會到期,因此傳遞至 S3 相容儲存體會失敗。 在此情況下,SQL Server 需要重新驗證使用者,才能取得新的 Kerberos 票證。
- 支援使用 Windows Server 2019 的 ADFS 2019。
- S3 REST API 呼叫使用 AWS 簽章第 4 版。
Linux 上的 SQL Server 上的 PolyBase
針對 Linux 上的 SQL Server 上的PolyBase,需要更多設定。
- 您必須設定 TLS。 假設所有連線會透過 HTTPS 而非 HTTP 安全傳輸。 端點將會由安裝在 SQL Server OS 主機上的憑證進行驗證。
- Linux 上的憑證管理不同。 檢閱並遵循 Linux 中針對 S3 相容儲存體所詳述的設定。