# [GCP][GCS]Node.jsライブラリでストレージを活用する Node.jsのライブラリを使いストレージを制御します ## GCSとの連携について セキュリティやアクセス制御の観点から、 フロントエンドは直接Cloud Storageにアクセスせず サーバー経由で取得するのが一般的です ただし静的なファイルや公開データであれば フロントエンドから直接Cloud Storageにアクセスすることもあります ## ライブラリのインストール ```sh npm install --save @google-cloud/storage ``` ## GCS接続 ```js const { Storage } = require('@google-cloud/storage'); ``` **サービスアカウントを環境変数で設定する場合** ```sh export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json" ``` ```js const storage = new Storage() ``` **JSONキーファイルをソースで読み込む場合** ```js const KEY_FILE_PATH = './keys/service-account.json' const storage = new Storage({ keyFilename: KEY_FILE_PATH}); ``` **JSONキーファイルを使わず直接設定** ```js const serviceAccount = { type: "service_account", project_id: "your-project-id", private_key_id: "your-private-key-id", private_key: "-----BEGIN PRIVATE KEY-----\nYOUR-PRIVATE-KEY\n-----END PRIVATE KEY-----\n", client_email: "your-service-account@your-project-id.iam.gserviceaccount.com", client_id: "your-client-id", auth_uri: "https://accounts.google.com/o/oauth2/auth", token_uri: "https://oauth2.googleapis.com/token", auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs", client_x509_cert_url: "https://www.googleapis.com/robot/v1/metadata/x509/your-service-account" }; const storage = new Storage({ credentials: serviceAccount }); ``` ## 権限について * ストレージ管理者 * * 環境とストレージ オブジェクト閲覧者 * Storage オブジェクト閲覧者 * ストレージ フォルダ管理者 ## サンプルコード ### バケット一覧を取得する ```js /** * バケット一覧を取得する */ async function listBuckets() { const [buckets] = await storage.getBuckets(); console.log('Buckets:'); buckets.forEach(bucket => { console.log(bucket.name); }); } ``` ファイル検索については以下のページを参照してください [[GCP]Google Cloud Storageでパターンにマッチしたファイル一覧を取得する](https://wiki.pglikers.com/en/private/cloud/gcp/gcs/glob) ### バケットの中のファイル一覧を取得する ```js async function listFiles(bucketName) { const [files] = await storage.bucket(bucketName).getFiles(); console.log(`Files in ${bucketName}:`); files.forEach(file => { console.log(file.name); }); } ``` ### 署名付きURLを発行する ```js /** * 署名付きURLを生成する */ const generateV4ReadSignedUrl = async (bucketName, fileName) => { const options = { version: 'v4', action: 'read', expires: Date.now() + 15 * 60 * 1000, // 15 minutes }; const [url] = await storage.bucket(bucketName).file(fileName).getSignedUrl(options); console.log(`Generated GET signed URL:`); console.log(url); return url; } ``` ### ファイルをダウンロードする ```js // ファイルのコンテンツをダウンロードする const downloadFile = async () => { const options = { destination: path.join(__dirname, FILE_NAME) }; await storage.bucket(BUCKET_NAME).file(FILE_NAME).download(options); // 取得したファイルのコンテンツからファイルを生成する console.log(`Downloaded ${FILE_NAME}`); }; ```