AWS S3 テーブル用の Iceberg REST Catalog の作成
この記事では、AWS Glue Iceberg REST エンドポイントを通じて AWS S3 テーブルのデータにアクセスするために、StarRocks で Iceberg REST Catalog を作成する方法を説明します。
AWS Glue Iceberg REST エンドポイントは、Iceberg REST Catalog Open API 仕様を実装しており、Iceberg テーブルとやり取りするための標準化されたインターフェースを提供します。このエンドポイントを使用して S3 のテーブルにアクセスするには、IAM ポリシーと AWS Lake Formation の認可を組み合わせて資格情報を設定する必要があります。以下のセクションでは、必要なポリシーの定義、データベースおよびテーブルレベルでの Lake Formation の権限の確立、StarRocks を使用して S3 テーブルにアクセスするための Iceberg REST catalog の作成について説明します。
(オプション)テーブルバケットの作成
Iceberg テーブル用のテーブルバケットが既にある場合は、このステップをスキップできます。
- 管理者権限を持つユーザーとして Amazon S3 コンソール にサインインします。
- ページの右上隅で、AWS リージョンを選択します。
- 左側のナビゲーションペインで、ナビゲーションパネルから Table buckets を選択します。
- Create table bucket をクリックして、テーブルバケットを作成します。
- テーブルバケットを作成した後、それを選択し、Create table with Athena をクリックします。
- 名前空間を作成します。
- 名前空間を作成した後、再度 Create table with Athena をクリックしてテーブルを作成します。
NOTE
Athena を使用してデータベースとテーブルを作成し、それを StarRocks でクエリすることができます。あるいは、テーブルバケットを作成し、StarRocks を使用してデータベースとテーブルを作成することもできます。
IAM ポリシーの作成
AWS Glue エンドポイントを介してテーブルにアクセスするには、AWS Glue および Lake Formation の操作に対する権限を持つ IAM ポリシーを作成します。
- 管理者権限を持つユーザーとして Amazon IAM コンソール にサインインします。
- ページの右上隅で、AWS リージョンを選択します。
- 左側のナビゲーションペインで、ナビゲーションパネルから Policies を選択します。
- Create a policy を選択し、ポリシーエディタで JSON を選択します。
- AWS Glue および Lake Formation のアクションへのアクセスを許可するために、以下のポリシーを追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"glue:GetCatalog",
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetTable",
"glue:GetTables",
"glue:CreateTable",
"glue:UpdateTable"
],
"Resource": [
"arn:aws:glue:<region>:<account-id>:catalog",
"arn:aws:glue:<region>:<account-id>:catalog/s3tablescatalog",
"arn:aws:glue:<region>:<account-id>:catalog/s3tablescatalog/<s3_table_bucket_name>",
"arn:aws:glue:<region>:<account-id>:table/s3tablescatalog/<s3_table_bucket_name>/<namespace>/*",
"arn:aws:glue:<region>:<account-id>:database/s3tablescatalog/<s3_table_bucket_name>/<namespace>"
]
},
{
"Effect": "Allow",
"Action": [
"lakeformation:GetDataAccess"
],
"Resource": "*"
}
]
}
IAM ポリシーを作成した後、ターゲットの IAM ユーザーにアタッチします。
- ナビゲーションパネルから Users を選択します。
- S3 テーブルアクセスを必要とするユーザーを選択します。
- Add permissions をクリックし、Attach policies directly を選択します。
- 新しく作成したポリシーをアタッチします。
Lake Formation を介した権限の管理
S3 テーブルにアクセスするには、StarRocks が Lake Formation を使用して、サードパーティのクエリエンジンが S3 テーブルにアクセスできるようにする権限を設定する必要があります。
- 管理者権限を持つユーザーとして Lake Formation コンソール にサインインします。
- ページの右上隅で、AWS リージョンを選択します。
- 左側のナビゲーションペインで、ナビゲーションパネルから Application integration settings を選択します。
- Allow external engines to access data in Amazon S3 locations with full table access. を選択します。
次に、上記の IAM ユーザーに Lake Formation でアクセス権限を付与します。
- Lake Formation コンソール の左側のナビゲーションペインで、ナビゲーションパネルから Data permissions を選択します。
- Grant をクリックします。
- Principals セクションで IAM users and roles を選択し、IAM users and roles ドロップダウンリストから認可された IAM ユーザーを選択します。
- LF-Tags or catalog resources セクションで Named Data Catalog resources を選択し、Catalogs ドロップダウンリストから作成したテーブルバケットを選択します。
- Catalog permissions セクションで Catalog permissions に対して Super を選択します。
- Grant をクリックします。
NOTE
ここでは、テストの便宜上、Super 権限が付与されています。実際の運用環境では、適切な権限を割り当てる必要があります。
Iceberg REST Catalog の作成
StarRocks で Iceberg REST catalog を作成します。
CREATE EXTERNAL CATALOG starrocks_lakehouse_s3tables PROPERTIES(
"type"="iceberg",
"iceberg.catalog.type" = "rest",
"iceberg.catalog.uri" = "https://glue.<region>.amazonaws.com/iceberg",
"iceberg.catalog.rest.sigv4-enabled" = "true",
"iceberg.catalog.rest.signing-name" = "glue",
"iceberg.catalog.rest.access-key-id" = "<iam_user_access_key>",
"iceberg.catalog.rest.secret-access-key" = "<iam_user_secret_key>",
"iceberg.catalog.warehouse" = "<accountid>:s3tablescatalog/<table-bucket-name>",
"aws.s3.region" = "<region>"
);
その後、データベースとテーブルを作成し、クエリを実行できます。
例:
-- カタログを切り替える
StarRocks> SET CATALOG starrocks_lakehouse_s3tables;
-- データベースを作成
StarRocks> CREATE DATABASE s3table_db;
Query OK, 0 rows affected
-- データベースを切り替える
StarRocks> USE s3table_db;
Database changed
-- テーブルを作成
StarRocks> CREATE TABLE taxis (
trip_id BIGINT,
trip_distance FLOAT,
fare_amount DOUBLE,
store_and_fwd_flag STRING,
vendor_id BIGINT
) PARTITION BY (vendor_id);
Query OK, 0 rows affected
-- データを挿入
StarRocks> INSERT INTO taxis
VALUES (1000371, 1.8, 15.32, 'N', 1),
(1000372, 2.5, 22.15, 'N', 2),
(1000373, 0.9, 9.01, 'N', 2),
(1000374, 8.4, 42.13, 'Y', 1);
Query OK, 4 rows affected
-- データをクエリ
StarRocks> SELECT * FROM taxis;
+---------+---------------+-------------+--------------------+-----------+
| trip_id | trip_distance | fare_amount | store_and_fwd_flag | vendor_id |
+---------+---------------+-------------+--------------------+-----------+
| 1000372 | 2.5 | 22.15 | N | 2 |
| 1000373 | 0.9 | 9.01 | N | 2 |
| 1000371 | 1.8 | 15.32 | N | 1 |
| 1000374 | 8.4 | 42.13 | Y | 1 |
+---------+---------------+-------------+--------------------+-----------+
4 rows in set