

 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 Spectrum 用の IAM ポリシー
<a name="c-spectrum-iam-policies"></a>

このトピックでは、Redshift Spectrum を使用するために必要な IAM アクセス許可について説明します。

デフォルトでは、Amazon Redshift Spectrum は AWS Glue をサポートする AWS リージョンで AWS Glue Data Catalog を使用します。その他の AWS リージョンでは、Redshift Spectrum は Athena データカタログを使用します。クラスターには、AWS Glueまたは Athena に置かれた外部データカタログや、Amazon S3 内のデータファイルにアクセスするための承認が必要です。この承認は、クラスターにアタッチされたAWS Identity and Access Management(IAM) ロールを参照することで提供できます。Apache Hive メタストアを使用してデータカタログを管理している場合は、Athena へのアクセスを提供する必要はありません。

ロールを連鎖することで、クラスターがそのクラスターにアタッチされていない別のロールを引き受けることができます。詳細については、「[Amazon Redshift Spectrum での IAM ロールの連鎖](#c-spectrum-chaining-roles)」を参照してください。

アクセスする AWS Glue カタログは、セキュリティを強化するために暗号化されている可能性があります。AWS Glue カタログが暗号化されている場合、AWS KMSカタログにアクセスするために AWS Glue の AWS Glue キーが必要です。詳細については、*[AWS Glueデベロッパーガイド](https://docs.aws.amazon.com/glue/latest/dg/)*の「[AWS Glue データカタログの暗号化](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)」を参照してください。

**Topics**
+ [Amazon S3 のアクセス許可](#spectrum-iam-policies-s3)
+ [クロスアカウント Amazon S3 のアクセス許可](#spectrum-iam-policies-cross-account)
+ [Redshift Spectrum を使用したアクセスを付与あるいは制限するポリシー](#spectrum-iam-policies-spectrum-only)
+ [最小限のアクセス許可を付与するポリシー](#spectrum-iam-policies-minimum-permissions)
+ [Amazon Redshift Spectrum での IAM ロールの連鎖](#c-spectrum-chaining-roles)
+ [AWS Glue データカタログへのアクセスの制御](#c-spectrum-glue-acess)

## Amazon S3 のアクセス許可
<a name="spectrum-iam-policies-s3"></a>

少なくとも、クラスターには Amazon S3 バケットへの GET および LIST アクセスが必要です。バケットがクラスターと同じ AWS アカウントに存在しない場合、バケットは、データにアクセスするための許可をクラスターに付与する必要もあります。詳細については、「[ユーザーに代わって Amazon Redshift が他の AWS サービスにアクセスすることを認可する](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html)」を参照してください。

**注記**  
Amazon S3 バケットは、特定の VPC エンドポイントからのアクセスのみを制限するバケットポリシーを使用できません。

次のポリシーは、あらゆる Amazon S3 バケットに GET および LIST アクセスを付与します。このポリシーは、Redshift Spectrum が COPY 操作と同様に Amazon S3 バケットへアクセスするのを許可します。

------
#### [ JSON ]

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [{
		"Effect": "Allow",
		"Action": ["s3:Get*", "s3:List*"],
		"Resource": "*"
	}]
}
```

------

次のポリシーは、`amzn-s3-demo-bucket` という名前の Amazon S3 バケットへの GET および LIST アクセスを付与します。

------
#### [ JSON ]

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [{
		"Effect": "Allow",
		"Action": ["s3:Get*", "s3:List*"],
		"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
	}]
}
```

------

## クロスアカウント Amazon S3 のアクセス許可
<a name="spectrum-iam-policies-cross-account"></a>

別の AWS アカウントに属している Amazon S3 バケット内のデータにアクセスできる許可を Redshift Spectrum に付与するには、次のポリシーを Amazon S3 バケットに追加します。詳細については、「[クロスアカウントのバケットのアクセス許可を付与](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html)」を参照してください。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Example permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{{111122223333}}:role/{{spectrumrole}}"
            },
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListMultipartUploadParts",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": [
                "arn:aws:s3:::{{bucketname}}",
                "arn:aws:s3:::{{bucketname}}/*"
            ]
        }
    ]
}
```

------

## Redshift Spectrum を使用したアクセスを付与あるいは制限するポリシー
<a name="spectrum-iam-policies-spectrum-only"></a>

次のポリシー例では、Amazon Redshift に対して Amazon S3 バケットへのアクセスを許可します。このポリシーを IAM ロールに追加するときは、Amazon Redshift 専用の IAM ロールを使用することをお勧めします。また、既存のロールを再利用したり、この IAM ロールに余分なアクセス許可を追加したりしないようお勧めします。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucketVersions",
                "s3:ListBucket"
            ],
            "Resource": [ 
                "arn:aws:s3:::amzn-s3-demo-bucket", 
                "arn:aws:s3:::amzn-s3-demo-bucket/*" 
            ]
        }
    ]
}
```

------

## 最小限のアクセス許可を付与するポリシー
<a name="spectrum-iam-policies-minimum-permissions"></a>

次のポリシーは、Redshift Spectrum を Amazon S3、AWS Glue、および Athena で使用するために必要な最小限のアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketVersions",
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::bucketname", 
                "arn:aws:s3:::bucketname/folder1/folder2/*" 
             ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "glue:CreateDatabase",
                "glue:DeleteDatabase",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "glue:UpdateDatabase",
                "glue:CreateTable",
                "glue:DeleteTable",
                "glue:BatchDeleteTable",
                "glue:UpdateTable",
                "glue:GetTable",
                "glue:GetTables",
                "glue:BatchCreatePartition",
                "glue:CreatePartition",
                "glue:DeletePartition",
                "glue:BatchDeletePartition",
                "glue:UpdatePartition",
                "glue:GetPartition",
                "glue:GetPartitions",
                "glue:BatchGetPartition"
            ],
            "Resource": "*"
        }
    ]
}
```

------

AWS Glue の代わりに Athena をデータカタログに使用する場合、このポリシーには Athena に対する完全なアクセス許可が必要となります。次のポリシーは、Athena リソースへのアクセスを付与します。外部データベースが Hive メタストアにある場合は、Athena アクセスは必要ありません。

------
#### [ JSON ]

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [{
		"Effect": "Allow",
		"Action": ["athena:*"],
		"Resource": ["*"]
	}]
}
```

------

## Amazon Redshift Spectrum での IAM ロールの連鎖
<a name="c-spectrum-chaining-roles"></a>

クラスターにロールをアタッチすると、クラスターはそのロールを引き受けて、ユーザーに代わって Amazon S3、Athena、および AWS Glue にアクセスできるようになります。クラスターにアタッチされたロールに必要なリソースへのアクセスがない場合、他のアカウントに属している可能性がある別のロールを連鎖することができます。クラスターは、このデータにアクセスするための連鎖ロールを一時的に引き受けます。また、ロールを連鎖してクロスアカウントアクセスを付与することもできます。最大で 10 個のロールを連鎖できます。連鎖における各ロールは、クラスターが連鎖の末尾のロールを引き受けるまで、連鎖の次のロールを引き受けます。

ロールを連鎖するには、ロール間で信頼関係を確立します。別のロールを引き受けるロールには、特定のロールを引き受けることができるアクセス権限ポリシーがあることが必要です。また、アクセス許可を渡すロールは、別のロールにアクセス許可を渡すことができる信頼ポリシーを保持していることが必要です。詳細については、[Amazon Redshift で IAM ロールを連鎖する](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html#authorizing-redshift-service-chaining-roles)を参照してください。

CREATE EXTERNAL SCHEMA コマンドを実行すると、ロールの ARN のカンマ区切りのリストを含めることで、ロールを連鎖することができます。

**注記**  
連鎖したロールのリストは、空白を含むことができません。

次の例では、`MyRedshiftRole`がクラスターにアタッチされます。`MyRedshiftRole` は、アカウント `AcmeData` に属するロール `111122223333` を引き受けます。

```
create external schema acme from data catalog 
database 'acmedb' region 'us-west-2' 
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole,arn:aws:iam::111122223333:role/AcmeData';
```

## AWS Glue データカタログへのアクセスの制御
<a name="c-spectrum-glue-acess"></a>

データカタログに AWS Glue を使用する場合、IAM ポリシーで AWS Glue データカタログにきめ細かなアクセスコントロールを適用できます。例えば、特定の IAM ロールに少数のデータベースとテーブルのみを公開する場合があります。

以下のセクションで、AWS Glueデータカタログに保存されているデータへのさまざまなレベルアクセスの IAM ポリシーについて説明します。

**Topics**
+ [データベース操作のポリシー](#c-spectrum-glue-acess-database)
+ [テーブル操作のポリシー](#c-spectrum-glue-acess-tables)
+ [パーティション操作のポリシー](#c-spectrum-glue-acess-partitions)

### データベース操作のポリシー
<a name="c-spectrum-glue-acess-database"></a>

データベースを表示および作成するアクセス許可をユーザーに付与する場合、ユーザーにはデータベースと AWS Glue データカタログの両方へのアクセス権限が必要です。

次のサンプルクエリは、データベースを作成します。

```
CREATE EXTERNAL SCHEMA example_db
FROM DATA CATALOG DATABASE 'example_db' region 'us-west-2' 
IAM_ROLE 'arn:aws:iam::redshift-account:role/spectrumrole'
CREATE EXTERNAL DATABASE IF NOT EXISTS
```

次の IAM ポリシーは、データベースを作成するために必要な最小限のアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetDatabase",
                "glue:CreateDatabase"
            ],
            "Resource": [
                "arn:aws:glue:us-west-2:{{111122223333}}:database/example_db",
                "arn:aws:glue:us-west-2:{{111122223333}}:catalog"
            ]
        }
    ]
}
```

------

次のサンプルクエリは、現在のデータベースを表示します。

```
SELECT * FROM SVV_EXTERNAL_DATABASES WHERE
databasename = 'example_db1' or databasename = 'example_db2';
```

次の IAM ポリシーは、現在のデータベースを表示するために必要な最小限のアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetDatabases"
            ],
            "Resource": [
                "arn:aws:glue:us-west-2:{{111122223333}}:database/example_db1",
                "arn:aws:glue:us-west-2:{{111122223333}}:database/example_db2",
                "arn:aws:glue:us-west-2:{{111122223333}}:catalog"
            ]
        }
    ]
}
```

