RDS for Oracle에서 S3 Bucket의 파일 다운로드 및 업로드

2023.12.10

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 RDS for Oracle에서 S3 Bucket의 파일을 다운로드 및 업로드하는 과정을 정리해 봤습니다.

하고 싶은 것

EC2 인스턴스를 생성해, RDS for Oracle에 접속합니다.

그 이후, RDS for Oracle에서 S3 Bucket에 있는 데이터를 다운로드 혹은 업로드를 진행 하고자합니다.

사전 준비

RDS for Oracle에 접속할 수 있는 EC2 인스턴스 준비

먼저 RDS에 접근하기 위해서는 EC2 인스턴스를 생성한 다음, Oracle Instant Client를 설치하여, RDS for Oracle에 접근할 필요가 있습니다.

해당 과정은 아래 블로그를 참고해 주세요.

sudo yum install wget
sudo wget https://download.oracle.com/otn_software/linux/instantclient/19600/oracle-instantclient19.6-basic-19.6.0.0.0-1.x86_64.rpm
sudo wget https://download.oracle.com/otn_software/linux/instantclient/19600/oracle-instantclient19.6-sqlplus-19.6.0.0.0-1.x86_64.rpm
sudo yum install -y oracle-instantclient19.6-basic-19.6.0.0.0-1.x86_64.rpm
sudo yum install -y oracle-instantclient19.6-sqlplus-19.6.0.0.0-1.x86_64.rpm
export PATH=/usr/lib/oracle/19.6/client64/bin:$PATH
export LD_LIBRARY_PATH=/usr/lib/oracle/19.6/client64/bin:$LD_LIBRARY_PATH
sqlplus64 -v

블로그에 나와있는 명령어를 정리하면 상기와 같습니다.

상기 명령어를 통해 Oracle Instant Client를 설치합니다.

S3 Bucket 생성

S3 Bucket에서는 특별한 설정 없이, EC2, RDS를 생성할 리전과 동일한 리전으로 S3 Bucket을 생성합니다.

그 이후 테스트를 위한 파일과, test 폴더를 생성합니다.

S3 Bucket에 저장되어 있는, kura.png를 RDS에서 다운로드하여, test 폴더에 업로드를 진행할 예정입니다.

S3 Bucket에 접근할 IAM 권한 생성

RDS에서 S3 Bucket으로 접근하기 위해서는 권한이 필요합니다.

먼저 정책을 생성합니다.

필요한 권한은 다음과 같습니다.

  • GetObject
  • ListBucket
  • PutObject

상기 권한을 통해 지정한 S3 Bucket에 Get, List, Put 작업을 실시합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::S3 Bucket 이름",
                "arn:aws:s3:::S3 Bucket 이름/*"
            ]
        }
    ]
}

마지막으로 정책 이름을 입력하고, 정책 생성을 끝마칩니다.

이어서 IAM Role을 생성합니다.

  • 서비스에는 RDS를 선택합니다.
  • 사용 사례에는 RDS - Add Role to Database를 선택합니다.
  • 「다음」을 클릭합니다.

  • 조금 전 생성한 정책을 검색하여 선택합니다.
  • 「다음」을 클릭합니다.

마지막으로 역할 이름을 입력하고, IAM Role 생성을 끝마칩니다.

RDS for Oracle 생성

먼저 RDS를 생성하기 전에, 옵션 그룹을 생성하여, S3 Bucket과의 연동을 위한 옵션을 추가해야합니다.

  • 「옵션 그룹」을 클릭합니다.
  • 「그룹 생성」을 클릭합니다.

이름, 설명, 엔진, 메이저 엔진 버전을 입력 및 선택하고 옵션 그룹을 생성합니다.

  • 생성한 옵션 그룹에서「옵션 추가」를 클릭합니다.

  • 옵션 이름에「S3_INTEGRATION」을 선택합니다.
  • 즉시 적용을 선택합니다.
  • 「옵션 추가」를 클릭합니다.

이어서 RDS for Oracle을 생성하면서, 옵션 그룹에는 조금 전 생성한 옵션 그룹을 적용합니다.

RDS 생성이 끝났다면, RDS로 들어와서 역할을 추가합니다.

조금 기다려보면, 상태가 활성으로 변하는 것을 확인할 수 있습니다.

RDS에서 S3 Bucket 데이터 다운로드 및 업로드

sudo sqlplus64 유저명@RDS 엔드포인트:접속 포트/접속 데이터베이스 명

상기 명령어를 통해 EC2 인스턴스에서 RDS로 접속을 시도합니다.

SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY MTIME;

상기 명령어로 datadump의 디렉토리를 확인합니다.

※ 덤프 파일을 생성해서, 다운로드, 업로드 할 수 있지만 이번에는 이미지를 다운로드하고 업로드해 보곘습니다.

SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
      p_bucket_name    =>  'test-s3-rds-for-oracle-jw',       
      p_directory_name =>  'DATA_PUMP_DIR',
      p_s3_prefix => 'kura.png') 
     AS TASK_ID FROM DUAL;

상기 명령어를 통해 S3 Bucket에 있는 kura.png를 다운로드합니다.

SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-TASK_ID.log'));

출력된 task id를 바탕으로 작업 로그를 확인할 수 있습니다.

SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY MTIME;

FILENAME
--------------------------------------------------------------------------------
TYPE         FILESIZE MTIME
---------- ---------- ---------
kura.png
file            31043 10-DEC-23

datapump/
directory        4096 10-DEC-23

상기 명령어를 통해 확인해 보면, kura.png가 S3 Bucket으로 부터 다운로드된 것을 확인할 수 있습니다.

SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
      p_bucket_name    =>  'test-s3-rds-for-oracle-jw',
      p_prefix         =>  'kura.png', 
      p_s3_prefix      =>  'test/', 
      p_directory_name =>  'DATA_PUMP_DIR') 
   AS TASK_ID FROM DUAL;

S3 Bucket으로 부터 다운로드 받은 kura.png를 다시 S3 Bucket의 test 폴더에 업로드합니다.

S3 Bucket의 test 폴더를 확인해 보면, kura.png가 업로드된 것을 확인할 수 있습니다.

업로드한 이미지를 다운로드해 열어보면, 문제 없이 이미지 파일이 열리는 것을 확인할 수 있습니다.

S3 Bucket의 다운로드 및 업로드에 대한 보다 상세한 명령어는 아래 공식 문서를 참고해 주세요.

본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 kim.jaewook@classmethod.jp 로 연락 주시면 회신 드릴 수 있도록 하겠습니다 !