본문 바로가기

Spring

Spring OCI(oracle cloude infrastructure) Java SDK 활용 (2) Object Storage에 Bucket, Object, PreAuth CRD 하기

728x90

지난 글 활용(1)과 이어지는 내용

 

오라클 클라우드 Object Storage에 파일을 업로드해서 액세스 하기위해선 기본적으로 Bucket, Obejct(파일), PreAuth(사전인증)에 대한 CRD 기능이 최소한으로 필요하다.

 

Bucket, Object, PreAuth란

Object는 업로드한 파일을 의미하고,

Bucket은 Object들이 업로드 된 공간이다 (aws s3의 bucket과 동일)

PreAuth는 업로드한 Object들에 대해 URL사용이 필요한 경우가 있을텐데, Object는 사전 인증이 없으면 URL을 통한 접근이 거부된다. 이때 필요한 사전 인증이 PreAuth(PreAuthentication)다.

 

 

CRD 과정

테스트 코드를 작성하면서 oci를 사용하는데 항상 비슷한 형식이 사용된다는걸 알았다.

메뉴별 클라이언트 객체가 있고 (Object Storage의 클라이언트 객체)

클라이언트 객체의 메서드를 확인해보면 기능별로 request가 나눠져있는걸 알 수 있다.

그리고 request마다 응답을 받을 수 있는 response가 존재해서

response를 통해 값을 리턴받을 수 있다.

 

예를 들면, 버킷을 생성하는 CreateBucketRequest, 삭제하는 DeleteBucketRequest, PutBucketRequest 등 기능별로 request가 구성되어있다.

 

request들은 build() 메서드를 통해 객체를 생성하는데 bulid전 namespace와 bucketname등의 필수 설정 값을 세팅 해야한다.

 

버킷이나 사전인증의 경우 자세한 추가 설정이 필요하기 때문에 Detail 설정이 추가로 존재한다.

 

자세한건 코드를 통해 확인하자.

 

Bucket, Object, PreAuth CRD 테스트 소스 코드

열심히 삽질하느라 코드 정리가 안 되어있을 수 있다. 

import는 막무가내로 하게되었다. 혹시 필요할까봐 참고

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.oracle.bmc.ConfigFileReader;
import com.oracle.bmc.ConfigFileReader.ConfigFile;
import com.oracle.bmc.Region;
import com.oracle.bmc.auth.AuthenticationDetailsProvider;
import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider;
import com.oracle.bmc.objectstorage.ObjectStorage;
import com.oracle.bmc.objectstorage.ObjectStorageClient;
import com.oracle.bmc.objectstorage.model.Bucket;
import com.oracle.bmc.objectstorage.model.CreateBucketDetails;
import com.oracle.bmc.objectstorage.model.CreatePreauthenticatedRequestDetails;
import com.oracle.bmc.objectstorage.model.CreatePreauthenticatedRequestDetails.AccessType;
import com.oracle.bmc.objectstorage.model.ListObjects;
import com.oracle.bmc.objectstorage.model.ObjectSummary;
import com.oracle.bmc.objectstorage.requests.CreateBucketRequest;
import com.oracle.bmc.objectstorage.requests.CreatePreauthenticatedRequestRequest;
import com.oracle.bmc.objectstorage.requests.DeleteBucketRequest;
import com.oracle.bmc.objectstorage.requests.DeleteObjectRequest;
import com.oracle.bmc.objectstorage.requests.DeletePreauthenticatedRequestRequest;
import com.oracle.bmc.objectstorage.requests.GetBucketRequest;
import com.oracle.bmc.objectstorage.requests.GetNamespaceRequest;
import com.oracle.bmc.objectstorage.requests.GetObjectRequest;
import com.oracle.bmc.objectstorage.requests.GetPreauthenticatedRequestRequest;
import com.oracle.bmc.objectstorage.requests.ListObjectsRequest;
import com.oracle.bmc.objectstorage.requests.PutObjectRequest;
import com.oracle.bmc.objectstorage.responses.CreatePreauthenticatedRequestResponse;
import com.oracle.bmc.objectstorage.responses.DeleteBucketResponse;
import com.oracle.bmc.objectstorage.responses.GetBucketResponse;
import com.oracle.bmc.objectstorage.responses.GetNamespaceResponse;
import com.oracle.bmc.objectstorage.responses.GetObjectResponse;
import com.oracle.bmc.objectstorage.responses.GetPreauthenticatedRequestResponse;
import com.oracle.bmc.objectstorage.responses.ListObjectsResponse;
import com.oracle.bmc.objectstorage.transfer.*;
import com.oracle.bmc.objectstorage.transfer.UploadManager.UploadRequest;
import com.oracle.bmc.objectstorage.transfer.UploadManager.UploadResponse;

 

