

 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 S3 への暗号化されたデータのアップロード
<a name="t_uploading-encrypted-data"></a>

Amazon S3 は、サーバー側の暗号化とクライアント側の暗号化のどちらもサポートします。このトピックでは、サーバー側暗号化とクライアント側暗号化の違いを説明し、Amazon Redshift でクライアント側暗号化を使用するステップを紹介します。サーバー側暗号化は Amazon Redshift に対して透過的です。

## サーバー側の暗号化
<a name="server-side-encryption"></a>

サーバー側の暗号化は、保管時のデータ暗号化です。つまり、Amazon S3 がデータをアップロードするときにデータを暗号化し、アクセス時にデータを復号化します。COPY コマンドを使用してテーブルをロードする場合には、Amazon S3 にあるサーバー側で暗号化したオブジェクトや暗号化していないオブジェクトからロードする場合との間に差はありません。サーバー側の暗号化の詳細については、*Amazon Simple Storage Service ユーザーガイド*の[サーバー側の暗号化の使用](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html)を参照してください。

## クライアント側の暗号化
<a name="client-side-encryption"></a>

クライアント側の暗号化の場合、データの暗号化、暗号化キー、および関連ツールを管理するのはクライアントアプリケーションです。クライアント側の暗号化を使って Amazon S3 バケットにデータをアップロードし、その後、COPY コマンド (ENCRYPTED オプション) とプライベート暗号化キーを使ってデータをより安全にロードすることができます。

エンベロープ暗号化を使い、データを暗号化します。*エンベロープ暗号化*を使うと、アプリケーションですべての暗号化が排他的に処理されます。プライベート暗号化キーと暗号化されていないデータが AWS に送信されることはありません。したがって、暗号化キーを安全に管理することが重要となります。暗号化キーをなくした場合はデータを復号できなくなります。また、AWS から暗号化キーを復元することはできません。エンベロープ暗号化では、非同期キーによるキー管理によりセキュリティを高めながら、高速の同期暗号化のパフォーマンスを実現します。Amazon S3 暗号化クライアントは、データを暗号化するためにワンタイム使用の対称キー (エンベロープ対称キー) を生成します。その後、そのキーはルートキーにより暗号化され、データとともに Amazon S3 に保存されます。Amazon Redshift がロード時にデータにアクセスするとき、暗号化された同期キーが取得され、本物のキーで復号され、その後、データが復号されます。

Amazon Redshift で Amazon S3 クライアント側の暗号化データを操作するには、*Amazon Simple Storage Service ユーザーガイド*の[クライアント側の暗号化を使用したデータの保護](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html)にて説明されているステップに従います。使用する追加の要件はこちらです:
+ **対称暗号化** – AWS SDK for Java `AmazonS3EncryptionClient` クラスは、前述の、対称キー暗号化に基づくエンベロープ暗号化を使用します。このクラスを使用して、Amazon S3 クライアントを作成し、クライアント側暗号化データをアップロードします。
+ **256 ビット AES ルート対称キー** – ルートキーはエンベロープキーを暗号化します。ルートキーは、`AmazonS3EncryptionClient` クラスのインスタンスに渡す必要があります。このキーは、Amazon Redshift にデータをコピーするときに必要になるので、キーを保存する必要があります。
+ **暗号化されたエンベロープキーを保存するオブジェクトメタデータ** — Amazon S3 のデフォルトでは、エンベロープキーは `AmazonS3EncryptionClient` クラスのオブジェクトメタデータとして保存されます。オブジェクトメタデータとして保存された暗号化されたエンベロープキーは、復号プロセスで使用されます。

**注記**  
初めて暗号化 API を使用するときに暗号の暗号化エラーメッセージが表示される場合、使用する JDK のバージョンに、暗号化/復号変換に使用する最大キー長を 128 ビットに制限する Java Cryptography Extension (JCE) 管轄ポリシーファイルが含まれている可能性があります。この問題に対処する方法については、*Amazon Simple Storage Service ユーザーガイド*の「[AWS SDK for Java を使用したクライアント側の暗号化の指定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryptionUpload.html)」を参照してください。

クライアント側で暗号化したファイルを COPY コマンドを使用して Amazon Redshift テーブルにロードする方法については、[暗号化されたデータファイルを Amazon S3 からロードする](c_loading-encrypted-files.md) を参照してください。

## 例: クライアント側暗号化データのアップロード
<a name="client-side-encryption-example"></a>

AWS SDK for Java を使用してクライアント側の暗号化データをアップロードする例については、*Amazon Simple Storage Service ユーザーガイド*の「[クライアント側の暗号化を使用したデータの保護](https://docs.aws.amazon.com/AmazonS3/latest/userguide/encrypt-client-side-symmetric-master-key.html)」を参照してください。

2 つ目のオプションで、データを Amazon Redshift にロードできるように、クライアント側で暗号化を行う際に選択すべき点を示しています。具体的には、オブジェクトメタデータを使用して暗号化されたエンベロープキーを保存する方法と、256 ビット AES マスター対称キーを使用する方法についてです。

ここでは、AWS SDK for Java を使用して 256 ビットの AES 対称ルートキーを作成し、それをファイルに保存するためのコード例を示します。次に、この例ではサンプルデータを S3 暗号化クライアントを使用してクライアント側で最初に暗号化し、オブジェクトを Amazon S3 にアップロードします。この例ではオブジェクトもダウンロードして、データが同じであることを確認します。