Storage
AWS나 오라클 같은 클라우드 서비스에는 파일을 업로드 할 수 있는 Storage 서비스가 있다. 대표적으로 AWS의 S3가 있는데 확실히는 잘 모르지만, AWS에서는 이 S3를 활용할 수 있는 api를 제공하기 때문에 api를 활용해 서버단에서 액세스를 할 수 있다. 이와 비슷하게 오라클 클라우드에서도 Object Storage라는 스토리지 서비스를 제공하고, OCI 라이브러리를 활용해 마찬가지로 서버단에서 액세스하는게 가능하다.
그래서 정보는 저어엉말 너무 없지만 오라클에서 제공하는 oci java sdk를 활용해서 object storage를 활용하는 솔루션을 만들예정이다. (삽질을 많이 했다.)
설정 및 전제 조건
당연히 오라클 클라우드 계정이 있다는 가정 하에 oci를 사용하기 위해 필요한 설정 값과 api 인증키가 있어야한다. (OCI는 https통신의 API만 가능해서. https 통신은 따로 찾아보도록 하자.)
oci에 필요한 클라우드 설정 값은 대시보드에서 확인이 가능하고, api 인증키 같은 경우 openssl로 생성해주어야한다. 터미널은 문서에서 추천한 git bash를 사용했다.
api 키 생성 참고 : https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm
Window OS를 기준으로 키를 생성한다.
openssl 확인
$ openssl version
사용자 루트 디렉토리에 ocikey 라는 디렉토리 생성후 $ cd ocikey로 만든 디렉토리에서 진행한다.
암호 없이 개인키 생성
$ openssl genrsa -out ./oci_api_key.pem 2048
만든 개인키로 공개키 생성
openssl rsa -pubout -in ./oci_api_key.pem -out ./oci_api_key_public.pem
생성된 개인키와 공개키
내 경우는 이미 인증키를 만들어놨기 때문에 따로 test 디렉토리에 이름에 _test도 추가되어있다.
fingerprint 생성
openssl rsa -pubout -outform DER -in ./oci_api_key.pem | openssl md5 -c
입력하면, 콘솔에 fingerprint가 찍힌다.
사실 오라클 클라우드 대시보드에 공개키를 어차피 업로드 해야하는데 그때도 나오니 메모 안해도된다.
이제 오라클 클라우드 계정 페이지에서 api 키를 업로드 해줘야한다.
계정 로그인 후 맨 오른쪽 위 아이콘을 클릭하여 사용자 설정으로 들어간다.
사용자 설정에 들어가면
왼쪽에 API키 탭에 들어가서 API키 추가로 생성한 공개키를 업로드해줘야한다.
공개키 업로드 후 추가를 눌러주면
이렇게 oci에 필요한 설정값들 정보가 나온다. 참고로 구성파일은 config 파일을 말한다. 구성파일 미리보기의 복사를 눌러서 복사한 후, 터미널에서 생성한 키가 있는 디렉토리에 config 파일을 추가해야한다.
터미널 (git bash)로 가서
$ vim config
구성 파일 미리보기에 있던 설정 값들과 key_file 값을 추가로 넣어준다
~/는 사용자 루트 디렉토리를 의미하기 때문에 개인이 알아서 개인키가 있는 경로로 수정해서 넣어주자
내용을 넣은 후 :wq로 저장하면 사전 설정 완료.
참고로 오라클 클라우드 api키는 최대 3개까지만 가능하다.
pom.xml에 dependency추가
오라클에서 제공하는 깃허브 사이트에서 sdk를 받을 수 있지만 maven으로 라이브러리를 받았다.
<dependencies>
.
.
.
<!-- oci -->
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-workrequests</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-filestorage</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-audit</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-core</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-database</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-common</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-objectstorage-generated</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.34</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.34</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-entity-filtering</artifactId>
<version>2.34</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.34</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.34</version>
</dependency>
<!-- end oci -->
dependency들을 찾는데 삽질을 상당히 많이 했다.
대략적으로 com.oracle.oci.sdk에 관련 라이브러리들을 받고 있고 추가로 jersey 관련 라이브러리도 추가해줬다.
jersey는 이클립스에서 기본으로 jar파일을 제공하는데 위의 5가지 dependency를 2.34 버전으로 추가해주지 않으면
NoSuchMethod나 NoClassDef등 의 에러들을 계속해서 뱉어댄다.
Processing exception while communicating to 에러가 뜨면서 원인으로 org.glassfish.jersey.message.internal.HeaderUtils.asStringHeadersSingleValue가 뜬다면 위에 5가지 jar파일이 2.34버전으로 제대로 되었는지 확인해봐야한다. (oci 2.8.1 기준)
GetBucket 테스트
테스트 전, 클라우드 계정 페이지에서 정보를 가져올 버킷을 미리 한개 만들어두었다.
오브젝트 스토리지 > 버킷 생성으로 쉽게 만들 수 있다.
소스 코드 참고 : https://github.com/oracle/oci-java-sdk/releases
package com.poozim.jobcall.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.google.common.base.Supplier;
import com.oracle.bmc.ClientConfiguration;
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.auth.SimpleAuthenticationDetailsProvider;
import com.oracle.bmc.auth.SimplePrivateKeySupplier;
import com.oracle.bmc.objectstorage.ObjectStorage;
import com.oracle.bmc.objectstorage.ObjectStorageClient;
import com.oracle.bmc.objectstorage.model.CreateBucketDetails;
import com.oracle.bmc.objectstorage.requests.CreateBucketRequest;
import com.oracle.bmc.objectstorage.requests.GetBucketRequest;
import com.oracle.bmc.objectstorage.requests.GetNamespaceRequest;
import com.oracle.bmc.objectstorage.responses.GetBucketResponse;
import com.oracle.bmc.objectstorage.responses.GetNamespaceResponse;
import org.glassfish.jersey.message.internal.HeaderUtils;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/*.xml",
"file:src/main/webapp/WEB-INF/spring/appServlet/*.xml"})
public class OciUtilTest {
@Test
public void Test() throws IOException {
final String compartmentId = "테넌시 ocid";
final String bucket = "버킷 이름";
final String object = "";
ConfigFile config = ConfigFileReader.parse("~/ocikey/config", "DEFAULT");
AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(config);
ObjectStorage client = new ObjectStorageClient(provider);
client.setRegion(Region.AP_SEOUL_1);
System.out.println("Getting the namespace.");
GetNamespaceResponse namespaceResponse = client.getNamespace(GetNamespaceRequest.builder().build());
String namespaceName = namespaceResponse.getValue();
System.out.println("Creating Get bucket request");
List<GetBucketRequest.Fields> fieldsList = new ArrayList<>(2);
fieldsList.add(GetBucketRequest.Fields.ApproximateCount);
fieldsList.add(GetBucketRequest.Fields.ApproximateSize);
GetBucketRequest request =
GetBucketRequest.builder()
.namespaceName(namespaceName)
.bucketName(bucket)
.fields(fieldsList)
.build();
System.out.println("Fetching bucket details");
GetBucketResponse response = client.getBucket(request);
System.out.println("Bucket Name : " + response.getBucket().getName());
System.out.println("Bucket Compartment : " + response.getBucket().getCompartmentId());
System.out.println(
"The Approximate total number of objects within this bucket : "
+ response.getBucket().getApproximateCount());
System.out.println(
"The Approximate total size of objects within this bucket : "
+ response.getBucket().getApproximateSize());
}
}
코드에서 테넌시 값과 버킷이름 두가지가 필요한데,
테넌시 ocid는 클라우드 계정 페이지에서도 확인할 수 있고,
config 파일의 tenacy= ~~~ 으로 적혀있던 값이 ocid다.
버킷 이름은
오브젝트 스토리지 메뉴에서
이 부분을 말한다. 내 경우 bucket값이 당연히 ocid일줄 알았는데 이름이었다.
테스트 결과
버킷 이름, ocid와
버킷에 있는 파일(object) 갯수
버킷 용량 출력 되었다.
이 테스트 하나 오는데 정보가 별로 안나와서 너무 삽질을 많이 했다.
내가 첫 발자국인가 보다 제에에에엔장 오이오이
다음엔 버킷에 파일을 업로드 할 예정
'Spring' 카테고리의 다른 글
Spring (boot 아님) redis (lettuce)적용하기 (0) | 2021.11.09 |
---|---|
Spring OCI(oracle cloude infrastructure) Java SDK 활용 (2) Object Storage에 Bucket, Object, PreAuth CRD 하기 (0) | 2021.11.05 |
Spring MVC JPA 에서 Mybatis 추가하기 (0) | 2021.10.29 |
Spring JPA Querydsl 설정과 간단한 사용 (0) | 2021.10.29 |
Spring 메일 보내기 Mail 보내기 (0) | 2021.10.27 |