Bucket Read는 지난글을 참고하자

 

Bucket Create

public void createBucketTest() throws Exception {
		ConfigFile config = ConfigFileReader.parse("~/ocikey/config", "DEFAULT");
		
		AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(config);
		
		ObjectStorage client = new ObjectStorageClient(provider);
		client.setRegion(Region.AP_SEOUL_1);
		
		String namespaceName = 네임스페이스;
        String compartmentId = config.get("tenancy");
        
        CreateBucketDetails createBucketDetails =
        		CreateBucketDetails.builder()
        			.compartmentId(compartmentId)
        			.name("testBucket")
        			.build();
        
        CreateBucketRequest request = 
        		CreateBucketRequest.builder()
        			.namespaceName(namespaceName)
        			.createBucketDetails(createBucketDetails)
        			.build();
        			
        
        client.createBucket(request);
        client.close();
	}

 

 

Bucket Delete

public void deleteBucketTest() throws Exception {
		ConfigFile config = ConfigFileReader.parse("~/ocikey/config", "DEFAULT");
		
		AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(config);
		
		ObjectStorage client = new ObjectStorageClient(provider);
		client.setRegion(Region.AP_SEOUL_1);
		
		String namespaceName = 네임스페이스;
        String bucketName = "testBucket";
        
        DeleteBucketRequest request =
        		DeleteBucketRequest.builder()
        			.namespaceName(namespaceName)
        			.bucketName(bucketName)
        			.build();
        
        DeleteBucketResponse response = client.deleteBucket(request);
        System.out.println("response : " + response);
        System.out.println("status code : " + response.get__httpStatusCode__());
        client.close();
	}

 

Object Create (버킷에 파일 업로드)

public void UploadObjectTest() throws Exception {
		ConfigFile config = ConfigFileReader.parse("~/ocikey/config", "DEFAULT");
		
		AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(config);
		
		ObjectStorage client = new ObjectStorageClient(provider);
		client.setRegion(Region.AP_SEOUL_1);
		
		
		//upload object
		UploadConfiguration uploadConfiguration =
                UploadConfiguration.builder()
                        .allowMultipartUploads(true)
                        .allowParallelUploads(true)
                        .build();
		
		UploadManager uploadManager = new UploadManager(client, uploadConfiguration);
		
		String namespaceName = 네임스페이스;
        String bucketName = 버킷이름;
        String objectName = "test_object2.jpg";
        Map<String, String> metadata = null;
        String contentType = "image/jpg";
        
        String contentEncoding = null;
        String contentLanguage = null;
        
        File body = new File("/test.jpg");

        PutObjectRequest request =
	                PutObjectRequest.builder()
	                        .bucketName(bucketName)
	                        .namespaceName(namespaceName)
	                        .objectName(objectName)
	                        .contentType(contentType)
	                        .contentLanguage(contentLanguage)
	                        .contentEncoding(contentEncoding)
	                        .opcMeta(metadata)
	                        .build();
		
		
		UploadRequest uploadDetails =
	                UploadRequest.builder(body).allowOverwrite(true).build(request);
		
		UploadResponse response = uploadManager.upload(uploadDetails);
        System.out.println(response);
        
        client.close();
	}

 

Object Read

1. 1개 Read

@Test
	public void getObjectOneTest() throws Exception {
		ConfigFile config = ConfigFileReader.parse("~/ocikey/config", "DEFAULT");
		
		AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(config);
		
		ObjectStorage client = new ObjectStorageClient(provider);
		client.setRegion(Region.AP_SEOUL_1);
		
		String namespaceName = 네임스페이스;
        String bucketName = 버킷이름;
        String objectName = "test_object2.jpg";
        
        GetObjectRequest request =
        		GetObjectRequest.builder()
        			.namespaceName(namespaceName)
        			.bucketName(bucketName)
        			.objectName(objectName)
        			.build();
        
        GetObjectResponse response = client.getObject(request);
        System.out.println(response);
        response.getInputStream().
        
        client.close();

	}

