データカタログにアクセスする - AWS Glue

データカタログにアクセスする

AWS Glue Data Catalog (データカタログ) を使用すると、データを検出してこれを理解することができます。データカタログは、スキーマの定義、データ型、場所などのメタデータを一貫して維持する方法を提供します。次の方法を使用してデータカタログにアクセスできます。

  • AWS Glue コンソール – ウェブベースのユーザーインターフェイスである AWS Glue コンソールからデータカタログにアクセスして管理できます。コンソールでは、データベース、テーブル、および関連するメタデータを参照および検索したり、メタデータ定義を作成、更新、削除したりできます。

  • AWS Glue クローラー – クローラーは、データソースを自動的にスキャンし、データカタログにメタデータを入力するプログラムです。クローラーを作成して実行し、Amazon S3、Amazon RDS、Amazon DynamoDB、Amazon CloudWatch、および MySQL や PostgreSQL などの JDBC 準拠のリレーショナルデータベース、Snowflake や Google BigQuery などのいくつかの非 AWS ソースからのデータを検出してカタログ化できます。

  • AWS Glue API - AWS Glue API を使用してプログラムでデータカタログにアクセスできます。これらの API を使用すると、プログラムでデータカタログを操作し、自動化と他のアプリケーションやサービスとの統合が可能になります。

  • AWS Command Line Interface (AWS CLI) – AWS CLI を使用して、コマンドラインからデータカタログにアクセスして管理できます。CLI には、メタデータ定義の作成、更新、削除、メタデータ情報のクエリと取得のためのコマンドが用意されています。

  • 他の AWS サービスとの統合 – データカタログは他のさまざまな AWS サービスと統合されるため、カタログに保存されているメタデータにアクセスして利用できます。たとえば、Amazon Athena を使用してデータカタログのメタデータを使用してデータソースをクエリし、AWS Lake Formation を使用してデータカタログリソースのデータアクセスとガバナンスを管理できます。

AWS Glue Iceberg REST エンドポイントを使用したデータカタログへの接続方法

AWS Glue の Iceberg REST エンドポイントは、Apache Iceberg REST 仕様で指定された API オペレーションに対応しています。Iceberg REST クライアントを使用すると、分析エンジンで実行されているアプリケーションをデータカタログでホストされている REST カタログに接続することができます。

エンドポイントは、Apache Iceberg テーブル仕様の両方 (v1 と v2) をサポートしており、デフォルトでは v2 に設定されています。Iceberg テーブル v1 仕様を使用する場合は、API コールで v1 を指定する必要があります。API オペレーションを使用すると、Amazon S3 オブジェクトストレージと Amazon S3 テーブルストレージの両方に保存されている Iceberg テーブルにアクセスできます。

設定の詳細

Endpoint : https://glue.us-east-1.amazonaws.com/iceberg

Iceberg クライアントを使用して Spark などの分析エンジンをサービスエンドポイントに接続する場合は、次のアプリケーション設定を指定する必要があります。

catalog_name = "mydatacatalog"
aws_account_id = "123456789012"
aws_region = "us-east-1"
spark = SparkSession.builder \
    ... \
    .config("spark.sql.defaultCatalog", catalog_name) \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.type", "rest") \
    .config(f"spark.sql.catalog.{catalog_name}.uri", "https://glue.{aws_region}.amazonaws.com/iceberg") \
    .config(f"spark.sql.catalog.{catalog_name}.warehouse", "{aws_account_id}") \
    .config(f"spark.sql.catalog.{catalog_name}.rest.sigv4-enabled", "true") \
    .config(f"spark.sql.catalog.{catalog_name}.rest.signing-name", "glue") \
    .config(f"spark.sql.catalog.{catalog_name}.rest.signing-region", "{aws_region}") \
    .config(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") \
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .getOrCreate()
     

AWS Glue Iceberg REST 拡張エンドポイントを使用したデータカタログへの接続

AWS Glue Iceberg REST 拡張エンドポイントは、Apache Iceberg REST 仕様には含まれていない追加の API と、サーバー側のスキャン計画機能を提供します。これらの追加の API は、Amazon Redshift マネージドストレージに保存されているテーブルにアクセスするときに使用します。エンドポイントには、Apache Iceberg AWS Glue Data Catalog 拡張機能ライブラリを使用して、アプリケーションからアクセスすることができます。

Endpoint : https://glue.us-east-1.amazonaws.com/extensions
catalog_name = "myredshiftcatalog"
aws_account_id = "123456789012"
aws_region = "us-east-1"
spark = SparkSession.builder \
    .config("spark.sql.defaultCatalog", catalog_name) \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") \
    .config(f"spark.sql.catalog.{catalog_name}.client.region", "{aws_region}") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.id", "{aws_account_id}:redshiftnamespacecatalog/redshiftdb") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.endpoint", "https://glue.us-east-1.amazonaws.com/extensions") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.extensions.debug-enabled", "true") \
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .getOrCreate()
    

