このトピックでは、外部テーブルを使用して暗号化された MaxCompute データをクエリする方法について説明します。
背景
MaxCompute では、Key Management Service (KMS) を使用してデータを暗号化して保存できます。MaxCompute は、企業が規制およびセキュリティコンプライアンスの要件を満たすための静的データ保護を提供します。このトピックでは、Hologres の外部テーブルを使用して MaxCompute の暗号化データをクエリする場合の制限事項と手順について説明します。
新しいメソッド: Common Table (推奨)
Hologres V3.2 以降では、簡素化された構成で Common Table を介して暗号化された MaxCompute データにアクセスできます。これらのバージョンでは、デフォルトキーまたは KMS キーで暗号化されたプロジェクトへのアクセスも可能です。詳細については、「Common Table チャネルを介して MaxCompute にアクセスする」をご参照ください。
Common Table の有効化
シナリオに基づいてチャネルを有効にできます。
セッションレベル
-- セッションレベルで有効にします。このコマンドは、クエリまたは DML 文と一緒に実行する必要があります。 SET hg_experimental_external_catalog_routing = 'odps:common_table,dlf:hqe';データベースレベル
-- データベースレベルで有効にします。 ALTER DATABASE <database name> SET hg_experimental_external_catalog_routing = 'odps:common_table,dlf:hqe';インスタンスレベル
-- インスタンスレベルで有効にします。 ALTER ROLE ALL SET hg_experimental_external_catalog_routing = 'odps:common_table,dlf:hqe';
従来のメソッド (非推奨)
このメソッドは V3.2 より前の Hologres バージョンに適用でき、KMS で暗号化されたデータへのアクセスをサポートします。ただし、構成が複雑なため、推奨されません。
制限事項
Hologres V1.1 以降でのみ、外部テーブルを使用して MaxCompute の暗号化データをクエリできます。Hologres インスタンスのバージョンが V1.1 より前の場合は、インスタンスをアップグレードするか、Hologres DingTalk グループに参加して、エンジニアにインスタンスのアップグレードを依頼してください。 Hologres インスタンスのアップグレード方法の詳細については、「インスタンスのアップグレード」をご参照ください。
Hologres インスタンスのバージョンが V1.3.31 より前の場合は、MaxCompute の暗号化データをクエリする前にバックエンド設定を追加する必要があります。 Hologres インスタンスのバージョンが V1.3.31 以降の場合は、バックエンド設定を追加する必要はありません。この機能を使用する場合は、Hologres インスタンスを V1.3.31 以降にアップグレードすることをお勧めします。詳細については、「インスタンスのアップグレード」をご参照ください。
暗号化された MaxCompute データのみをクエリできます。MaxCompute データを暗号化するためのカスタマーマスターキー (CMK) の作成には、次の種類のマテリアルを使用できます: CMK 作成時に KMS によって生成されるキーマテリアル、およびインポートされたキーマテリアル。DataWorks のデフォルトキーを使用して暗号化された MaxCompute データはクエリできません。
データをクエリすると、Hologres は KMS API オペレーションを呼び出して鍵情報を取得します。デフォルトでは、鍵情報は 24 時間キャッシュされます。
手順
カスタムポリシーを作成します。
Resource Access Management (RAM) コンソールにログインします。左側のナビゲーションウィンドウで、[権限] > [ポリシー] を選択します。[ポリシー] ページで、[ポリシーの作成] をクリックします。

[ポリシーの作成] ページで、[JSON] をクリックします。JSON タブで、コードエディタに次のスクリプトを入力し、[名前] を AliyunHologresEncryptionDefaultRolePolicy に設定します。

{ "Version": "1", "Statement": [ { "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey", "kms:DescribeKey" ], "Resource": "acs:kms:*:*:*/*", "Effect": "Allow" } ] }[OK] をクリックします。カスタムポリシーが作成されます。
RAM ロールを作成し、RAM ロールに権限を付与します。
RAM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[ロール] ページで、[ロールの作成] をクリックします。[ロールの作成] ページで、[プリンシパルタイプ] を [クラウドサービス] に、[プリンシパル名] を [Hologres] に設定します。
[OK] をクリックします。ダイアログで、[ロール名] フィールドに
AliyunHologresEncryptionDefaultRoleを入力し、[OK] をクリックします。
ロールの詳細ページで、[権限の付与] をクリックします。
[権限の付与] パネルで、[リソーススコープ] を [アカウント] に設定します。[ポリシー] には、ステップ 1 で作成したカスタムポリシー
AliyunHologresEncryptionDefaultRolePolicyを選択します。
[権限の付与] をクリックします。
ロールの詳細ページで、[信頼ポリシー] タブをクリックして信頼ポリシーの設定を確認します。
データベースの設定を変更します。
Hologres Query Engine (HQE) では、MaxCompute の暗号化データにアクセスできません。そのため、次の SQL ステートメントを実行して、外部テーブルのクエリエンジン (QE) を Seahawks Query Engine (SQE) に変更する必要があります。
ALTER DATABASE <dbname> SET hg_experimental_enable_access_odps_orc_via_holo = false;前述の構成は、接続を再作成した後にのみ有効になります。次の SQL 文を実行して、SQE を使用して外部テーブルをクエリする構成が有効になっているかどうかを確認できます。
falseが表示された場合、構成は有効です。SHOW hg_experimental_enable_access_odps_orc_via_holo;暗号化データをクエリします。
上記の手順が完了したら、Hologres の外部テーブルを使用して、MaxCompute の通常のデータをクエリするのと同じ方法で、MaxCompute の暗号化データをクエリできます。詳細については、「Hologres で外部テーブルを作成して MaxCompute データのクエリを高速化する」をご参照ください。
FAQ
問題の説明
データをクエリすると、次のようなエラーメッセージが返されます。
ERROR: status { code: SERVER_INTERNAL_ERROR message: "hos_exception: IO error: Failed to execute pangu open normal file pangu://xxx:xxx/product/odps/xxx/data/xxxx/xxx/xxx, errorcode: 9, errorcode_description: invalid argument, err_msg: PanguParameterInvalidException原因
HQE を使用して MaxCompute の暗号化データをクエリしています。HQE では、MaxCompute の暗号化データにアクセスできません。
解決策
外部テーブルの QE を SQE に変更し、データベースの設定を変更します。
SQL ステートメント:
ALTER DATABASE <DB_Name> SET hg_experimental_enable_access_odps_orc_via_holo = false;上記の構成は、接続を作成した後にのみ有効になります。次の SQL ステートメントを実行して、SQE を使用して外部テーブルをクエリする構成が有効になっているかどうかを確認できます。false が表示された場合、構成は有効になっています。
SHOW hg_experimental_enable_access_odps_orc_via_holo;構成が有効になったら、MaxCompute の暗号化データを再度クエリします。