------

### テーブル操作のポリシー
<a name="c-spectrum-glue-acess-tables"></a>

テーブルで表示、作成、削除、変更またはその他のアクションを実行するアクセス許可をユーザーに付与する場合、ユーザーにいくつかのタイプのアクセスを許可する必要があります。テーブルそのものに加え、テーブルが属するデータベース、およびカタログへのアクセス許可が必要です。

次のサンプルクエリは、外部テーブルを作成します。

```
CREATE EXTERNAL TABLE example_db.example_tbl0(
    col0 INT,
    col1 VARCHAR(255)
) PARTITIONED BY (part INT) STORED AS TEXTFILE
LOCATION 's3://test/s3/location/';
```

次の IAM ポリシーは、外部テーブルを作成するために必要な最小限のアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:CreateTable"
            ],
            "Resource": [
                "arn:aws:glue:us-west-2:{{111122223333}}:catalog",
                "arn:aws:glue:us-west-2:{{111122223333}}:database/example_db",
                "arn:aws:glue:us-west-2:{{111122223333}}:table/example_db/example_tbl0"
            ]
        }
    ]
}
```

------

次のサンプルクエリは、それぞれ現在の外部テーブルを表示します。

```
SELECT * FROM svv_external_tables
WHERE tablename = 'example_tbl0' OR
tablename = 'example_tbl1';
```

```
SELECT * FROM svv_external_columns
WHERE tablename = 'example_tbl0' OR
tablename = 'example_tbl1';
```

```
SELECT parameters FROM svv_external_tables
WHERE tablename = 'example_tbl0' OR
tablename = 'example_tbl1';
```

次の IAM ポリシーは、現在の外部テーブルを表示するために必要な最小限のアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetTables"
            ],
            "Resource": [
                "arn:aws:glue:us-west-2:{{111122223333}}:catalog",
                "arn:aws:glue:us-west-2:{{111122223333}}:database/example_db",
                "arn:aws:glue:us-west-2:{{111122223333}}:table/example_db/example_tbl0",
                "arn:aws:glue:us-west-2:{{111122223333}}:table/example_db/example_tbl1"
            ]
        }
    ]
}
```

------

次のサンプルクエリは、既存のテーブルを変更します。

