从远程主机中执行 COPY 操作 (SSH)
您可使用 COPY 命令从一台或多台远程主机并行加载数据,例如 Amazon Elastic Compute Cloud (Amazon EC2) 实例或其他计算机。COPY 使用 Secure Shell (SSH) 连接到远程主机并在远程主机上运行命令以生成文本输出。远程主机可以是 EC2 Linux 实例或配置为接受 SSH 连接的另一台 Unix 或 Linux 计算机。Amazon Redshift 可连接到多台主机,并可以打开到每台主机的多个 SSH 连接。Amazon Redshift 会通过每个连接发送一个唯一命令来生成到主机标准输出的文本输出,然后 Amazon Redshift 会像读取文本文件一样读取它。
使用 FROM 子句指定一个清单文件的 Amazon S3 对象键,该清单文件提供 COPY 用于建立 SSH 连接并执行远程命令的信息。
重要
如果包含清单文件的 S3 桶未驻留在您的集群所在的 AWS 区域内,则必须使用 REGION 参数指定该桶所在的区域。
语法
FROM 's3://'ssh_manifest_file' } authorization SSH | optional-parameters
示例
以下示例使用清单文件从使用 SSH 的远程主机加载数据。
copy sales from 's3://amzn-s3-demo-bucket/ssh_manifest' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' ssh;
参数
- FROM
-
要加载的数据的源。
- 's3://copy_from_ssh_manifest_file'
-
COPY 命令可连接到使用 SSH 的多台主机,并可以与每台主机建立多个 SSH 连接。COPY 通过每个主机连接运行一个命令,然后将来自这些命令的输出并行加载到表中。s3://copy_from_ssh_manifest_file 参数指定一个清单文件的 Amazon S3 对象键,该清单文件提供 COPY 将用于建立 SSH 连接并执行远程命令的信息。
s3://copy_from_ssh_manifest_file 参数必须显式引用单个文件;它不能是键前缀。下面是一个示例:
's3://amzn-s3-demo-bucket/ssh_manifest.txt'
清单文件是 Amazon Redshift 用于连接主机的文本文件,采用 JSON 格式。清单文件指定 SSH 主机端点以及将在主机上运行的用于将数据返回到 Amazon Redshift 的命令。另外,您还可以包含主机公有密钥、登录用户名和每个条目的 mandatory 标志。以下示例显示了用于创建两个 SSH 连接的清单文件:
{ "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 连接包含一个
"entries"
结构。您可以与单台主机建立多个连接或与多台主机建立多个连接。如上所示,字段名称和值均需要使用双引号字符。引号字符必须是简单引号 (0x22),而不能是倾斜引号或“智能”引号。唯一一个不需要双引号字符的值是"mandatory"
字段的布尔值true
或false
。以下列表介绍了清单文件中的字段。
- endpoint
-
主机的 URL 地址或 IP 地址,例如
"ec2-111-222-333.compute-1.amazonaws.com"
或"198.51.100.0"
。 - 命令
-
命令通过主机运行,用以产生 gzip、lzop、bzip2 或 zstd 格式的文本输出或二进制输出。该命令可以是用户 "host_user_name" 有权运行的任何命令。该命令可以是像打印文件这样简单的命令,也可以查询数据库或启动脚本。输出(文本文件、gzip 二进制文件、lzop 二进制文件或 bzip2 二进制文件)必须采用 Amazon Redshift COPY 命令可摄取的形式。有关更多信息,请参阅 准备输入数据。
- publickey
-
(可选)主机的公有密钥。如果提供了公有密钥,Amazon Redshift 将使用它来标识主机。如果未提供公有密钥,Amazon Redshift 将不会尝试主机标识。例如,如果远程主机的公有密钥是
ssh-rsa AbcCbaxxx…Example root@amazon.com
,请在公有密钥字段中键入以下文本:"AbcCbaxxx…Example"
- mandatory
-
(可选)一个子句,指示在连接尝试失败时 COPY 命令是否应失败。默认为
false
。如果 Amazon Redshift 未成功建立至少一个连接,COPY 命令将失败。 - username
-
(可选)将用于登录到主机系统并执行远程命令的用户名。用户登录名必须与用于将 Amazon Redshift 集群的公有密钥添加到主机的授权密钥文件的登录名相同。默认用户名为
redshift
。
有关创建清单文件的更多信息,请参阅加载数据的过程。
要从远程主机执行 COPY 操作,则必须在 COPY 命令中指定 SSH 参数。如果未指定 SSH 参数,COPY 命令将假定使用 FROM 指定的文件是数据文件,操作将会失败。
如果使用自动压缩,COPY 命令将执行两个数据读取操作,这意味着它将执行远程命令两次。第一个读取操作用于提供压缩分析的数据样本,第二个读取操作实际加载数据。如果执行远程命令两次可能会导致问题,则应禁用自动压缩。要禁用自动压缩,请在运行 COPY 命令时将 COMPUPDATE 参数设置为 OFF。有关更多信息,请参阅 使用自动压缩加载表。
有关从 SSH 执行 COPY 操作的详细过程,请参阅从远程主机中加载数据。
- 授权
-
COPY 命令需要授权才能访问其他 AWS 资源(包括 Amazon S3 、Amazon EMR、Amazon DynamoDB 和 Amazon EC2)中的数据。您可通过引用附加到您的集群的 AWS Identity and Access Management (IAM) 角色(基于角色的访问控制)或者通过为用户提供访问凭证(基于密钥的访问控制)来提供授权。为了提高安全性和灵活性,我们建议使用基于 IAM 角色的访问控制。有关更多信息,请参阅 授权参数。
- SSH
-
一个子句,指定要从使用 SSH 协议的远程主机加载数据。如果指定 SSH,则必须使用 s3://copy_from_ssh_manifest_file 参数提供清单文件。
注意
如果您通过 SSH 在远程 VPC 中使用私有 IP 地址从主机进行复制,则 VPC 必须启用增强型 VPC 路由。有关增强型 VPC 路由的更多信息,请参阅 Amazon Redshift 增强型 VPC 路由。
可选参数
对于从 SSH 执行 COPY 的操作,还可以选择指定以下参数:
不支持的参数
对于从 SSH 执行 COPY 的操作,不能使用以下参数:
-
ENCRYPTED
-
MANIFEST
-
READRATIO