リモートホストからデータをロードする
COPY コマンドでは、Amazon EC2 インスタンスもしくは他のコンピュータなど、1 つ以上のリモートホストから並列的にデータをロードすることができます。COPY では SSH を使用してリモートホストに接続し、そのホスト上でコマンドを実行しテキスト出力を生成します。
リモートホストになることができるのは、Amazon EC2 の Linux インスタンスか、SSH 接続を許可するように設定されている Unix コンピュータまたは Linux コンピュータです。このガイドでは、リモートホストが Amazon EC2 インスタンスであることを前提としています。これ以外のコンピュータの場合に手順が異なるときは、その都度説明します。
Amazon Redshift は複数のホストに接続でき、各ホストに対して複数の SSH 接続を開くことができます。Amazon Redshift は、各接続を介して一意のコマンドを送信し、ホストの標準出力にテキスト出力を生成します。その後、Amazon Redshift はテキストファイルと同じように読み込みます。
開始する前に
開始する前に、以下があることを確認してください。
-
1 台以上のホストマシン (SSH を使用して接続できる Amazon EC2 インスタンスなど)。
-
ホストのデータソース。
テキスト出力を生成するために Amazon Redshift クラスターがホストで実行するコマンドを指定します。COPY コマンドは、クラスターがホストに接続するとコマンドを実行し、ホストの標準的な出力先からテキストを読み込み、Amazon Redshift テーブルにデータを並列的にロードします。テキストの出力は、COPY コマンドが取り込むことができる形式であることが必要です。詳細については、「入力データを準備する」を参照してください。
-
コンピュータからホストへのアクセス権。
Amazon EC2 インスタンスでは、ホストにアクセスする際に SSH 接続を使用します。このため、ホストにアクセスし、ホストの承認されたキーファイルに Amazon Redshift クラスターの公開キーを追加する必要があります。
-
実行中の Amazon Redshift クラスター。
クラスターを起動する方法については、Amazon Redshift 入門ガイドを参照してください。
データをロードする手順
このセクションでは、リモートホストからデータをロードする手順を説明します。以下のセクションでは、各ステップで必要な操作の詳細を説明します。
-
ステップ 1: クラスターパブリックキーおよびクラスターノード IP アドレスを取得する
公開キーは、Amazon Redshift クラスターノードがリモートホストへの SSH 接続を確立するために使用されます。各クラスターノードの IP アドレスを使用して、その IP アドレスによる Amazon Redshift クラスターからのアクセスを許可するように、ホストのセキュリティグループまたはファイアウォールを設定します。
-
ステップ 2: ホストの承認されたキーファイルに Amazon Redshift クラスターの公開キーを追加する
ホストが Amazon Redshift クラスターを認識し、SSH 接続を許可するように、ホストの認可されたキーファイルに Amazon Redshift クラスターの公開キーを追加します。
-
ステップ 3: Amazon Redshift クラスターの IP アドレスすべてを許可するようにホストを設定する
Amazon EC2 の場合、インスタンスのセキュリティグループを変更して、Amazon Redshift の IP アドレスを許可する入力ルールを追加します。他のホストの場合には、Amazon Redshift ノードがリモートホストに対して SSH 接続を確立できるようにファイアウォールを設定します。
-
Amazon Redshift がホストの識別に公開キーを使用するように指定することもできます。この場合、パブリックキーを探してマニフェストファイルにテキストをコピーする必要があります。
-
マニフェストは、Amazon Redshift がホストに接続し、データを取得する際に必要になる詳細情報が記載された JSON 形式のテキストファイルです。
-
ステップ 6: Amazon S3 バケットにマニフェストファイルをアップロードする
Amazon Redshift はマニフェストを読み込み、その情報を使ってリモートホストに接続します。Amazon S3 バケットが Amazon Redshift クラスターと同じリージョンに存在しない場合は、REGION オプションを使用して、データがあるリージョンを指定する必要があります。
-
ステップ 7: COPY コマンドを実行してデータをロードする
Amazon Redshift データベースから COPY コマンドを実行して、Amazon Redshift テーブルにデータをロードします。
ステップ 1: クラスターパブリックキーおよびクラスターノード IP アドレスを取得する
ホストのセキュリティグループに各クラスターノードの IP アドレスを設定し、その IP アドレスで Amazon Redshift クラスターからアクセスできるようにします。
コンソールを使用してクラスターパブリックキーとクラスターのクラスターノード IP アドレスを取得する方法は、以下のとおりです。
-
Amazon Redshift マネジメントコンソールにアクセスします。
-
ナビゲーションペインで [Clusters] (クラスター) リンクを選択します。
-
リストからクラスターを選択します。
-
[SSH 取り込み設定] グループを探します。
[クラスターパブリックキー] と [ノード IP アドレス] の内容を書き留めておきます。この 2 つは、後のステップで使用します。
この IP アドレスは、ステップ 3 で Amazon Redshift からの接続を許可するようにホストを設定するために使用します。接続するホストの種類や、ホストが VPC であるかに応じて、パブリック IP アドレスとプライベート IP アドレスのどちらかを使用します。
Amazon Redshift CLI を使用してクラスター公開キーとクラスターノード の IP アドレスを取得するには、describe-clusters コマンドを実行します。
例:
aws redshift describe-clusters --cluster-identifier <cluster-identifier>
応答には、以下のような ClusterPublicKey 値とプライベートおよびパブリック IP アドレスのリストが含まれます。
{ "Clusters": [ { "VpcSecurityGroups": [], "ClusterStatus": "available", "ClusterNodes": [ { "PrivateIPAddress": "10.nnn.nnn.nnn", "NodeRole": "LEADER", "PublicIPAddress": "10.nnn.nnn.nnn" }, { "PrivateIPAddress": "10.nnn.nnn.nnn", "NodeRole": "COMPUTE-0", "PublicIPAddress": "10.nnn.nnn.nnn" }, { "PrivateIPAddress": "10.nnn.nnn.nnn", "NodeRole": "COMPUTE-1", "PublicIPAddress": "10.nnn.nnn.nnn" } ], "AutomatedSnapshotRetentionPeriod": 1, "PreferredMaintenanceWindow": "wed:05:30-wed:06:00", "AvailabilityZone": "us-east-1a", "NodeType": "dc2.large", "ClusterPublicKey": "ssh-rsa AAAABexamplepublickey...Y3TAl Amazon-Redshift", ... ... }
Amazon Redshift API を使用してクラスターの公開キーとクラスターノード IP アドレスを取得するには、DescribeClusters アクションを使用します。詳細については、Amazon Redshift CLI ガイドの describe-clusters または Amazon Redshift API ガイドの DescribeClusters を参照してください。
ステップ 2: ホストの承認されたキーファイルに Amazon Redshift クラスターの公開キーを追加する
ホストが Amazon Redshift を認識して SSH 接続を許可するように、各ホストの承認されたキーファイルにクラスターの公開キーを追加します。
Amazon Redshift クラスターの公開キーをホストの認可されたキーファイルに追加するには
-
SSH 接続を使用してホストにアクセスします。
SSH を使用したインスタンスへの接続については、Amazon EC2 ユーザーガイドの インスタンスへの接続を参照してください。
-
コンソールまたは CLI 応答のテキストから Amazon Redshift の公開キーをコピーします。
-
パブリックキーの内容をコピーして、リモートホストの
/home/<ssh_username>/.ssh/authorized_keys
ファイルに貼り付けます。<ssh_username>
は、マニフェストファイルの [username] フィールドの値と一致している必要があります。プレフィックス "ssh-rsa
" やサフィックス "Amazon-Redshift
" も含めた完全な文字列を入力してください。次に例を示します。ssh-rsa AAAACTP3isxgGzVWoIWpbVvRCOzYdVifMrh… uA70BnMHCaMiRdmvsDOedZDOedZ Amazon-Redshift
ステップ 3: Amazon Redshift クラスターの IP アドレスすべてを許可するようにホストを設定する
Amazon EC2 インスタンスまたは Amazon EMR クラスターを使用する場合は、ホストのセキュリティグループにインバウンドルールを追加して、各 Amazon Redshift クラスターノードからのトラフィックを許可します。[タイプ] として、ポート 22 での TCP プロトコルを使用した SSH を選択します。[Source (ソース)] には、ステップ 1: クラスターパブリックキーおよびクラスターノード IP アドレスを取得する で取得した Amazon Redshift クラスターノード IP アドレスを入力します。Amazon EC2 セキュリティグループへのルール追加の詳細については、Amazon EC2 ユーザーガイドからインスタンスのインバウンドトラフィックの認可を参照してください。
プライベート IP アドレスを使用する局面は、以下のとおりです。
-
Virtual Private Cloud (VPC) に存在しない Amazon Redshift クラスターと Amazon EC2 - Classic インスタンスがいずれも同じ AWS リージョンにある場合。
-
VPC に存在する Amazon Redshift クラスターと Amazon EC2 - VPC インスタンスがいずれも同じ AWS リージョンにあり、かつ同じ VPC に存在する場合。
これ以外の場合には、パブリック IP アドレスを使用します。
VPC での Amazon Redshift の使用についての詳細は、「Amazon Redshift 管理ガイド」の「仮想プライベートクラウド (VPC) でクラスターを管理する」を参照してください。
ステップ 4: ホストのパブリックキーを取得する
Amazon Redshift がホストを識別できるように、マニフェストファイルでホストの公開キーを指定することもできます。COPY コマンドではホストのパブリックキーは必須でないものの、セキュリティの観点から「中間者 (MITM) 」攻撃の予防のため、パブリックキーを使用することを強くお勧めしています。
ホストのパブリックキーは、以下の場所にあります。ここで <ssh_host_rsa_key_name>
は、ホストのパブリックキーのユニーク名です。
: /etc/ssh/<ssh_host_rsa_key_name>.pub
注記
Amazon Redshift は RSA キーのみをサポートしています。DSA キーはサポートしていません。
パブリックキーのテキストは、ステップ 5 でマニフェストファイルを作成するときにマニフェストファイルのエントリにある [Public Key] フィールドに貼り付けることになります。
ステップ 5: マニフェストファイルを作成する
COPY コマンドは、SSH を使用して複数のホストに接続できるだけでなく、各ホストに対して複数の SSH 接続を作成できます。COPY はそれぞれのホスト接続を介してコマンドを実行し、コマンドからの出力を並列的にテーブルにロードします。マニフェストファイルは、Amazon Redshift がホストに接続する際に使用する JSON 形式のテキストファイルです。マニフェストファイルにより、SSH ホストのエンドポイントと、Amazon Redshift にデータを返すためにそのホストで実行されるコマンドを指定します。このほか、ホストのパブリックキー、ログインユーザー名、および各エントリの必須フラグを記載することもできます。
マニフェストファイルをローカルコンピュータで作成します。後の手順で、Amazon S3 にファイルをアップロードします。
マニフェスト ファイルの形式は以下のとおりです。
{ "entries": [ {"endpoint":"<ssh_endpoint_or_IP>", "command": "<remote_command>", "mandatory":true, "publickey": "<public_key>", "username": "<host_user_name>"}, {"endpoint":"<ssh_endpoint_or_IP>", "command": "<remote_command>", "mandatory":true, "publickey": "<public_key>", "username": "host_user_name"} ] }
マニフェストファイルには、SSH 接続ごとに 1 つずつ "entries" 構造が含まれます。各エントリは、1 つの SSH 接続を表します。単一のホストに対して接続を複数作成することも、複数のホストに対して複数の接続を作成することもできます。二重引用符は、フィールド名と値のどちらにも必要です。必須フィールドのなかで二重引用符を必要としない値は、true
または false
のブール値のみです。
以下に、マニフェストファイルのフィールドについて説明します。
- endpoint
-
ホストの URL アドレスまたは IP アドレス。たとえば、"
ec2-111-222-333.compute-1.amazonaws.com
"、"22.33.44.56
" などです。 - コマンド
-
テキストまたはバイナリ (gzip、lzop、または bzip2) の出力を生成する際にホストが実行するコマンド。コマンドは、ユーザー "host_user_name" が実行権限を持つコマンドであれば、どれでも指定できます。ファイルを印刷するなどのシンプルなコマンドでも、データベースにクエリを実行したり、スクリプトを実行したりするコマンドでもかまいません。出力 (テキストファイル、gzip バイナリファイル、lzop バイナリファイル、または bzip2 バイナリファイル) は、Amazon Redshift の COPY コマンドが取り込める形式にする必要があります。詳細については、「入力データを準備する」を参照してください。
- publickey
-
(オプション) ホストのパブリックキー。公開キーが指定されている場合、Amazon Redshift は公開キーを使用してホストを特定します。公開キーが指定されていなければ、Amazon Redshift がホストの特定を試みることはありません。例えば、リモートホストのパブリックキーが
ssh-rsa AbcCbaxxx…xxxDHKJ root@amazon.com
であれば、publickey フィールドにはAbcCbaxxx…xxxDHKJ
と入力してください。 - 必須
-
(オプション) 接続ができなかった場合に COPY コマンドを失敗とするかどうかを示すものです。デフォルトは
false
です。Amazon Redshift が接続を 1 つも正常に確立できなかった場合に、COPY コマンドが失敗になります。 - username
-
(オプション) ホストシステムにログオンし、リモートコマンドを実行する際に使用するユーザーネーム。ユーザーログイン名は、ステップ 2 でホストの認可されたキーファイルにパブリックキーを追加するときに使用したログイン名と同じものにする必要があります。デフォルトのユーザー名は「redshift」です。
以下の例に、同じホストに対して 4 つの接続を確立し、接続ごとに異なるコマンドを実行するマニフェストの全容を示します。
{ "entries": [ {"endpoint":"ec2-184-72-204-112.compute-1.amazonaws.com", "command": "cat loaddata1.txt", "mandatory":true, "publickey": "ec2publickeyportionoftheec2keypair", "username": "ec2-user"}, {"endpoint":"ec2-184-72-204-112.compute-1.amazonaws.com", "command": "cat loaddata2.txt", "mandatory":true, "publickey": "ec2publickeyportionoftheec2keypair", "username": "ec2-user"}, {"endpoint":"ec2-184-72-204-112.compute-1.amazonaws.com", "command": "cat loaddata3.txt", "mandatory":true, "publickey": "ec2publickeyportionoftheec2keypair", "username": "ec2-user"}, {"endpoint":"ec2-184-72-204-112.compute-1.amazonaws.com", "command": "cat loaddata4.txt", "mandatory":true, "publickey": "ec2publickeyportionoftheec2keypair", "username": "ec2-user"} ] }
ステップ 6: Amazon S3 バケットにマニフェストファイルをアップロードする
Amazon S3 バケットにマニフェストファイルをアップロードします。Amazon S3 バケットが Amazon Redshift クラスターと同じ AWS リージョンに存在しない場合は、REGION オプションを使用して、マニフェストがある AWS リージョンを指定する必要があります。Amazon S3 バケットの作成およびファイルのアップロードの詳細については、Amazon Simple Storage Service のユーザーガイドを参照してください。
ステップ 7: COPY コマンドを実行してデータをロードする
COPY コマンドを実行してホストに接続し、Amazon Redshift テーブルにデータをロードします。COPY コマンドでは、マニフェストファイルに Amazon S3 オブジェクトのパスを明示するとともに、SSH オプションを使用します。例:
COPY sales FROM 's3://amzn-s3-demo-bucket/ssh_manifest' IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' DELIMITER '|' SSH;
注記
自動圧縮を使用する場合には、COPY コマンドでデータの読み取りが 2 回実行されます。つまりリモートコマンドが 2 回実行されることになります。初回の読み取りは圧縮の分析用サンプルを提供するためのものであり、実際にデータがロードされるのは 2 回目の読み取りです。リモートコマンドを 2 回実行することによる影響が問題になるようであれば、自動圧縮は無効にする必要があります。自動圧縮を無効にするには、COMPUPDATE オプションを OFF に設定して COPY コマンドを実行します。詳細については、「自動圧縮ありでテーブルをロードする」を参照してください。