2

私はこのコードを持っています:

def save_to_gcs(self, img, img_obj):
    '''
    Image data, Image metadata object -> Blob Key
    Given an image and image metadata, stores it in a GCS bucket
    '''
    bucket = '/foo'
    filename = bucket + '/' + str(img_obj['filename'])

    self.tmp_filenames_to_clean_up = []

    logging.info('Creating file %s\n' % img_obj['filename'])

    write_retry_params = gcs.RetryParams(backoff_factor=1.1)
    gcs_file = gcs.open(filename,
                        'w',
                        content_type=img_obj['mimetype'],
                        retry_params=write_retry_params)
    gcs_file.write(img)
    gcs_file.close()
    self.tmp_filenames_to_clean_up.append(filename)

    return blobstore.create_gs_key('/gs/' + filename)

しかし、このエラーで失敗します:

Expect status [201] from Google Storage. But got status 403. Response headers: {'content-length': '145', 'via': 'HTTP/1.1 GWA', 'x-google-cache-control': 'remote-fetch', 'expires': 'Fri, 01 Jan 1990 00:00:00 GMT', 'server': 'HTTP Upload Server Built on Jun 7 2013 11:30:13 (1370629813)', 'pragma': 'no-cache', 'cache-control': 'no-cache, no-store, must-revalidate', 'date': 'Thu, 20 Jun 2013 23:13:55 GMT', 'content-type': 'application/xml; charset=UTF-8'}
Traceback (most recent call last):
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1536, in __call__
    rv = self.handle_exception(request, response, e)
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1530, in __call__
    rv = self.router.dispatch(request, response)
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/base/data/home/apps/s~foo/5.368231578716365248/main.py", line 409, in post
    blob_key = self.save_to_gcs(img, img_obj)  # Save the image to a GCS bucket. returns a blob_key
  File "/base/data/home/apps/s~foo/5.368231578716365248/main.py", line 448, in save_to_gcs
    retry_params=write_retry_params)
  File "/base/data/home/apps/s~foo/5.368231578716365248/external/cloudstorage/cloudstorage_api.py", line 69, in open
    return storage_api.StreamingBuffer(api, filename, content_type, options)
  File "/base/data/home/apps/s~foo/5.368231578716365248/external/cloudstorage/storage_api.py", line 527, in __init__
    errors.check_status(status, [201], headers)
  File "/base/data/home/apps/s~foo/5.368231578716365248/external/cloudstorage/errors.py", line 99, in check_status
    raise ForbiddenError(msg)
ForbiddenError: Expect status [201] from Google Storage. But got status 403. Response headers: {'content-length': '145', 'via': 'HTTP/1.1 GWA', 'x-google-cache-control': 'remote-fetch', 'expires': 'Fri, 01 Jan 1990 00:00:00 GMT', 'server': 'HTTP Upload Server Built on Jun 7 2013 11:30:13 (1370629813)', 'pragma': 'no-cache', 'cache-control': 'no-cache, no-store, must-revalidate', 'date': 'Thu, 20 Jun 2013 23:13:55 GMT', 'content-type': 'application/xml; charset=UTF-8'}

そのエラーを解読し、解決策を考え出すための助けをいただければ幸いです。

ありがとう

4

4 に答える 4

9

ドキュメンテーションは、App Engine アプリへのアクセスを許可することについて混乱しています (これはおそらくあなたの問題です)。最新のGoogle Cloud Consoleで私にとってうまくいったのは次のとおりです。

  1. Google Cloud Console でプロジェクトをクリックし、[APIs & auth] をクリックします。「Google Cloud Storage」と「Google Cloud Storage JSON API」をオンにします。
  2. 「概要」画面に戻り、左メニューの「クラウドストレージ」をクリックします。
  3. バケットの横にあるチェックボックスをクリックし、[バケットのアクセス許可] ボタンをクリックします。
  4. 新しい「ユーザー」権限を追加し、app Engine サービス アカウント名を application-id@appspot.gserviceaccount.com の形式で指定します。これは、AppEngine コンソールのアプリケーション設定にあります。このアカウント名を見つけるためのより良い手順については、こちらをご覧ください。
  5. 変更を保存します。
于 2013-09-16T03:05:06.860 に答える
1

これは私からはうまくいきませんでした。Googleは、以下の方法を実行する必要があると言っています。

バケットまたはオブジェクトに権限を付与します。アプリがバケットに新しいオブジェクトを作成できるようにするには、次のことを行う必要があります。

App Engine 管理コンソールにログインします。Cloud Storage バケットに対して承認するアプリケーションをクリックします。左側の [管理] セクションの下にある [アプリケーションの設定] をクリックします。[サービス アカウント名] の下の値をコピーします。これはアプリケーションのサービス アカウント名で、application-id@appspot.gserviceaccount.com の形式です。App Engine プレミア アカウントを使用している場合、アプリケーションのサービス アカウント名は application-id.example.com@appspot.gserviceaccount.com の形式になります。次のいずれかの方法を使用してアクセス権限を付与します。アプリにバケットへのアクセスを許可する最も簡単な方法は、Google Cloud Console を使用して、バケットを含むプロジェクトにアプリのサービス アカウント名をチーム メンバーとして追加することです。これは、Google Cloud Console の左側のサイドバーにある [アクセス許可] で実行できます。バケットに書き込む必要がある場合、アプリには編集権限が必要です。Cloud Storage の権限については、スコープと権限をご覧ください。必要に応じて、プロジェクト チームにさらにアプリを追加します。注: 状況によっては、サービス アカウントをチーム メンバーとして追加できない場合があります。サービス アカウントを追加できない場合は、次に説明する別の方法であるバケット ACL を使用します。

于 2013-12-04T14:17:35.700 に答える
1

...上記に加えて、「Cloud Console」のプロジェクトの「API's and Auth」の下にある「API's」に移動し、「Google Cloud Storage」がオンになっていることを確認します。「Billing」の下で、それがオンになっています。

于 2013-09-30T16:04:45.323 に答える