Google App Engine(GAE)のローカルサーバ上のGoogle Cloud Storage(GCS)へのファイルアップロード
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,710
どなたか、お知恵を貸していただけますでしょうか。よろしくお願いします。
前提・実現したいこと
Google App Engine(Python)にて、
Google Cloud Storageへのアクセスも行うアプリケーションを作っています。
その中で、一部、開発の過程として、ローカルファイルをGCSにアップロードする必要があるのですが、
dev_appserver.pyによって起動するローカルのGCSエンドポイントへのアップロード方法が分からず困っています。
試したこと
リモートのGCSのバケットへのアップロードはgsutilコマンドで可能という旨、理解しており、
一通り、"Google Cloud Storage / GCS / dev_appserver / upload / local file"などの
キーワードをもとに調べたのですが有益な情報を発見できませんでした。
補足情報(言語/FW/ツール等のバージョンなど)
Pythonやgcloudコマンドのバージョンは以下の通りです。
$ python --version
Python 2.7.10
$ gcloud components list
Your current Cloud SDK version is: 180.0.1
The latest available version is: 182.0.0
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Components │
├──────────────────┬──────────────────────────────────────────────────────┬──────────────────────────┬───────────┤
│ Status │ Name │ ID │ Size │
├──────────────────┼──────────────────────────────────────────────────────┼──────────────────────────┼───────────┤
│ Update Available │ Cloud SDK Core Libraries │ core │ 6.9 MiB │
│ Not Installed │ App Engine Go Extensions │ app-engine-go │ 97.7 MiB │
│ Not Installed │ Cloud Bigtable Command Line Tool │ cbt │ 4.0 MiB │
│ Not Installed │ Cloud Bigtable Emulator │ bigtable │ 3.5 MiB │
│ Not Installed │ Cloud Datalab Command Line Tool │ datalab │ < 1 MiB │
│ Not Installed │ Cloud Datastore Emulator │ cloud-datastore-emulator │ 17.7 MiB │
│ Not Installed │ Cloud Datastore Emulator (Legacy) │ gcd-emulator │ 38.1 MiB │
│ Not Installed │ Cloud Pub/Sub Emulator │ pubsub-emulator │ 33.2 MiB │
│ Not Installed │ Emulator Reverse Proxy │ emulator-reverse-proxy │ 14.5 MiB │
│ Not Installed │ Google Container Local Builder │ container-builder-local │ 3.7 MiB │
│ Not Installed │ Google Container Registry's Docker credential helper │ docker-credential-gcr │ 2.2 MiB │
│ Not Installed │ gcloud Alpha Commands │ alpha │ < 1 MiB │
│ Not Installed │ gcloud app Java Extensions │ app-engine-java │ 118.4 MiB │
│ Not Installed │ gcloud app PHP Extensions │ app-engine-php │ 21.9 MiB │
│ Not Installed │ kubectl │ kubectl │ 12.2 MiB │
│ Installed │ BigQuery Command Line Tool │ bq │ < 1 MiB │
│ Installed │ Cloud Storage Command Line Tool │ gsutil │ 3.3 MiB │
│ Installed │ gcloud Beta Commands │ beta │ < 1 MiB │
│ Installed │ gcloud app Python Extensions │ app-engine-python │ 6.2 MiB │
│ Installed │ gcloud app Python Extensions (Extra Libraries) │ app-engine-python-extras │ 27.8 MiB │
└──────────────────┴──────────────────────────────────────────────────────┴──────────────────────────┴───────────┘
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
最前策(何らかのコマンドでのローカルGCSへのアップロード)ではありませんが、
取り急ぎ、対処はできたので、その方法を共有します。引き続き、代替案は募集しております。。
自分の場合はDjangoを使っていますが、
以下のように、dev_appserver起動中にキックできるエンドポイントにて、
以下のような処理を実行することで、dev_appserver上のGCSへとローカルファイルをコピーできました。
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from google.appengine.tools.devappserver2.python.runtime.stubs import FakeFile
import cloudstorage
def execute(request):
project_root_dir = 'プロジェクトルートの絶対パス'
# ローカルファイルにアクセスできるよう、強制的に解放。本番では無効なので、あくまで開発用です。
# 本番環境ではローカルファイルアクセスが許されないので、本来はこの制約がある。
allowed_dirs = list(FakeFile.ALLOWED_DIRS)
allowed_dirs.append('プロジェクトルートから見たアクセスしたいフォルダの相対パス')
allowed_dirs = set(allowed_dirs)
FakeFile.set_allowed_paths(project_root_dir, allowed_dirs)
file_list = 移動したいファイルの、プロジェクトルートからみた相対パスのリスト
for file_path in file_list:
# get full path
full_file_path = project_root_dir + '/' + file_path
# open file locally
# 冒頭のFakeFileへの設定変更により、openをエラーなく実行可能。
with open(full_file_path) as local_file:
data = local_file.read()
local_file.close()
# save file in local gcs
save_path = 'バケット名' + '/' + file_path
with cloudstorage.open(filename=save_path, mode='w', content_type='text/plain') as f:
f.write(str(data))
f.close()
return HttpResponse(status=200)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる