본문 바로가기
2. 기본 인프라 IaaS

오라클 클라우드 오브젝트 스토리지 활용 방법

by MY잭슨 2022. 4. 25.
오브젝트 스토리지 개요

OCI 오브젝트 스토리지 서비스는 안정적이고 비용 효율적인 데이터 내구성을 제공하는 클라우드 상의 고성능 스토리지 플랫폼입니다. 오브젝트 스토리지 서비스는 분석 데이터 및 이미지 및 비디오와 같은 콘텐츠를 포함하여 모든 콘텐츠 유형의 비정형 데이터를 무제한으로 저장할 수 있습니다. (비용 없이 무제한이라는 것은 아닙니다 ^^;)

오브젝트 스토리지를 사용하면 인터넷 또는 클라우드 플랫폼에서 직접 데이터를 안전하고 안전하게 저장하거나 검색할 수 있습니다. 오브젝트 스토리지는 스토리지를 규모에 맞게 쉽게 관리할 수 있는 여러 관리 인터페이스를 제공합니다. 플랫폼의 탄력성을 통해 성능 또는 서비스 안정성의 저하 없이 소규모로 시작하고 원활하게 확장할 수 있습니다.

 

오브젝트 스토리지 무료 서비스 범위는 여기에서 확인하세요.

 

오브젝트 스토리지 접근 방법

1. OCI 콘솔은 사용하기 쉬운 브라우저 기반 인터페이스로 크롬, 파이어폭스와 같은 브라우저를 사용해야 합니다. cloud.oracle.com 콘솔 로그인 페이지로 이동하고 로그인하여 오브젝트 스토리지 >> 버킷 메뉴를 통해 이동하여 활용할 수 있습니다.

 

2. 명령줄 인터페이스(CLI)는 프로그래밍 없이도 빠른 액세스와 전체 기능을 제공합니다. 자세한 내용은 CLI 사용을 참조하십시오. (https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/cliusing.htm#Using_the_CLI)

 

3. REST API는 가장 많은 기능을 제공하지만 프로그래밍 전문 지식이 필요합니다. API 참조 및 엔드포인트는 엔드포인트 세부 정보와 사용 가능한 API 참조 문서에 대한 링크를 제공합니다. API 사용에 대한 일반적인 내용은 REST API를 참조하십시오. 오브젝트 스토리지는 다음 API를 사용하여 액세스할 수 있습니다.

https://docs.oracle.com/en-us/iaas/api/#/en/objectstorage/latest/

https://docs.oracle.com/en-us/iaas/api/#/en/s3objectstorage/20160918/

Swift API (for use with Oracle RMAN)

 

4. OCI는 프레임워크를 생성하지 않고도 오브텍트 스토리지와 상호 작용하는 SDK를 제공합니다. SDK 사용에 대한 일반적인 내용은 소프트웨어 개발 키트 및 명령줄 인터페이스를 참조하십시오.

https://docs.oracle.com/en-us/iaas/Content/API/Concepts/sdks.htm#Software_Development_Kits_and_Command_Line_Interface

 

개발을 위한 샘플 코드 확인은 이곳에서.

https://github.com/oracle/oci-typescript-sdk/tree/master/examples

/**
 * Copyright (c) 2020, 2021 Oracle and/or its affiliates.  All rights reserved.
 * This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
 */

/* @param args Arguments to provide to the example. The following arguments are expected:
 * <ul>
 * <li>The first argument is the OCID of the compartment.</li>
 * <li>The second is the name of bucket to create and later fetch</li>
 * <li>The third is the name of object to create inside bucket</li>
 * <li>The fourth is the path of the file. i.e: "/Users/File/location";
 * </ul>
 * Note: there is a 2GB for 64-bit machine and 1GB for 32-bit machine buffer limitation from the NodeJS V8 Engine
 * Cannot upload file size greater than the limit
 */

const os = require("oci-objectstorage");
const common = require("oci-common");
const fs = require("fs");

const provider = new common.ConfigFileAuthenticationDetailsProvider();
const args = process.argv.slice(2);
console.log(args);
if (args.length !== 4) {
  console.error(
    "Unexpected number of arguments received. Consult the script header comments for expected arguments"
  );
  process.exit(-1);
}

const compartmentId = args[0];
const bucket = args[1];
const object = args[2];
const fileLocation = args[3];

const client = new os.ObjectStorageClient({
  authenticationDetailsProvider: provider
});

(async () => {
  try {
    console.log("Getting the namespace...");
    const request = {};
    const response = await client.getNamespace(request);
    const namespace = response.value;

    console.log("Creating the source bucket.");
    const bucketDetails = {
      name: bucket,
      compartmentId: compartmentId
    };
    const createBucketRequest = {
      namespaceName: namespace,
      createBucketDetails: bucketDetails
    };
    const createBucketResponse = await client.createBucket(createBucketRequest);
    console.log("Create Bucket executed successfully" + createBucketResponse);

    console.log("Bucket is created. Fetch the bucket.");
    const getBucketRequest = {
      namespaceName: namespace,
      bucketName: bucket
    };
    const getBucketResponse = await client.getBucket(getBucketRequest);
    console.log("Get bucket executed successfully." + getBucketResponse.bucket);

    // Create stream to upload
    const stats = fs.statSync(fileLocation);
    const nodeFsBlob = new os.NodeFSBlob(fileLocation, stats.size);
    const objectData = await nodeFsBlob.getData();

    console.log("Bucket is created. Now adding object to the Bucket.");
    const putObjectRequest = {
      namespaceName: namespace,
      bucketName: bucket,
      putObjectBody: objectData,
      objectName: object,
      contentLength: stats.size
    };
    const putObjectResponse = await client.putObject(putObjectRequest);
    console.log("Put Object executed successfully" + putObjectResponse);

    console.log("Fetch the object created");
    const getObjectRequest = {
      objectName: object,
      bucketName: bucket,
      namespaceName: namespace
    };
    const getObjectResponse = await client.getObject(getObjectRequest);
    console.log("Get Object executed successfully.");

    const isSameStream = compareStreams(objectData, getObjectResponse.value);
    console.log(`Upload stream and downloaded stream are same? ${isSameStream}`);

    console.log("Delete Object");
    const deleteObjectRequest = {
      namespaceName: namespace,
      bucketName: bucket,
      objectName: object
    };
    const deleteObjectResponse = await client.deleteObject(deleteObjectRequest);
    console.log("Delete Object executed successfully" + deleteObjectResponse);

    console.log("Delete the Bucket");
    const deleteBucketRequest = {
      namespaceName: namespace,
      bucketName: bucket
    };
    const deleteBucketResponse = await client.deleteBucket(deleteBucketRequest);
    console.log("Delete Bucket executed successfully" + deleteBucketResponse);
  } catch (error) {
    console.log("Error executing example " + error);
  }
})();

function compareStreams(stream1, stream2) {
  return streamToString(stream1) === streamToString(stream2);
}

function streamToString(stream) {
  let output = "";
  stream.on("data", function(data) {
    output += data.toString();
  });
  stream.on("end", function() {
    return output;
  });
}

 

 

참고

https://docs.oracle.com/en-us/iaas/Content/Object/Concepts/objectstorageoverview.htm

https://oracle-cloud.tistory.com/entry/Storage-option-Block-Storage-Object-Storage-File-Storage

 

댓글