Cloud 함수로 Cloud Storage 확장

Cloud Storage의 파일 및 폴더 업로드, 업데이트, 삭제에 대한 응답으로 함수를 트리거할 수 있습니다.

이 페이지의 예는 Cloud Storage에 이미지 파일이 업로드되면 트리거되는 샘플 함수를 기준으로 한 것입니다. 이 샘플 함수는 이벤트 속성 액세스 방법, Cloud 함수 인스턴스로 파일을 다운로드하는 방법을 비롯하여 Cloud Storage 이벤트 처리와 관련된 그 밖의 기본사항을 보여줍니다.

사용 사례의 예를 더 보려면 Cloud 함수로 무엇을 할 수 있나요?를 참조하세요.

Cloud Storage 변경사항에 대한 함수 트리거

functions.storage를 사용하여 Cloud Storage 이벤트를 처리하는 함수를 만듭니다. 특정 Cloud Storage 버킷으로 함수의 범위를 지정할지, 아니면 기본 버킷을 사용할지에 따라 다음 중 하나를 사용합니다.

예를 들어 미리보기 이미지 생성기 샘플은 프로젝트의 기본 버킷으로 범위를 지정합니다.

exports.generateThumbnail = functions.storage.object().onFinalize((object) => {
  // ...
});

Cloud Storage는 다음 이벤트를 지원합니다.

  • onArchive는 버킷에서 객체 버전 관리를 사용 설정한 경우에만 전송됩니다. 이 이벤트는 객체의 서비스 중인 버전을 보관처리했었거나 이름이 동일한 객체를 업로드하여 덮어썼으므로 서비스 중인 버전이 보관처리된 버전이 되었음을 나타냅니다.
  • onDelete: 객체가 영구적으로 삭제되면 전송됩니다. 여기에는 덮어썼거나 버킷 수명 주기 구성의 일부로 삭제된 객체가 포함됩니다. 객체 버전 관리를 사용 설정한 버킷의 경우 객체가 보관처리(onArchive 참조)되면 storage.objects.delete 메소드를 통해 보관처리한 경우에도 이 이벤트가 전송되지 않습니다.
  • onFinalize: 버킷에서 새 객체나 기존 객체의 새 세대를 만들면 전송됩니다. 여기에는 기존 객체의 복사나 재작성이 포함됩니다. 실패한 업로드는 이 이벤트를 트리거하지 않습니다.
  • onMetadataUpdate: 기존 객체의 메타데이터가 변경되면 전송됩니다.

위에 표시된 것과 같이 on 이벤트 핸들러 내에서 onFinalize 이벤트를 설정합니다.

저장소 객체 속성 액세스

Cloud 함수는 업데이트된 파일에 대해 sizecontentType 등의 다양한 저장소 객체 속성을 노출합니다. 이벤트의 resourceState 속성에는 "exists"(객체 생성 및 업데이트) 또는 "not_exists"(객체 삭제 및 이동) 값이 있습니다. 객체가 방금 생성되었는지 확인하려면 resourceState 속성을 'metageneration' 속성과 페어링해야 합니다. 개체의 메타데이터가 변경될 때마다 metageneration 속성이 증가합니다. 새 객체의 경우 metageneration 값이 1입니다.

const fileBucket = object.bucket; // The Storage bucket that contains the file.
const filePath = object.name; // File path in the bucket.
const contentType = object.contentType; // File content type.
const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.

미리보기 이미지 생성 샘플에서는 이러한 속성 중 일부를 사용하여 함수에서 반환하는 종료 사례를 감지합니다.

// Exit if this is triggered on a file that is not an image.
if (!contentType.startsWith('image/')) {
  console.log('This is not an image.');
  return null;
}

// Get the file name.
const fileName = path.basename(filePath);
// Exit if the image is already a thumbnail.
if (fileName.startsWith('thumb_')) {
  console.log('Already a Thumbnail.');
  return null;
}

파일 다운로드, 변환, 업로드

간혹 Cloud Storage에서 파일을 다운로드할 필요가 없는 경우도 있습니다. 하지만 Cloud Storage에 저장된 파일로 미리보기 이미지를 생성하는 것과 같은 집중적인 작업을 수행하려면 함수 인스턴스(즉, 코드를 실행하는 가상 머신)에 파일을 다운로드해야 합니다.

간편하게 객체를 다운로드하고 Cloud Storage에 다시 업로드하려면 npm install --save @google-cloud/storage를 사용하여 Google Cloud Storage 패키지를 설치하고 가져옵니다. 자바스크립트 프라미스를 사용해 샘플의 미리보기 이미지 처리 작업과 같은 외부 프로세스를 처리하려면 child-process-promise도 가져옵니다.

const functions = require('firebase-functions');
const gcs = require('@google-cloud/storage')();
const spawn = require('child-process-promise').spawn;
const path = require('path');
const os = require('os');
const fs = require('fs');

Cloud 함수 인스턴스의 임시 디렉토리에 파일을 다운로드하려면 gcs.bucket.file(filePath).download를 사용합니다. 이 위치에서 필요에 따라 파일을 처리한 다음 Cloud Storage에 업로드할 수 있습니다. 비동기 작업을 수행하는 경우 콜백에서 자바스크립트 프라미스를 반환해야 합니다.

예: 이미지 변환

Cloud 함수는 그래픽 이미지 파일을 조작할 수 있는 ImageMagick이라는 이미지 처리 프로그램을 제공합니다. 다음은 업로드된 이미지 파일의 미리보기 이미지를 만드는 방법의 예입니다.

// Download file from bucket.
const bucket = gcs.bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
const metadata = {
  contentType: contentType,
};
return bucket.file(filePath).download({
  destination: tempFilePath,
}).then(() => {
  console.log('Image downloaded locally to', tempFilePath);
  // Generate a thumbnail using ImageMagick.
  return spawn('convert', [tempFilePath, '-thumbnail', '200x200>', tempFilePath]);
}).then(() => {
  console.log('Thumbnail created at', tempFilePath);
  // We add a 'thumb_' prefix to thumbnails file name. That's where we'll upload the thumbnail.
  const thumbFileName = `thumb_${fileName}`;
  const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);
  // Uploading the thumbnail.
  return bucket.upload(tempFilePath, {
    destination: thumbFilePath,
    metadata: metadata,
  });
  // Once the thumbnail has been uploaded delete the local file to free up disk space.
}).then(() => fs.unlinkSync(tempFilePath));

이 코드는 ImageMagick 명령줄 프로그램 convert를 실행하여 임시 디렉토리에 저장된 이미지의 200x200 미리보기 이미지를 만든 다음 다시 Cloud Storage에 업로드합니다.

예 더보기

이미지 트랜스코딩, 콘텐츠 검토, EXIF 메타데이터 추출 등 일반적인 미디어 변환 함수의 다양한 예가 마련되어 있습니다. 전체 예 목록은 GitHub에서 확인할 수 있습니다.

자세한 내용은 전체 Google Cloud Storage 트리거 문서를 참조하세요.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.