

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# Amazon Redshift から Amazon S3 Tables をクエリする
<a name="querying-s3Tables"></a>

Amazon Redshift は Amazon S3 テーブルバケットと統合されているため、Amazon Redshift を使用して S3 テーブルリソースにアクセスできます。Iceberg 環境を始めたばかりの場合でも、Iceberg 環境で何千ものテーブルを管理している場合でも、テーブルバケットはあらゆる規模のデータレイク管理を簡素化します。詳細については、「[Table buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html)」を参照してください。

このトピックでは、Amazon S3 Tables と Redshift の使用を開始し、Amazon Redshift を使用して S3 Tables オブジェクトにアクセスする方法について説明します。

## 前提条件
<a name="querying-s3Tables-prerequisites"></a>

Amazon Redshift から S3 Tables をクエリする前に、S3 Tables を AWS Glue Data Catalog と統合する必要があります。手順については、「[Amazon S3 Tables と AWS Glue Data Catalog の統合](https://docs.aws.amazon.com/glue/latest/dg/glue-federation-s3tables.html)」を参照してください。

S3 Tables を AWS Glue Data Catalog と統合すると、S3 Tables および AWS Glue への必要な IAM アクセス許可を持つ IAM プリンシパルは、AWS Glue Data Catalog を通じて S3 Tables を検出できます。

**注記**  
方法 3 (自動マウントされた awsdatacatalog) には、追加の前提条件があります。詳細については、「[方法 3: 自動マウントされた awsdatacatalog](#querying-s3Tables-method3)」を参照してください。

## Amazon Redshift から S3 Tables をクエリする
<a name="querying-s3Tables-steps"></a>

S3 Tables のクエリを開始するには、以下のステップに従います。
+ ステップ 1: Amazon Redshift 用の IAM ロールを作成する
+ ステップ 2: IAM ロールを Amazon Redshift クラスターにアタッチする
+ ステップ 3: Amazon Redshift から S3 Tables をクエリする

### ステップ 1: Amazon Redshift 用の IAM ロールを作成する
<a name="querying-s3Tables-step1"></a>

クラスターは、AWS Glue の外部 S3 Tables カタログにアクセスするために承認を必要とします。この承認を提供するために、Amazon Redshift は、クラスターにアタッチされた IAM ロールを使用します。以下のポリシー許可を持つ IAM ロールを作成します。

**注記**  
以下のポリシーと例では、`us-west-2` を AWS リージョンに、`111122223333` を AWS アカウント ID に置き換えてください。

**ポリシーを作成するには:**

1. IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) を開きます。

1. ナビゲーションペインで、**ポリシー** を選択してください。

1. **[Create policy]** (ポリシーを作成) を選択します。

1. **JSON** タブを選択します。

1. 次の JSON ポリシードキュメントを貼り付けます。

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "GlueDataCatalogPermissions",
         "Effect": "Allow",
         "Action": [
           "glue:GetCatalog",
           "glue:GetDatabase",
           "glue:GetTable",
           "glue:GetTables",
           "glue:UpdateTable",
           "glue:DeleteTable"
         ],
         "Resource": [
           "arn:aws:glue:us-west-2:111122223333:catalog",
           "arn:aws:glue:us-west-2:111122223333:catalog/s3tablescatalog",
           "arn:aws:glue:us-west-2:111122223333:catalog/s3tablescatalog/*",
           "arn:aws:glue:us-west-2:111122223333:database/s3tablescatalog/*/*",
           "arn:aws:glue:us-west-2:111122223333:table/s3tablescatalog/*/*/*",
           "arn:aws:glue:us-west-2:111122223333:database/*",
           "arn:aws:glue:us-west-2:111122223333:table/*/*"
         ]
       },
       {
         "Sid": "S3TablesDataAccessPermissions",
         "Effect": "Allow",
         "Action": [
           "s3tables:GetTableBucket",
           "s3tables:GetNamespace",
           "s3tables:GetTable",
           "s3tables:GetTableMetadataLocation",
           "s3tables:GetTableData",
           "s3tables:ListTableBuckets",
           "s3tables:CreateTable",
           "s3tables:PutTableData",
           "s3tables:UpdateTableMetadataLocation",
           "s3tables:ListNamespaces",
           "s3tables:ListTables",
           "s3tables:DeleteTable"
         ],
         "Resource": [
           "arn:aws:s3tables:us-west-2:111122223333:bucket/*",
           "arn:aws:s3tables:us-west-2:111122223333:bucket/*/table/*"
         ]
       }
     ]
   }
   ```

1. **[ポリシーの確認]** を選択します。

1. **[ポリシーを確認]** ページで **[名前]** に「`GlueCatalogS3Tables_Policy`」と入力します。必要に応じて説明を入力します。ポリシーの概要を確認して、**[ポリシーを作成]** を選択します。

**Amazon Redshift 用の IAM ロールを作成するには:**

1. [IAM コンソール](https://console.aws.amazon.com/iam/)を開きます。

1. ナビゲーションペインで **[ロール]** を選択します。

1. [**ロールの作成**] を選択してください。

1. **[AWS のサービス]** を信頼されたエンティティとして選択し、次に **[Redshift]** をユースケースとして選択します。

1. **[他の AWS サービスのユースケース]** で、**[Redshift - カスタマイズ可能]**、**[次へ]** の順に選択します。

1. **[アクセス許可を追加]** ページで、上で作成した `GlueCatalogS3Tables_Policy` ポリシーをアタッチします。[**次へ**] を選択します。

1. [**ロール名**] に、`RedshiftS3TablesRole`などのロール名を入力します。

1. 情報を確認し、**[ロールを作成]** を選択します。

1. ナビゲーションペインで **Roles (ロール) ** を選択してください。新しいロールの名前を選択して概要を確認し、次に**ロール ARN** をクリップボードにコピーします。この ARN は、S3 Tables 名前空間の外部スキーマを作成するときに使用します。

**注記**  
特定のリソースに絞り込むには、ワイルドカードを正確な Amazon リソースネーム (ARN) に置き換えます。

### ステップ 2: IAM ロールを Amazon Redshift クラスターにアタッチする
<a name="querying-s3Tables-step2"></a>

ステップ 1 で設定した IAM ロールを Amazon Redshift クラスターに関連付けます。

**AWS マネジメントコンソールの使用:**

1. AWS マネジメントコンソールにサインインして Amazon Redshift コンソール ([https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)) を開きます。

1. ナビゲーションメニューで **[Clusters]** (クラスター) を選択し、更新するクラスターを選択します。

1. **[アクション]** で **[IAM ロールを管理]** を選択し、クラスターに現在関連付けられている IAM ロールのリストを表示します。

1. **[IAM ロールを管理]** ページで、追加する IAMロールを選択し、**[IAM ロールを追加]** を選択します。

1. **[完了]** を選択して変更を保存します。

**AWS CLI の使用:**

次のコマンドを実行して、IAM ロールを既存のクラスターまたは名前空間に関連付けます。`my-redshift-cluster` または `my-redshift-namespace` をクラスター識別子または名前空間に置き換え、`111122223333` を AWS アカウント ID に置き換えます。

```
aws redshift modify-cluster-iam-roles \
    --cluster-identifier my-redshift-cluster \
    --add-iam-roles arn:aws:iam::111122223333:role/RedshiftS3TablesRole

