원격 호스트에서 데이터 로드
COPY 명령을 사용하면 Amazon EC2 인스턴스나 다른 컴퓨터 같은 하나 이상의 원격 호스트에서 병렬로 파일을 로드할 수 있습니다. COPY는 SSH를 사용하여 원격 호스트에 연결하고 원격 호스트에서 명령을 실행해 텍스트 출력을 생성합니다.
원격 호스트는 Amazon EC2 Linux 인스턴스이거나 SSH 연결을 허용하도록 구성된 다른 Unix 또는 Linux 컴퓨터일 수 있습니다. 이 안내서에서는 원격 호스트가 Amazon EC2 인스턴스라고 가정합니다. 다른 컴퓨터의 절차가 다를 경우, 안내서에서 차이점을 명시합니다.
Amazon Redshift는 여러 호스트에 연결할 수 있으며 각 호스트에 대해 여러 SSH 연결을 열 수 있습니다. Amazon Redshift는 각 연결을 통해 고유한 명령을 전송하여 호스트의 표준 출력에 대한 텍스트 출력을 생성합니다. 그러면 Amazon Redshift가 텍스트 파일을 읽을 때 텍스트 출력을 읽습니다.
시작하기 전 준비 사항
시작하기 전에 다음을 갖추고 있어야 합니다.
-
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 옵션을 사용하여 데이터가 위치한 리전을 지정해야 합니다.
-
Amazon Redshift 데이터베이스에서 COPY 명령을 실행하여 Amazon Redshift 테이블로 데이터를 로드합니다.
1단계: 클러스터 퍼블릭 키와 클러스터 노드 IP 주소 검색
각 클러스터 노드의 IP 주소를 사용하여 이러한 IP 주소를 사용하는 Amazon Redshift 클러스터로부터의 액세스를 허용하도록 호스트 보안 그룹을 구성합니다.
콘솔을 사용하여 클러스터 퍼블릭 키와 클러스터의 클러스터 노드 IP 주소를 검색하려면
-
Amazon Redshift 관리 콘솔에 액세스합니다.
-
탐색 창에서 Clusters(클러스터) 링크를 선택합니다.
-
목록에서 해당 인스턴스를 선택합니다.
-
SSH 처리 설정 그룹을 찾습니다.
클러스터 퍼블릭 키와 노드 IP 주소를 적어 둡니다. 이후 단계에서 사용하게 됩니다.
3단계의 IP 주소를 사용하여 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 Guide의 describe-clusters 또는 Amazon Redshift API Guide의 DescribeClusters 섹션을 참조하세요.
2단계: 호스트의 권한 부여된 키 파일에 Amazon Redshift 클러스터 퍼블릭 키 추가
호스트가 Amazon Redshift를 인식하고 SSH 연결을 수락하도록 각 호스트의 권한 부여된 키 파일에 클러스터 퍼블릭 키를 추가합니다.
호스트의 권한 부여된 키 파일에 Amazon Redshift 클러스터 퍼블릭 키를 추가하려면
-
SSH 연결을 사용하여 호스트에 액세스합니다.
SSH를 사용하여 인스턴스에 연결에 대한 자세한 내용은 Amazon EC2 User Guide의 Connect to Your Instance 섹션을 참조하세요.
-
콘솔 또는 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를 선택합니다. 소스에, 1단계: 클러스터 퍼블릭 키와 클러스터 노드 IP 주소 검색에서 가져온 Amazon Redshift 클러스터 노드 IP 주소를 입력합니다. Amazon EC2 보안 그룹에 규칙 추가에 대한 자세한 내용은 Amazon EC2 User Guide의 Authorizing Inbound Traffic for Your Instances 섹션을 참조하세요.
프라이빗 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 관리 가이드의 Virtual Private Cloud(VPC)의 클러스터 관리 섹션을 참조하세요.
4단계: 호스트의 퍼블릭 키 가져오기
필요한 경우 Amazon Redshift가 호스트를 식별할 수 있도록 매니페스트 파일에서 호스트의 퍼블릭 키를 제공할 수 있습니다. COPY 명령은 호스트 퍼블릭 키가 필요하지 않지만 보안상 이유로 '중간자' 공격 예방을 위해 퍼블릭 키를 사용하는 것이 좋습니다.
호스트의 퍼블릭 키는 다음 위치에서 찾을 수 있습니다. 여기서 <ssh_host_rsa_key_name>
은 호스트 퍼블릭 키의 고유 이름입니다.
: /etc/ssh/<ssh_host_rsa_key_name>.pub
참고
Amazon Redshift는 RSA 키만 지원합니다. DSA 키는 지원되지 않습니다.
5단계에서 매니페스트 파일을 만들 때 퍼블릭 키의 텍스트를 매니페스트 파일의 "Public Key" 필드에 붙여 넣습니다.
5단계: 매니페스트 파일 생성
COPY 명령은 SSH를 사용하여 다수의 호스트에 연결할 뿐만 아니라 각 호스트마다 SSH 연결을 생성할 수 있습니다. 이렇게 생성된 각 호스트 연결을 통해 명령을 실행하고, 명령을 통해 출력되는 데이터를 병렬 방식으로 테이블에 로드합니다. 매니페스트 파일은 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 연결마다 "entries" 구문이 하나씩 포함됩니다. 각 항목은 단일 SSH 연결을 나타냅니다. 단일 호스트에 다중 연결을, 혹은 다수의 호스트에 다중 연결을 생성할 수 있습니다. 예시와 같이 필드 이름과 값에는 큰따옴표가 필요합니다. 큰따옴표가 필요 없는 유일한 값은 필수 필드의 부울 값 true
또는 false
입니다.
다음은 매니페스트 파일의 필드에 대한 설명입니다.
- 엔드포인트
-
호스트의 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
인 경우, public key 필드에 다음 텍스트를 입력합니다.AbcCbaxxx…xxxDHKJ
- mandatory
-
(선택적) 연결이 실패하는 경우에 COPY 명령이 실패해야 하는지 여부를 나타냅니다. 기본값은
false
입니다. Amazon Redshift가 하나 이상 연결에 성공하지 못하면 COPY 명령이 중단됩니다. - 사용자 이름
-
(옵션) 호스트 시스템에 로그온하고 원격 명령을 실행하기 위해 사용할 사용자 이름입니다. 사용자 로그인 이름은 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회 실행이 잠재적인 부작용으로 인해 문제를 일으킬 수 있는 경우, 자동 압축을 꺼야 합니다. 자동 압축을 끄려면 COMPUPDATE 옵션을 OFF로 설정하여 COPY 명령을 실행합니다. 자세한 내용은 자동 압축을 사용하여 테이블 로드 단원을 참조하십시오.