object를 1개 가져온 경우 해당 object의 name정보가 응답에 없다. 때문에 List Read를 할때 prefix로 파일명을 지정해서 가져오는 방법을 사용해도 될 것 같다.

 

 

2. List Read

 

public void getObjectListTest() throws Exception {
		ConfigFile config = ConfigFileReader.parse("~/ocikey/config", "DEFAULT");
		
		AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(config);
		
		ObjectStorage client = new ObjectStorageClient(provider);
		client.setRegion(Region.AP_SEOUL_1);
		
		String namespaceName = 네임스페이스;
        String bucketName = 버킷이름;
        
        ListObjectsRequest request =
        		ListObjectsRequest.builder()
        			.namespaceName(namespaceName)
        			.bucketName(bucketName)
        			.fields("size, md5, timeCreated, timeModified")
                    .prefix("~~~~")
        			.build();
        
        ListObjectsResponse response = client.listObjects(request);
        
        ListObjects list = response.getListObjects();
        List<ObjectSummary> objectList = list.getObjects();
        
        
        for(int i=0; i<objectList.size(); i++) {
        	System.out.println("====================");
        	System.out.println("@@@@@@@@@@@@@@@@@ getName : " + objectList.get(i).getName());
        	System.out.println("@@@@@@@@@@@@@@@@@ getArchivalState : " + objectList.get(i).getArchivalState());
        	System.out.println("@@@@@@@@@@@@@@@@@ getSize : " + objectList.get(i).getSize());
        	System.out.println("@@@@@@@@@@@@@@@@@ getTimeCreated : " + objectList.get(i).getTimeCreated());
        	System.out.println("@@@@@@@@@@@@@@@@@ getTimeModified : " + objectList.get(i).getTimeModified());
        }
        
        System.out.println(response.getListObjects());
        client.close();
	}

 

 

Object 다운로드

public void DownloadObjectTest() throws Exception {
		//basic setting
        final String bucket = 버킷이름;
		
		ConfigFile config = ConfigFileReader.parse("~/ocikey/config", "DEFAULT");
		
		AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(config);
		
		ObjectStorage client = new ObjectStorageClient(provider);
		client.setRegion(Region.AP_SEOUL_1);
		//end basic setting
		
		DownloadConfiguration downloadConfiguration =
                DownloadConfiguration.builder()
                        .parallelDownloads(3)
                        .maxRetries(3)
                        .multipartDownloadThresholdInBytes(6 * 1024 * 1024)
                        .partSizeInBytes(4 * 1024 * 1024)
                        .build();

        DownloadManager downloadManager = new DownloadManager(client, downloadConfiguration);
		
        String namespaceName = 네임스페이스;
        String bucketName = bucket;
        String objectName = "test_object2.jpg";
        String outputFileName = 다운로드할 경로와 파일명;
        
        GetObjectRequest request =
                GetObjectRequest.builder()
                        .namespaceName(namespaceName)
                        .bucketName(bucketName)
                        .objectName(objectName)
                        .build();
        
        // download request and print result
        GetObjectResponse response = downloadManager.getObject(request);
        System.out.println("Content length: " + response.getContentLength() + " bytes");

        // use the stream contents; make sure to close the stream, e.g. by using try-with-resources
        InputStream stream = response.getInputStream();
        OutputStream outputStream = new FileOutputStream(outputFileName);
        try {
        	// use fileStream
            byte[] buf = new byte[8192];
            int bytesRead;
            while ((bytesRead = stream.read(buf)) > 0) {
                outputStream.write(buf, 0, bytesRead);
            }
        } // try-with-resources automatically closes streams
        finally {
        	stream.close();
        	outputStream.close();
		}
        System.out.println("File size: " + new File(outputFileName).length() + " bytes");

        // or even simpler, if targetting a file:
        response = downloadManager.downloadObjectToFile(request, new File(outputFileName));
        System.out.println("Content length: " + response.getContentLength() + " bytes");
        System.out.println("File size: " + new File(outputFileName).length() + " bytes");
        client.close();
	}

 

 

