R에서 AWS S3, RDS 접속하기

DB운영, 웹호스팅, 딥러닝 모델 구동 등의 작업들이 과거에는 별도의 서버 컴퓨터를 운영하거나 딥러닝용 GPU가 달려있는 분석용 PC를 구비해야만 가능했다면 이제는 Cloud 서비스에 일정한 사용료만 지불하면 인터넷에 연결된 1kg도 채 안 되는 노트북에서도 이 모든 것을 운영하고 관리할 수 있게 되었다.

대표적인 Cloud 서비스로 아마존에서 제공하는 AWS(Amazon Web Service)가 있는데 AgData Lab에서는 AWS의 파일저장 서비스인 S3, 관계형 데이터베이스 서비스인 RDS, 딥러닝 모델 훈련을 위한 GPU 기반 가상 컴퓨팅 서비스인 EC2를 사용하고 있다. agdatalab 블로그도 AWS S3의 정적 웹 호스팅 서비스를 통해서 호스팅되고 있다. 이왕 AWS를 사용하는 김에 이번 Post에서는 R에서 AWS의 S3와 RDS에 접속하는 방법에 대해서 정리해보자.

AWS의 API를 이용하기 위해서는 보안자격증명에서 Access Key, Security Key를 받아야 한다 <참고>. AWS Management console에서 csv파일로 다운로드가 가능한데 이 정보는 절대 외부에 노출되어서는 안된다. 해킹을 당하는 순간 발생할 수 있는 사용료 폭탄과 불법적인 데이터 유통 정도만 상상해보더라도 조심할 수밖에 없다.

보안자격증명 정보, RDS 계정정보를 R환경파일에 기록

일단 Access Key와 Security Key 정보를 획득했다면 R 최신 버전이 설치된 PC의 C:/Program Files/R/R-3.x.x/etc 폴더를 확인해보자. Renviron.site 파일이 보이는가? 보인다면 텍스트 편집기로 파일을 열어서 제일 하단에 추가하면 되고, 보이지 않는다면 텍스트 편집기로 이 파일을 만든 후 아래와 같이 필요한 정보들을 추가하면 된다. S3, RDS 생성은 AWS 공식 사이트의 설명서를 참고해도 되지만 일반 블로거들이 정리한 것이 더 이해하기는 편하다. (참고: S3 만들기, RDS 만들기)

  AWS_ACCESS_KEY_ID="My Access Key"
  AWS_SECRET_ACCESS_KEY="My Security Key"
  AWS_DEFAULT_REGION="My region ex)us-east-1"
  RDS_USER="RDS 인스턴스 생성때 만든 username"
  RDS_PASSWORD="RDS user의 password"
  RDS_HOST="RDS 인스턴스 정보에서 확인가능한 end-point"
S3 접속 후 읽고 쓰기

R에서 S3에 접속하기 위해서는 aws.s3 패키지의 설치가 필요하다. Access Key와 Security Key를 Renviron.site 파일에 이미 기록했기 때문에 별도의 세팅 명령은 필요없다. library() 함수로 aws.s3 패키지를 불러들인 후 bucketlist()를 실행시키면 S3에 생성된 버킷 리스트를 보여준다.

  library(aws.s3)
  setwd('D:/s3_data/')
  bucketlist() # 버킷 확인

먼저 S3에 있는 파일을 내 PC의 Working Directory에 저장한 후 다시 R에서 불러오는 방법은 아래와 같다.

  get_bucket("버킷명/폴더명")
  save_object("iris.csv", bucket="버킷명/폴더명", file="iris_local.csv")
  df <- read.csv("iris_local.csv")

파일이 csv파일이라서 굳이 PC에 저장할 필요가 없이 R에서 메모리로 불러와 바로 사용하는 경우는 아래와 같이 data.frame 형태의 데이터로 읽어올 수 있다.

  usercsvobj <- get_object("s3://버킷명/폴더명/iris.csv")
  csvcharobj <- rawToChar(usercsvobj)
  conn <- textConnection(csvcharobj)
  data <- read.csv(conn)
  close(con)

Working Directory에 있는 파일을 S3에 저장하는 방법은 아래와 같다.

  put_object("iris_local.csv", bucket="버킷명/폴더명")
RDS 접속 후 읽고 쓰기

AWS RDS 접속을 위해서는 RDS 인스턴스의 보안그룹 설정에서 접속하려는 PC의 IP, 방화벽 등의 정보를 추가해줘야 한다. 이 부분이 사전에 정의되지 않으면 접속정보를 넣어도 연결이 되지 않는 에러만 계속 발생하게 된다. RDS에 한글 데이터를 저장하기 위해서는 인코딩 정보를 변경해줘야 하는데 RDS 인스턴스의 파라메터 그룹 설정에서 AWS RDS defaults 인코딩을 utf8로 변경해주는 것이 편하다.
(참고: 보안그룹설정, 인코딩 설정)

AgData Lab에서는 MySQL로 RDS를 생성하였으므로 데이터 접속을 위해서 RMySQL 패키지가 필요하다. 그리고 Windows용 R에서는 이상하게도 인코딩이 euckr인 경우에만 한글을 제대로 인식하는 문제가 있어서 Workbench 등으로 AWS RDS에 접속해서 인코딩이 euckr인 Schema를 생성해두는 것이 좋다. 이제 AWS RDS MySQL 계정에 접속하여 접속정보를 conn에 저장하고 conn의 연결정보를 이용해서 데이터의 읽고 쓰기를 해보자. 먼저 dbListTables()를 이용해서 schema(하위DB) 내에 있는 테이블 정보를 확인할 수 있다. 다음으로 반드시 dbGetQuery(conn, "set names 'euckr'") 명령문으로 문자 인코딩을 euckr로 설정해줘야 한다. 이제 dbGetQuery(conn, "SELECT * FROM df_name") 명령문에서 SQL Query문을 작성해서 DB 내에 있는 테이블에서 필요한 데이터를 불러올 수 있다. R에서 생성된 데이터를 DB에 저장하려면 dbWriteTable()을 이용해서 DB에 쓸 테이블명(df_in_DB), R에서 저장하려는 데이터(df) 정보와 추가옵션들을 설정해서 저장해보자. 모든 필드 정보를 지정해줘야 하는 SQL 관리도구로 테이블을 생성하는 것보다 훨씬 수월할 것이다.

  library(RMySQL)
  conn <- dbConnect(  
              RMySQL::MySQL(),   
              host = Sys.getenv("RDS_HOST"),   
              dbname = "schema_name",
              user = Sys.getenv("RDS_USER"),   
              password = Sys.getenv("RDS_PASSWORD")   
          )
  dbListTables(conn)
  dbGetQuery(conn, "set names 'euckr'")
  df <- dbGetQuery(conn, "SELECT * FROM df_name")
  dbWriteTable(conn, name='df_in_DB', value=df, row.names=F, overwrite=F, append=F)
  dbDisconnect(conn)
장박 avatar
About 장박
장박은 농업정보시스템 연구실에서 오랜시간 숙성되고 있는 농업데이터사이언티스트이다.
comments powered by Disqus