2
votes

I'm trying to use the google remote api on my app engine project to upload local files to my app's default cloud storage bucket.

I have configured my app.yaml to have remote api on. I'm able to access my bucket and upload/access files from it. I run my local python console and try to write to the bucket with the following code:

from google.appengine.ext.remote_api import remote_api_stub
from google.appengine.api import app_identity
import cloudstorage

def auth_func():
  return ('user@gmail.com', '*******')

remote_api_stub.ConfigureRemoteApi('my-app-id', '/_ah/remote_api', auth_func,'my-app-id.appspot.com')
filename = "/"+app_identity.get_default_gcs_bucket_name()+ "/myfile.txt"
gcs_file = cloudstorage.open(filename,'w',content_type='text/plain',options={'x-goog-meta-foo': 'foo','x-goog-meta-bar': 'bar'})

I see the following reponse:

WARNING:root:suspended generator urlfetch(context.py:1214) raised DownloadError(Unable to fetch URL: http://None/_ah/gcs/my-app-id.appspot.com/myfile.txt)

Notice the

http://None/_ah/gcs.....  

I don't think None should be part of the url. Is there an issue with the GoogleAppEngineCloudStorageClient, v1.9.0.0? I'm also using Google App Engine 1.9.1.

Any ideas?

2
app_identity.get_default_gcs_bucket_name() is not getting set so it seems. Are you able to confirm it?Drewness
Yes, it returns my-app-id.appspot.combvk
Try changing filename = "/%s/myfile.txt" % app_identity.get_default_gcs_bucket_name()Drewness
And where you have 'my-app-id' you actually have your app id, correct?Drewness
Yes, ids/usernames/passwords/etc everything has been double checked.bvk

2 Answers

2
votes

Google Cloud Storage client does not respect remote_api_stub and considers you are running script locally

os.environ['SERVER_SOFTWARE'] = 'Development (remote_api)/1.0'

or even

os.environ['SERVER_SOFTWARE'] = ''

will help.

The function, checking your environment from common.py

def local_run():
  """Whether we should hit GCS dev appserver stub."""
  server_software = os.environ.get('SERVER_SOFTWARE')
  if server_software is None:
    return True
  if 'remote_api' in server_software:
    return False
  if server_software.startswith(('Development', 'testutil')):
    return True
  return False
0
votes

If I understand correctly, you want to upload a local text file to a specific bucket. I do not think what you're doing will work.

The alternative would be to ditch the RemoteAPI and upload it using the Cloud Storage API.