Object Delete

public void deleteObjectTest() throws Exception {
		ConfigFile config = ConfigFileReader.parse("~/ocikey/config", "DEFAULT");
		
		AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(config);
		
		ObjectStorage client = new ObjectStorageClient(provider);
		client.setRegion(Region.AP_SEOUL_1);
		
		String namespaceName = 네임스페이스;
        String bucketName = 버킷이름;

		
        DeleteObjectRequest request = 
        		DeleteObjectRequest.builder()
        			.bucketName(bucketName)
        			.namespaceName(namespaceName)
        			.objectName("test_object")
        			.build();
        		
        
        client.deleteObject(request);
        client.close();
	}

 

 

 

PreAuth CRD

public void getPreAuth() throws Exception{
		ConfigFile config = ConfigFileReader.parse("~/ocikey/config", "DEFAULT");
		
		AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(config);
		
		ObjectStorage client = new ObjectStorageClient(provider);
		client.setRegion(Region.AP_SEOUL_1);
		
		String namespaceName = 네임스페이스;
        String bucketName = 버킷이름;
        
        GetPreauthenticatedRequestRequest request =
        		GetPreauthenticatedRequestRequest.builder()
        			.namespaceName(namespaceName)
        			.bucketName(bucketName)
        			.parId(사전 인증 id)	//parId 필수
        			.build();
        
        
        GetPreauthenticatedRequestResponse response = client.getPreauthenticatedRequest(request);
        System.out.println(response);
	}
	
	public void createPreAuth() throws Exception{
		ConfigFile config = ConfigFileReader.parse("~/ocikey/config", "DEFAULT");
		
		AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(config);
		
		ObjectStorage client = new ObjectStorageClient(provider);
		client.setRegion(Region.AP_SEOUL_1);
		
		String namespaceName = 네임스페이스;
        String bucketName = 버킷이름;
        
        Date expireDate = new Date(2021, 11, 21);	// 생성할 사전 인증 만료 날짜
        
        CreatePreauthenticatedRequestDetails details = 
        		CreatePreauthenticatedRequestDetails.builder()
        			.accessType(AccessType.AnyObjectRead) //해당 버킷의 모든 객체 읽기 허용
        			.name("testParName")
        			.timeExpires(expireDate)
        			.build();
        
        CreatePreauthenticatedRequestRequest request =
        		CreatePreauthenticatedRequestRequest.builder()
        			.namespaceName(namespaceName)
        			.bucketName(bucketName)
        			.createPreauthenticatedRequestDetails(details)
        			.build();
        
        CreatePreauthenticatedRequestResponse response = client.createPreauthenticatedRequest(request);
        System.out.println(response.getPreauthenticatedRequest().getAccessUri());
        System.out.println(response.getPreauthenticatedRequest().getId());
        
        //getAccessUri에 포함된 /p/~~~~~정보가 정말 중요하다. 대시보드에서 조회가 불가능하기
        //때문에 꼭 어딘가에 저장해야한다.
        //Id도 read와 delete에 필수 속성이기 때문에 저장해야한다.
        
        client.close();
        
	}
	
	public void deletePreAuth() throws Exception{
		ConfigFile config = ConfigFileReader.parse("~/ocikey/config", "DEFAULT");
		
		AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(config);
		
		ObjectStorage client = new ObjectStorageClient(provider);
		client.setRegion(Region.AP_SEOUL_1);
		
		String namespaceName = 네임스페이스;
        String bucketName = 버킷 이름;
        
        DeletePreauthenticatedRequestRequest request =
        		DeletePreauthenticatedRequestRequest.builder()
        			.namespaceName(namespaceName)
        			.bucketName(bucketName)
        			.parId(삭제할 사전 인증 id)
        			.build();
        
        client.deletePreauthenticatedRequest(request);
        
        client.close();
	}

 

 

기능들을 테스트 한 후에 꼭 오라클 클라우드 오브젝트 스토리지 대시보드에서 결과를 확인해줘야 한다.

 

728x90