Cloud Functions 등 firebase-admin으로 Storage를 추가, 삭제, 존재 확인

개발중의 적독용의 독서 관리 서비스 「적독 하우 매치
새로운 보고 기능이 출시되었습니다

화면은 이런 느낌.

#적독하우마치 에서 새롭게 추가한 보고 기능, OGP 화상의 생성을 하거나 하기 때문에, 조금 읽어들이기에 시간이 필요한 때도... 조금 기다려 주실 수 있으면 기쁩니다!! 피 c. 라고 r. 코 m / 8tLR 9 4h — 적독 하우매치 📚 키라 푸카 (@kira_puka) August 20, 2019


트윗에도 쓰여진 대로, 뒤에서는,



  1. OGP 이미지가 생성되는지 확인
  2. 생성하지 않으면 OGP 이미지 생성


하고 있습니다.



Firebase Functions에서 이러한 작업을 수행하고 있지만

firebase-admin을 사용한 경우 Storage가 다르기 때문에

비망록적으로 정리해 둡니다.



(ImageMagic을 사용한 이미지 생성 및 업로드 기사는 여기)



firebase-admin은 Google Cloud Storage API를 사용합니다.



@ 히츠지 네타 님의 기사 를 보면, 클라이언트판과는 달리,

firebase-admin을 사용하면 Google Cloud Storage API를 사용합니다.



이므로 API 참조도

@google-cloud/storage 쪽을 확인할 필요가 있다.



다양한 작업을하는 코드



코드로서는, 이런 느낌.



  1. 파일 추가/업로드: upload()
  2. 다운로드 URL 받기: download()
  3. 파일 존재 확인: exists()
  4. 파일 삭제: deleteFile()


에서 위의 처리를 각각 수행하고 있습니다.



firebase-admin을 로컬에서도 실행 가능 그래서

이번은 Functions가 아니라 그쪽의 코드 예.



const admin = require("firebase-admin");

// 配置したサービスアカウントの秘密鍵を取得
const serviceAccount = require("./key/XXXXX.json");

// firebase-adminを初期化
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  // storageBucketはローカルで実行するときのみ必要。
  // Functions上ではFunctions側で設定される
  storageBucket: "your-storage-bucket-name.appspot.com"
});

// storageのbucketのインスタンスを取得
const bucket = admin.storage().bucket();

/**
 * Cloud Storageへのアップロード
 *
 * @param {string} uploadFile アップロードするファイル
 * @param {string} uploadPath アップロード先のStorageのパス
 */
async function upload(uploadFile, uploadPath) {
  await bucket.upload(uploadFile, { destination: uploadPath });
}

/**
 * Cloud Storageへのダウンロード(StoregeのURL取得)
 * 簡易化のため、署名付きURLの取得ではなく、Storage上のURLを生成しています。
 * 
 * @param {string} uploadedPath アップロード済みのstorage上のパス
 * @returns {string} ダウンロードURL
 */
async function download(uploadedPath) {
  const STORAGE_ROOT = "https://firebasestorage.googleapis.com/v0/b";
  const bucketName = bucket.name;
  const dlPath = encodeURIComponent(uploadedPath);
  const dlURL = `${STORAGE_ROOT}/${bucketName}/o/${dlPath}?alt=media`;

  return dlURL;
}

/**
 * Cloud Storage上のファイルの存在確認
 *
 * @param {string} uploadedPath アップロード済みのstorage上のパス
 * @returns {boolean} ファイルの存在有無
 */
async function exists(uploadedPath) {
  const exists = await bucket.file(uploadedPath).exists();
  return exists[0];
}

/**
 * Cloud Storage上のファイルの削除
 *
 * @param {string} uploadedPath アップロード済みのstorage上のパス
 */
async function deleteFile(uploadedPath) {
  await bucket.file(uploadedPath).delete();
}

// ****************************
// * MAIN
// ****************************
async function main() {
  console.log(`***** START MAIN`);

  // アップロード
  const uploadFile = "./ogp_top.png"; // アップロードしたいファイルのパス
  const uploadPath = "ogp/generate_ogp.png"; // アップロード先のStorage上のパス
  await upload(uploadFile, uploadPath);
  console.info(`${uploadFile} is uploaded into '${uploadPath}'.`);

  // ダウンロード
  const uploadedPath = uploadPath;
  const downloadURL = await download(uploadedPath);
  console.info(`downloadURL=${downloadURL}`);

  // ファイルの存在確認
  const isExists = await exists(uploadedPath);
  console.info(`isExists=${isExists}`);

  // ファイルの削除
  await deleteFile(uploadedPath);
  console.info(`${uploadedPath} is deleted.`);

  console.log(`***** END   MAIN`);
}

main().then();


로컬로 실행할 때의 주의점으로서는 admin.initializeApp() 때로
storageBucket 를 설정해야 한다.

Functions상에서 실행하는 경우는, Functions측에서 설정해 주기 때문에 불필요합니다.



// firebase-adminを初期化
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  // storageBucketはローカルで実行するときのみ必要。
  // Functions上ではFunctions側で設定される
  storageBucket: "your-storage-bucket-name.appspot.com"
});


지금 로컬로 생성된 파일도 업로드할 수 있습니다(´ω`)

물론 Cloud Functions에서도 움직이기 때문에 처음 트윗 동영상처럼

존재 확인 및 생성 등도 가능하거나 ヽ(=´▽`=)노



결론



Nuxt.js나 Firebase를 사용하면서 기능 추가하고 있는 서비스입니다!

적독 총액 랭킹이나 인기의 책 등도 있으므로, 좋으면 아무래도 받을 수 있으면!!



쌓은 책의 총액을 알 수 있는 독서 관리 서비스

'적독 하우 매치'





요망·감상·어드바이스 등 있으면,

공식 계정( @MemoryLoverz )과 개발자( @kira_puka )까지~♪



참고로 한 사이트




좋은 웹페이지 즐겨찾기