-- for serverless
aws redshift-serverless update-namespace \
    --namespace-name my-redshift-namespace \
    --iam-roles "arn:aws:iam::111122223333:role/RedshiftS3TablesRole"
```

詳細については、「*Amazon Redshift 管理ガイド*」の「[IAM ロールをクラスターと関連付ける](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html)」を参照してください。

### ステップ 3: Amazon Redshift から S3 Tables をクエリする
<a name="querying-s3Tables-step3"></a>

S3 Tables を AWS Glue Data Catalog と統合すると、サービスは S3 Tables リソースを AWS Glue カタログオブジェクトにマッピングするフェデレーションカタログ構造を作成します。
+ S3 テーブルバケットは、AWS Glue Data Catalog の**カタログ**になります。
+ S3 名前空間は **AWS Glue データベース**になります。
+ S3 テーブルは **AWS Glue テーブルオブジェクト**になります。

統合により、次の階層が作成されます。
+ **フェデレーションカタログ:** `s3tablescatalog` (自動作成)
+ **子カタログ:** 各 S3 テーブルバケットは、`s3tablescatalog` の子カタログになります。
+ **データベース:** テーブルバケット内の各 S3 名前空間はデータベースになります。
+ **テーブル:** 名前空間内の各 S3 テーブルはテーブルになります。

例えば、テーブル `transactions` を含む名前空間 `sales` を持つ `analytics-bucket` という名前の S3 テーブルバケットがある場合、AWS Glue Data Catalog のフルパスは `s3tablescatalog/analytics-bucket/sales/transactions` になります。

**リソースリンクを作成する**

以下の 3 つのクエリ方法のいずれかを使用する前に、AWS Glue Data Catalog でリソースリンクを作成する必要があります。リソースリンクを使用すると、Amazon Redshift は標準カタログを通じて S3 Tables データベースを参照できます。

*AWS Glue コンソールの使用:*

1. [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/) で AWS Glue コンソール を開きます。

1. ナビゲーションペインで、**[Databases]** (データベース) を選択します。

1. **[作成]**、**[リソースリンク]** の順に選択します。

1. **[リソースリンクの作成]** ページで、以下の情報を入力します。
   + **リソースリンク名:** リソースリンクの名前を入力します (例: `sales_resource_link`)。
   + **共有データベース:** S3 Tables データベースパス (`s3tablescatalog/analytics-bucket/sales` など) を入力します。
   + **共有データベース所有者:** AWS アカウント ID を入力します。
   + **共有データベースのカタログ ID:** カタログ ID を `<account-id>:s3tablescatalog/<bucket-name>` 形式で入力します。

1. **[作成]** を選択します。

*AWS CLI の使用:*

```
aws glue create-database \
  --region us-west-2 \
  --cli-input-json '{
        "CatalogId": "111122223333",
        "DatabaseInput": {
            "Name": "sales_resource_link",
            "TargetDatabase": {
                "CatalogId": "111122223333:s3tablescatalog/analytics-bucket",
                "DatabaseName": "sales"
            }
        }
  }'
