Apache Polarisとの統合
データレイク技術が進化を続ける中、オブジェクトストレージ(AWS S3など)上の大量のデータを効率的かつ安全に管理し、上流の分析エンジン(Apache Dorisなど)に統一されたアクセスポイントを提供することは、現代のデータアーキテクチャにおける中核的な課題となっています。Apache PolarisはIcebergのオープンで標準化されたREST Catalogサービスとして、この課題に対する完璧なソリューションを提供します。これは一元的なメタデータ管理を処理するだけでなく、きめ細かなアクセス制御と柔軟な認証情報管理メカニズムを通じて、データレイクのセキュリティと管理性を大幅に向上させます。
本記事では、Apache DorisとPolarisを統合してS3上のIcebergデータの効率的なクエリと管理を実現する方法について詳細に紹介します。環境準備から最終的なクエリまでの全プロセスを段階的にガイドします。
この文書を通じて、以下を迅速に学習できます:
-
AWS環境準備: AWSでS3ストレージバケットを作成・設定し、PolarisとDorisの両方に必要なIAMロールとポリシーを準備する方法。PolarisがS3に直接アクセスし、Dorisにアクセス認証情報を配布できるようにします。
-
Polarisのデプロイと設定: サーバー上でPolarisサービスをダウンロード・起動し、PolarisでIceberg カタログ、Namespace、対応するPrincipal/Role/権限を作成してDorisに安全なメタデータアクセスエンドポイントを提供する方法。
-
DorisのPolarisへの接続: DorisがOAuth2を通じてPolarisからメタデータアクセストークンを取得する方法を説明し、2つのコア基盤ストレージアクセス方法を実証します:
- Polarisが発行する一時的なAK/SK(Credential Vendingメカニズム)
- Dorisが静的なAK/SKを直接使用してS3にアクセス
Dorisバージョン3.1+が必要
1. AWS環境準備
開始する前に、AWS上でS3ストレージバケットと対応するIAMロールを準備する必要があります。これはPolarisがデータを管理し、Dorisがデータにアクセスするための基盤となります。
1.1 S3ストレージバケットの作成
まず、後で作成するIcebergTableデータを保存するために、polaris-doris-demoという名前のS3 Bucketを作成します。
# Create S3 storage bucket
aws s3 mb s3://polaris-doris-demo --region us-west-2
# Verify bucket creation success
aws s3 ls | grep polaris-doris-demo
1.2 Object Storage アクセス用 IAM Role の作成
安全な認証情報管理を実装するため、Polaris が STS AssumeRole メカニズムを通じて使用する IAM role を作成する必要があります。この設計は、最小権限の原則と職務の分離というセキュリティのベストプラクティスに従っています。
-
trust policy ファイルの作成
polaris-trust-policy.jsonファイルを作成します:cat > polaris-trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::YOUR_ACCOUNT_ID:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "polaris-doris-demo"
}
}
}
]
}
EOF
注意: YOUR_ACCOUNT_IDを実際のAWS Account IDに置き換えてください。AWS Account IDは
aws sts get-caller-identity --query Account --output textで取得できます。
-
IAM Roleを作成する
aws iam create-role \
--role-name polaris-doris-demo \
--assume-role-policy-document file:///path/to/polaris-trust-policy.json \
--description "IAM Role for Polaris to access S3 storage" -
S3アクセス許可ポリシーをアタッチする
aws iam attach-role-policy \
--role-name polaris-doris-demo \
--policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess -
作成結果を確認する
aws iam get-role --role-name polaris-doris-demo
aws iam list-attached-role-policies --role-name polaris-doris-demo
1.3 IAM ロールをEC2インスタンスにバインド(オプション)
この手順を実行しない場合、Polarisを開始する前にAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを設定する必要があります
PolarisサービスがEC2インスタンス上で実行される場合、アクセスキーを使用するよりも、そのEC2インスタンスにIAMロールをバインドすることがベストプラクティスです。これにより、コード内に認証情報をハードコーディングすることを避け、セキュリティが向上します。
-
EC2インスタンスロール用の信頼ポリシーを作成
まず、EC2サービスがこのロールを引き受けることを許可する信頼ポリシーファイルを作成します:
cat > ec2-trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF -
EC2インスタンスロールを作成する
aws iam create-role \
--role-name polaris-ec2-role \
--assume-role-policy-document file:///path/to/ec2-trust-policy.json \
--description "IAM Role for EC2 instance running Polaris service" -
S3アクセス許可ポリシーをアタッチする
# Attach AmazonS3FullAccess managed policy
aws iam attach-role-policy \
--role-name polaris-ec2-role \
--policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess -
インスタンスプロファイルを作成する
# Create instance profile
aws iam create-instance-profile \
--instance-profile-name polaris-ec2-instance-profile
# Add role to instance profile
aws iam add-role-to-instance-profile \
--instance-profile-name polaris-ec2-instance-profile \
--role-name polaris-ec2-role -
instance profileをEC2インスタンスにアタッチする
# If it's a newly created EC2 instance, specify during launch
aws ec2 run-instances \
--image-id ami-xxxxxxxxx \
--instance-type t3.medium \
--iam-instance-profile Name=polaris-ec2-instance-profile \
--other-parameters...
# If it's an existing EC2 instance, associate instance profile
aws ec2 associate-iam-instance-profile \
--instance-id i-xxxxxxxxx \
--iam-instance-profile Name=polaris-ec2-instance-profile
2. Polaris Deployment and カタログ Creation
環境の準備が完了した後、Polarisサービスのデプロイとカタログの設定を開始します。
この文書ではソースコードクイックスタート方法を使用します。その他のデプロイオプションについては、https://polaris.apache.org/releases/1.0.1/getting-started/deploying-polaris/ を参照してください。
2.1 ソースコードのクローンとPolarisの起動
-
Polarisリポジトリをクローンし、特定のバージョンに切り替える
git clone https://github.com/apache/polaris.git
cd polaris
# Recommend using a released stable version
git checkout apache-polaris-1.0.1-incubating -
AWS認証情報の設定(オプション)
PolarisをEC2上で実行していない場合、またはEC2に適切なIAM Roleがバインドされていない場合は、環境変数を通じて
polaris-doris-demoロールを引き受ける権限を持つAK/SKをPolarisに提供する必要があります。export AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY -
Polarisのコンパイルと実行
Java 21+とDocker 27+がインストールされていることを確認してください。
./gradlew run -Dpolaris.bootstrap.credentials=POLARIS,root,secret
POLARISはrealmrootはCLIENT_IDsecretはCLIENT_SECRET- 認証情報が設定されていない場合、プリセットの認証情報
POLARIS,root,s3cr3tを使用します
このコマンドはPolarisサービスを開始し、デフォルトでポート 8181 でリッスンします。
2.2 PolarisでCatalogとNamespaceを作成
-
ROOT認証情報をエクスポート
export CLIENT_ID=root
export CLIENT_SECRET=secret -
カタログの作成(S3ストレージを指定)
./polaris catalogs create \
--storage-type s3 \
--default-base-location s3://polaris-doris-test/polaris1 \
--role-arn arn:aws:iam::<account_id>:role/polaris-doris-test \
--external-id polaris-doris-test \
doris_catalog
--storage-type s3: 基盤となるストレージをS3として指定します。--default-base-location: IcebergTableデータのデフォルトルートパスです。--role-arn: PolarisサービスがS3アクセスのために引き受けるIAM Roleです。--external-id: ロールを引き受ける際に使用される外部IDで、IAM Roleの信頼ポリシーの設定と一致している必要があります。
-
Namespaceを作成
./polaris namespaces create --catalog doris_catalog doris_demo
これにより、doris_catalogの下にdoris_demoという名前のデータベース(Namespace)が作成されます。
2.3 Polarisセキュリティロールと権限設定
Dorisが非rootユーザーとしてアクセスできるようにするため、新しいユーザーとロールを作成し、適切な権限を付与する必要があります。
-
Principal RoleとCatalog Roleの作成
# Create a Principal Role for aggregating permissions
./polaris principal-roles create doris_pr_role
# Create a カタログ Role under doris_catalog
./polaris catalog-roles create --catalog doris_catalog doris_catalog_role -
カタログ Roleに権限を付与する
# Grant doris_catalog_role permission to manage content within this カタログ
./polaris privileges catalog grant \
--catalog doris_catalog \
--catalog-role doris_catalog_role \
CATALOG_MANAGE_CONTENT -
Associate Principal RoleとCatalog Roleの関連付け
# Assign doris_catalog_role to doris_pr_role
./polaris catalog-roles grant \
--catalog doris_catalog \
--principal-role doris_pr_role \
doris_catalog_role -
新しいPrincipal(ユーザー)を作成してRoleをバインドする
# Create a new user (Principal) named doris_user
./polaris principals create doris_user
# Example output: {"clientId": "6e155b128dc06c13", "clientSecret": "ce9fbb4cc91c43ff2955f2c6545239d7"}
# Please note down this new client_id and client_secret pair, as Doris will use it for connection.
# Bind doris_user to doris_pr_role
./polaris principal-roles grant \
doris_pr_role \
--principal doris_user
この時点で、Polaris側のすべての設定が完了しています。doris_pr_roleを通じてdoris_catalogを管理する権限を取得するdoris_userという名前のユーザーを作成しました。
3. DorisのPolarisへの接続
次に、新しく設定したPolarisサービスに接続するIceberg CatalogをDoris内に作成します。Dorisは複数の柔軟な認証の組み合わせをサポートしています。
注意: この例では、PolarisのRESTサービスに接続するためにOAuth2認証資格情報を使用します。また、Dorisは
iceberg.rest.oauth2.tokenを使用して事前に取得したBearer Tokenを直接提供することもサポートしています。
方法1: OAuth2 + 一時的なストレージ認証情報 (Credential Vending)
これは最も推奨されるアプローチです。DorisはOAuth2認証情報を使用してPolarisで認証を行い、メタデータを取得します。S3上のデータファイルを読み取り/書き込みする必要がある場合、DorisはPolarisから一時的で最小限の権限を持つS3アクセス認証情報を要求します。
doris_user用に生成されたclientIdとclientSecretを使用してください。
CREATE CATALOG polaris_vended PROPERTIES (
'type' = 'iceberg',
-- カタログ name in Polaris
'warehouse' = 'doris_catalog',
'iceberg.catalog.type' = 'rest',
-- Polaris service address
'iceberg.rest.uri' = 'http://YOUR_POLARIS_HOST:8181/api/catalog',
-- Metadata authentication method
'iceberg.rest.security.type' = 'oauth2',
-- Replace with doris_user's client_id:client_secret
'iceberg.rest.oauth2.credential' = 'client_id:client_secret',
'iceberg.rest.oauth2.server-uri' = 'http://YOUR_POLARIS_HOST:8181/api/catalog/v1/oauth/tokens',
'iceberg.rest.oauth2.scope' = 'PRINCIPAL_ROLE:doris_pr_role',
-- Enable credential vending
'iceberg.rest.vended-credentials-enabled' = 'true'
);
Method 2: OAuth2 + Static Storage Credentials (AK/SK)
このアプローチでは、DorisはPolarisメタデータへのアクセスにOAuth2を使用しますが、S3データにアクセスする際は、Doris Catalog設定にハードコードされた静的なAK/SKを使用します。この方法は設定が簡単で、迅速なテストに適していますが、セキュリティレベルは低くなります。
CREATE CATALOG polaris_aksk PROPERTIES (
'type' = 'iceberg',
'iceberg.catalog.type' = 'rest',
'iceberg.rest.uri' = 'http://YOUR_POLARIS_HOST:8181/api/catalog',
'iceberg.rest.warehouse' = 'doris_catalog',
'iceberg.rest.security.type' = 'oauth2',
'iceberg.rest.oauth2.credential' = '6e155b128dc06c13:ce9fbb4cc91c43ff2955f2c6545239d7',
'iceberg.rest.oauth2.server-uri' = 'http://YOUR_POLARIS_HOST:8181/api/catalog/v1/oauth/tokens',
'iceberg.rest.oauth2.scope' = 'PRINCIPAL_ROLE:doris_pr_role',
-- Directly provide S3 access keys
's3.access_key' = 'YOUR_S3_ACCESS_KEY',
's3.secret_key' = 'YOUR_S3_SECRET_KEY',
's3.endpoint' = 'https://s3.us-west-2.amazonaws.com',
's3.region' = 'us-west-2'
);
4. Dorisで接続を確認する
Catalogの作成にどの方法を使用したかに関わらず、以下のSQLを使用してエンドツーエンドの接続を確認できます。
-- Switch to the カタログ you created and the Namespace configured in Polaris
USE polaris_vended.doris_demo;
-- Create an Iceberg table
CREATE TABLE my_iceberg_table (
id INT,
name STRING
)
PROPERTIES (
'write-format'='parquet'
);
-- Insert data
INSERT INTO my_iceberg_table VALUES (1, 'Doris'), (2, 'Polaris');
-- Query data
SELECT * FROM my_iceberg_table;
-- Expected result:
-- +------+---------+
-- | id | name |
-- +------+---------+
-- | 1 | Doris |
-- | 2 | Polaris |
-- +------+---------+
上記のすべての操作が正常に完了した場合、おめでとうございます!完全なデータレイクパイプライン Doris -> Polaris -> S3 の構築に成功しました。
Doris を使用して Iceberg Tableを管理する詳細については、以下をご覧ください:
https://doris.apache.org/docs/lakehouse/catalogs/iceberg-catalog