139 lines
3.8 KiB
Markdown
139 lines
3.8 KiB
Markdown
# [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}`);
|
|
};
|
|
```
|