```

このコマンドは、S3 テーブルバケット `analytics-bucket` の `sales` データベースを指す `sales_resource_link` という名前のリソースリンクを、デフォルトの AWS Glue データカタログに作成します。

リソースリンクを作成すると、Amazon Redshift は S3 Tables をクエリする 3 つの方法を提供します。ユースケースに最適な方法を選択してください。

**注記**  
データベースレベルでリソースリンクを作成するには、デフォルトのカタログと作成対象のデータベースに対する `AWS Glue:CreateDatabase` アクセス許可が Redshift 管理者に必要です。

#### 方法 1: CREATE EXTERNAL SCHEMA (外部スキーマを作成する)
<a name="querying-s3Tables-method1"></a>

`CREATE EXTERNAL SCHEMA` を使用して、S3 Tables データベースを参照する外部スキーマを作成します。この方法では、スキーマの命名と設定を明示的に制御します。

構文の詳細については、「*Amazon Redshift データベースデベロッパーガイド*」の「[CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)」を参照してください。

**例**

ステップ 3 のデータベース名とカタログ ID を使用します。`111122223333` を AWS アカウント ID に置き換えます。

```
CREATE EXTERNAL SCHEMA s3tables_schema
FROM DATA CATALOG DATABASE 'sales_resource_link'
IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftS3TablesRole'
REGION 'us-west-2'
CATALOG_ID '111122223333';

SELECT * FROM s3tables_schema.transactions;
```

#### 方法 2: CREATE DATABASE FROM ARN (ARN からデータベースを作成する)
<a name="querying-s3Tables-method2"></a>

`CREATE DATABASE` を `FROM ARN` 句とともに使用して、AWS Glue リソースリンクを直接参照するフェデレーションデータベースを作成します。この方法では、AWS Glue データベースを Redshift データベースに自動的にマッピングします。

構文の詳細については、「*Amazon Redshift データベースデベロッパーガイド*」の「[CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html)」を参照してください。

**例**

`111122223333` を AWS アカウント ID に置き換えます。

```
CREATE DATABASE s3tables_db
FROM ARN 'arn:aws:glue:us-west-2:111122223333:database/sales_resource_link'
WITH DATA CATALOG SCHEMA analytics_schema
IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftS3TablesRole';

SELECT * FROM s3tables_db.analytics_schema.transactions;
```

#### 方法 3: 自動マウントされた awsdatacatalog
<a name="querying-s3Tables-method3"></a>

Amazon Redshift は、`awsdatacatalog` データベースを介して、S3 Tables リソースリンクを含む AWS Glue Data Catalog データベースを自動的にマウントできます。この方法では、Spectrum (FAS) へのフェデレーションアクセスをクラスターで有効にする必要があります。

**前提条件**

自動マウントされた `awsdatacatalog` データベースを使用するには、Spectrum へのフェデレーションアクセスを有効にする必要があります。これにより、Amazon Redshift はフェデレーション ID 認証情報を使用して AWS Glue Data Catalog および外部データソースにアクセスできます。

Spectrum へのフェデレーションアクセスを有効にするには:

1. 以下のアクセス許可を持つ IAM ID を使用して Redshift クラスターに接続します。
   + `redshift:GetClusterCredentialsWithIAM` (プロビジョニングされたクラスターの場合) または `redshift-serverless:GetCredentials` (サーバーレスの場合)
   + `AmazonS3ReadOnlyAccess`
   + `AWSGlueConsoleFullAccess`
   + S3 Tables のアクセス許可 (ステップ 1 で定義)

1. IAM ID を使用して接続すると、Amazon Redshift は `IAM:` (ユーザーの場合) または `IAMR:` (ロールの場合) というプレフィックスが付いたデータベースユーザーを自動的に作成します。

1. クラスター管理者として、外部スキーマにアクセスするためのアクセス許可をフェデレーションユーザーに付与します。`my_user` を IAM ロール名またはユーザー名に置き換えます。

   ```
   GRANT ALL ON SCHEMA awsdatacatalog TO "IAMR:my_user";
   ```

フェデレーションアクセスを設定する詳細な手順については、「*Amazon Redshift 管理ガイド*」の「[フェデレーション ID を使用して、ローカルリソースと Amazon Redshift Spectrum の外部テーブルへの Amazon Redshift アクセスを管理する](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)」を参照してください。

**S3 Tables をクエリする**

フェデレーションアクセスを設定したら、マウントされたスキーマを確認し、S3 Tables をクエリします。

マウントされたスキーマを確認します。

```
SHOW SCHEMAS FROM DATABASE awsdatacatalog;
```

ステップ 3 のリソースリンク名を使用して S3 Tables をクエリします。

```
SELECT * FROM awsdatacatalog.sales_resource_link.transactions;
```