AWS Glue サービスエンドポイントへのアクセスの認証と承認

AWS Glue Data Catalog エンドポイントへの API リクエストは、AWS Signature Version 4 (SigV4) を使用して認証されます。AWS SigV4 の詳細については「API リクエストに対する AWS Signature Version 4」のセクションを参照してください。

AWS Glue サービスエンドポイントと AWS Glue メタデータにアクセスする場合、アプリケーションは glue:getCatalog IAM アクションを必要とする IAM ロールを引き受けます。

REST オペレーション REST パス AWS Glue IAM アクション CloudTrail EventName Lake Formation 許可
GetConfig GET /config GetCatalog 不要
ListNamespaces GET /namespaces GetDatabases GetDatabases ALL, DESCRIBE, SELECT
CreateNamespace POST /namespaces CreateDatabase CreateDatabase ALL, CREATE_DATABASE
LoadNamespaceMetadata GET /namespaces/{ns} GetDatabase GetDatabase ALL, DESCRIBE, SELECT
UpdateProperties POST /namespaces/{ns}/properties UpdateDatabase UpdateDatabase ALL, ALTER
DeleteNamespace DELETE /namespace/{ns} DeleteDatabase DeleteDatabase ALL, DROP
ListTables GET /namespaces/{ns}/tables GetTables GetTables ALL, SELECT, DESCRIBE
CreateTable POST /namespaces/{ns}/tables CreateTable CreateTable ALL, CREATE_TABLE
LoadTable GET /namespaces/{ns}/tables/{tbl} GetTable GetTable ALL, SELECT, DESCRIBE
TableExists HEAD /namespaces/{ns}/tables/{tbl} GetTable GetTable ALL, SELECT, DESCRIBE
UpdateTable POST /namespaces/{ns}/tables/{tbl} UpdateTable UpdateTable ALL, ALTER
DeleteTable DELETE /namespaces/{ns}/tables/{tbl} DeleteTable DeleteTable ALL, DROP

IAM、AWS Lake Formation、Lake Formation のいずれかのハイブリッドモードのアクセス許可を使用することで、デフォルトのカタログデータとそのオブジェクトへのアクセスを管理できます。

AWS Glue Data Catalog のフェデレーティッドカタログには、Lake Formation に登録されたデータロケーションがあります。Lake Formation は Data Catalog と統合されているため、カタログオブジェクトへのユーザーアクセスを管理するデータベーススタイルのアクセス許可を利用できます。Lake Formation では、データの作成、挿入、削除に使用する IAM ユーザーまたはロールにアクセス許可を設定する必要があります。これらのアクセス許可は、既存の AWS Glue テーブルに対するものと同じものです。

  • CREATE_CATALOG – カタログの作成に必要

  • CREATE_DATABASE – データベースの作成に必要

  • CREATE_TABLE – テーブルの作成に必要

  • DELETE – テーブルからのデータの削除に必要

  • DESCRIBE – メタデータの読み取りに必要

  • DROP – テーブルまたはデータベースのドロップ/削除に必要

  • INSERT: プリンシパルがデータをテーブルに挿入する必要がある場合に必要

  • SELECT: プリンシパルがテーブルからデータを選択する必要がある場合に必要

詳細については、「AWS Lake Formation デベロッパーガイド」の「Lake Formation permissions reference」を参照してください。

スタンドアロンの Spark アプリケーションからデータカタログへの接続

Apache Iceberg コネクタを使用することで、スタンドアロンのアプリケーションからデータカタログに接続することができます。

  1. Spark アプリケーションの IAM ロールを作成します。

  2. Iceberg コネクタを使用して AWS Glue Iceberg Rest エンドポイントに接続します。

    # configure your application. Refer to https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html for best practices on configuring environment variables. export AWS_ACCESS_KEY_ID=$(aws configure get appUser.aws_access_key_id) export AWS_SECRET_ACCESS_KEY=$(aws configure get appUser.aws_secret_access_key) export AWS_SESSION_TOKEN=$(aws configure get appUser.aws_secret_token) export AWS_REGION=us-east-1 export REGION=us-east-1 export AWS_ACCOUNT_ID = {specify your aws account id here} ~/spark-3.5.3-bin-hadoop3/bin/spark-shell \ --packages org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.6.0 \ --conf "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \ --conf "spark.sql.defaultCatalog=spark_catalog" \ --conf "spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkCatalog" \ --conf "spark.sql.catalog.spark_catalog.type=rest" \ --conf "spark.sql.catalog.spark_catalog.uri=https://glue.us-east-1.amazonaws.com/iceberg" \ --conf "spark.sql.catalog.spark_catalog.warehouse = {AWS_ACCOUNT_ID}" \ --conf "spark.sql.catalog.spark_catalog.rest.sigv4-enabled=true" \ --conf "spark.sql.catalog.spark_catalog.rest.signing-name=glue" \ --conf "spark.sql.catalog.spark_catalog.rest.signing-region=us-east-1" \ --conf "spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO" \ --conf "spark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.SimpleAWSCredentialProvider"
  3. データカタログのデータをクエリします。

    spark.sql("create database myicebergdb").show()
    spark.sql("""CREATE TABLE myicebergdb.mytbl (name string) USING iceberg location 's3://bucket_name/mytbl'""")
    spark.sql("insert into myicebergdb.mytbl values('demo') ").show()
           

