diff --git a/.gitignore b/.gitignore index 0d48790..60a6164 100644 --- a/.gitignore +++ b/.gitignore @@ -133,4 +133,5 @@ dist csv_output/ output/ output.* -docments/ \ No newline at end of file +docments/ +keys/ \ No newline at end of file diff --git a/docs/cloudStorageByNode.md b/docs/cloudStorageByNode.md new file mode 100644 index 0000000..003724c --- /dev/null +++ b/docs/cloudStorageByNode.md @@ -0,0 +1,138 @@ +# [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}`); +}; +``` diff --git a/package-lock.json b/package-lock.json index 2a59f05..00ff657 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,8 @@ "dependencies": { "@google-cloud/storage": "^7.15.2", "archiver": "^7.0.1", - "csv-writer": "^1.6.0" + "csv-writer": "^1.6.0", + "dotenv": "^16.4.7" }, "devDependencies": { "jsdoc": "^4.0.4" @@ -601,6 +602,18 @@ "node": ">=0.4.0" } }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", diff --git a/package.json b/package.json index 5a8f23f..08ffa37 100644 --- a/package.json +++ b/package.json @@ -2,11 +2,12 @@ "name": "js-common-code", "version": "1.0.0", "description": "Javascriptで活用できるコードを開発する。 Node.jsによりサーバーサイドも作成する", - "main": "src/server/hellp.js", + "main": "src/server/index.js", "directories": { "doc": "docs" }, "scripts": { + "dev": "node src/server/index.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", @@ -14,7 +15,8 @@ "dependencies": { "@google-cloud/storage": "^7.15.2", "archiver": "^7.0.1", - "csv-writer": "^1.6.0" + "csv-writer": "^1.6.0", + "dotenv": "^16.4.7" }, "devDependencies": { "jsdoc": "^4.0.4" diff --git a/src/front/assets/cloud-storage.js b/src/front/assets/cloud-storage.js new file mode 100644 index 0000000..e69de29 diff --git a/src/front/assets/data/test.zip b/src/front/assets/data/test.zip new file mode 100644 index 0000000..6144330 Binary files /dev/null and b/src/front/assets/data/test.zip differ diff --git a/src/front/download.html b/src/front/download.html index 778f801..8587432 100644 --- a/src/front/download.html +++ b/src/front/download.html @@ -14,6 +14,7 @@
Server
+Google Storage Link
+Zip File Download
+ + +diff --git a/src/front/gcs.html b/src/front/gcs.html new file mode 100644 index 0000000..b7cea62 --- /dev/null +++ b/src/front/gcs.html @@ -0,0 +1,15 @@ + + +
+ + + +
+ +
+