```
ALTER TABLE example_db.example_tbl0
SET TABLE PROPERTIES ('numRows' = '100');
```

次の IAM ポリシーは、既存のテーブルを変更するために必要な最小限のアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetTable",
                "glue:UpdateTable"
            ],
            "Resource": [
                "arn:aws:glue:us-west-2:{{111122223333}}:catalog",
                "arn:aws:glue:us-west-2:{{111122223333}}:database/example_db",
                "arn:aws:glue:us-west-2:{{111122223333}}:table/example_db/example_tbl0"
            ]
        }
    ]
}
```

------

次のサンプルクエリは、既存のテーブルを削除します。

```
DROP TABLE example_db.example_tbl0;                       
```

次の IAM ポリシーは、既存のテーブルを削除するために必要な最小限のアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:DeleteTable"
            ],
            "Resource": [
                "arn:aws:glue:us-west-2:{{111122223333}}:catalog",
                "arn:aws:glue:us-west-2:{{111122223333}}:database/example_db",
                "arn:aws:glue:us-west-2:{{111122223333}}:table/example_db/example_tbl0"
            ]
        }
    ]
}
```

------

### パーティション操作のポリシー
<a name="c-spectrum-glue-acess-partitions"></a>

パーティションレベルの操作 (表示、作成、削除、変更など) を実行するアクセス許可をユーザーに付与する場合、ユーザーにはパーティションが属するテーブルへのアクセス許可が必要です。また、関連するデータベースと AWS Glue データカタログへのアクセス許可も必要です。

次のサンプルクエリは、パーティションを作成します。

```
ALTER TABLE example_db.example_tbl0
ADD PARTITION (part=0) LOCATION 's3://test/s3/location/part=0/';
ALTER TABLE example_db.example_t
ADD PARTITION (part=1) LOCATION 's3://test/s3/location/part=1/';
```

次の IAM ポリシーは、パーティションを作成するために必要な最小限のアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetTable",
                "glue:BatchCreatePartition"
            ],
            "Resource": [
                "arn:aws:glue:us-west-2:{{111122223333}}:catalog",
                "arn:aws:glue:us-west-2:{{111122223333}}:database/example_db",
                "arn:aws:glue:us-west-2:{{111122223333}}:table/example_db/example_tbl0"
            ]
        }
    ]
}
```

------

次のサンプルクエリは、現在のパーティションを表示します。

```
SELECT * FROM svv_external_partitions
WHERE schemname = 'example_db' AND
tablename = 'example_tbl0'
```

次の IAM ポリシーは、現在のパーティションを表示するために必要な最小限のアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetPartitions",
                "glue:GetTables",
                "glue:GetTable"
            ],
            "Resource": [
                "arn:aws:glue:us-west-2:{{111122223333}}:catalog",
                "arn:aws:glue:us-west-2:{{111122223333}}:database/example_db",
                "arn:aws:glue:us-west-2:{{111122223333}}:table/example_db/example_tbl0"
            ]
        }
    ]
}
```

------

次のサンプルクエリは、既存のパーティションを変更します。

```
ALTER TABLE example_db.example_tbl0 PARTITION(part='0')
SET LOCATION 's3://test/s3/new/location/part=0/';
```

次の IAM ポリシーは、既存のパーティションを変更するために必要な最小限のアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetPartition",
                "glue:UpdatePartition"
            ],
            "Resource": [
                "arn:aws:glue:us-west-2:{{111122223333}}:catalog",
                "arn:aws:glue:us-west-2:{{111122223333}}:database/example_db",
                "arn:aws:glue:us-west-2:{{111122223333}}:table/example_db/example_tbl0"
            ]
        }
    ]
}
```

------

次のサンプルクエリは、既存のパーティションを削除します。

```
ALTER TABLE example_db.example_tbl0 DROP PARTITION(part='0');               
```

次の IAM ポリシーは、既存のパーティションを削除するために必要な最小限のアクセス許可を付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:DeletePartition"
            ],
            "Resource": [
                "arn:aws:glue:us-west-2:{{111122223333}}:catalog",
                "arn:aws:glue:us-west-2:{{111122223333}}:database/example_db",
                "arn:aws:glue:us-west-2:{{111122223333}}:table/example_db/example_tbl0"
            ]
        }
    ]
}
```

------