Amazon Redshift と Apache Iceberg 間のデータマッピング

Redshift と Iceberg は、さまざまなデータ型をサポートしています。次の互換性マトリクスは、この 2 つのデータシステム間でデータをマッピングする際のサポートと制限の概要を示しています。各データシステムでサポートされているデータ型の詳細については、「Amazon Redshift データ型」と「Apache Iceberg Table Specifications」を参照してください。

Redshift データ型 エイリアス Iceberg データ型
SMALLINT INT2 整数
INTEGER INT、INT4 整数
BIGINT INT8 long
DECIMAL NUMERIC decimal
REAL FLOAT4 フロート
REAL FLOAT4 フロート
DOUBLE PRECISION FLOAT8、FLOAT double
CHAR CHARACTER, NCHAR string
VARCHAR CHARACTER VARYING, NVARCHAR string
BPCHAR string
TEXT string
DATE date
TIME TIME WITHOUT TIMEZONE 時間
TIME TIME WITH TIMEZONE サポート外
TIMESTAMP TIMESTAMP WITHOUT TIMEZONE TIMESTAMP
TIMESTAMPZ TIMESTAMP WITH TIMEZONE TIMESTAMPZ
INTERVAL YEAR TO MONTH サポートされていません
INTERVAL DAY TO SECOND サポートされていません
BOOLEAN BOOL ブール
HLLSKETCH サポートされていません
SUPER サポートされていません
VARBYTE VARBINARY、BINARY VARYING バイナリ
GEOMETRY サポートされていません
GEOGRAPHY サポートされていません

AWS Glue Iceberg REST Catalog API を使用する際の考慮事項と制限事項

Apache Iceberg REST Catalog データ定義言語 (DDL) オペレーション動作を使用する際の考慮事項と制限事項は次のとおりです。

考慮事項
  • DeleteTable API の動作 — DeleteTable API はパージオプションをサポートしています。パージが true に設定されている場合、テーブルデータは削除されます。設定されていない場合は削除されません。Amazon S3 のテーブルの場合、このオペレーションでテーブルデータが削除されることはありません。テーブルが Amazon S3 と purge = TRUE, に保存されている場合、このオペレーションは失敗します。

    テーブルが Amazon Redshift マネージドストレージに保存されている場合、Amazon Redshift での DROP TABLE の動作と同様に、このオペレーションによりテーブルデータは削除されます。テーブルが Amazon Redshift と purge = FALSE に保存されている場合、このオペレーションは失敗します。

  • CreateTable API の動作CreateTable API オペレーションはオプション state-create = TRUE をサポートしていません。

  • RenameTable API の動作RenameTable オペレーションは Amazon Redshift のテーブルではサポートされていますが、Amazon S3 のテーブルではサポートされていません。

  • Amazon Redshift の名前空間とテーブルの DDL オペレーション – Amazon Redshift の名前空間とテーブルの作成、更新、削除のオペレーションは、Amazon Redshift のマネージドワークグループがいつ利用可能か、および競合する DDL と DML トランザクションが進行中かどうかに依存し、オペレーションはロックを待機してから変更のコミットを試みる必要があるため、非同期オペレーションとなります。

    作成、更新、削除のオペレーション中に、エンドポイントは次のペイロードを含む 202 レスポンスを返します。

    {
      "transaction-context": "operation/resource", 
      "transaction-id": "data-api-request-id:crypto-hash-signature(operation, resource, data-api-uuid)"
    }        

    例えば、エンドポイントは UpdateTable オペレーションに対して次のレスポンスを返します。

    {
      "transaction-context": "UpdateTable/arn:aws:glue:us-east-1:123456789012:table/123456789012/cat1/db1/tbl1", 
      "transaction-id": "b0033764-20df-4679-905d-71f20a0cdbe7:ca8a95d54158793204f1f39b4971d2a7"
    }        

    このトランザクションの進行状況を追跡するには、CheckTransactionStatus API を次の形式で使用します。

    POST /transactions/status
    
    Request:
    {
      "transaction-context": "UpdateTable/arn:aws:glue:us-east-1:123456789012:table/123456789012/cat1/db1/tbl1", 
      "transaction-id": "transaction-id": "b0033764-20df-4679-905d-71f20a0cdbe7:ca8a95d54158793204f1f39b4971d2a7"
    }
    
    Response:
    {
       "status": "IN_PRORESS|SUCCEEDED|FAILED|CANCELED",
      "error": "message" // if failed
    }
            
制限
  • Apache Iceberg REST 仕様の View API は、AWS Glue Iceberg REST Catalog ではサポートされていません。