2015-12-21 2 views
0
  1. Какой-то WSGI (https://cloud.google.com/appengine/docs/python/tools/webapp/running) необходим для GAE? Это похоже на конфигурацию CGI от HTTPD? Т.е., в app.yaml У меня должен быть script.app и ссылка app на объект wsgi/webapp?GAE Запуск сценария Python и разрешения GCE

  2. Пытается использовать AppAssertionCredentials для аутентификации с GAE до GCE. Я сделал еще один сценарий, что этот фрагмент работал в:

credentials = AppAssertionCredentials( scope='https://www.googleapis.com/auth/compute') auth_http = credentials.authorize(httplib2.Http()) compute = discovery.build('compute', 'v1', http=auth_http)

То, что я пытаюсь сделать, теперь создать GCE снимки с GAE, используя REST API. Я не понимаю, как ссылаться на объект compute для моего POST, чтобы получить авторизацию на работу (теперь получение Unauthorized).

Это мой сценарий (слишком много import s из-за тестирование):

import requests 
import urllib2 
import logging 
import sys 
import argparse 
import httplib2 
from oauth2client.client import flow_from_clientsecrets 
from oauth2client.file import Storage 
from oauth2client import tools 
from oauth2client.tools import run_flow 
from oauth2client.appengine import AppAssertionCredentials 
from google.appengine.api import memcache 
import datetime 
import httplib2 
import json 
import logging 
from pprint import pformat 
from apiclient import discovery 
from google.appengine.api import memcache 
from oauth2client.appengine import AppAssertionCredentials 
import cgi 
from google.appengine.api import users 
import urllib 
from google.appengine.api import users 
from google.appengine.ext import ndb 
import time 

PROJECT = "testprojgce" 
ZONE = "europe-west1-b" 


### OAuth2 

credentials = AppAssertionCredentials(
scope='https://www.googleapis.com/auth/compute') 
auth_http = credentials.authorize(httplib2.Http()) 
compute = discovery.build('compute', 'v1', http=auth_http) 


# Create snapshot 
createsnapurl= "https://www.googleapis.com/compute/v1/projects/"+PROJECT+"/zones/"+ZONE+"/disks/testdisk1/createSnapshot" 
req=requests.post(createsnapurl) 
+0

Пожалуйста, придерживайтесь «одного вопроса на вопрос» - это ОЧЕНЬ фундаментальный этикет StackOverflow. Сосредоточение внимания только на вопросе 1, да: 2.7 Время выполнения Python веб-сервера GAE подключается к вашему коду через ваши приложения WSGI (приложение.yaml может отправить один или несколько из них), как и любой другой веб-сервер - любая любая инфраструктура Python по вашему выбору легко делает это (я рекомендую для вашего случая использования легкую фрейму, такую ​​как сокол, колба, бутылка, или webapp2, а не богатый и тяжелый полноценный, такой как django или web2py, но, конечно же, это ВАШ выбор). –

+0

У вас возникли сомнения, следует ли открывать с помощью «Это вопрос из 2 частей» или что-то подобное. Извините за нарушение правил SO. – PyGAE

ответ

2

1) Насколько я знаю, объект WSGI это на самом деле требуется, так как это, как приложение взаимодействует с серверной средой , Этот объект легко доступен с помощью Django, Flask, webapp2 или других фреймворков, поэтому его не должно быть слишком сложно получить. Посмотрите на:

https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine

Для большого количества образцов GAE конфигурации.

2) Вместо учетных данных AppAssertion теперь рекомендуются учетные данные приложения по умолчанию.

https://developers.google.com/identity/protocols/application-default-credentials

Это намного проще работать, и легко работает на GAE, GCE (предполагается, что вы создали экземпляры с нужными прицелов), MVMs. Он также работает в вашей локальной среде, либо используя учетную запись «пользователь» по умолчанию, которую вы получаете от gcloud init, или вы можете указать переменную окружения GOOGLE_APPLICATION_CREDENTIALS на учетные данные учетной записи службы JSON. Локально я бы рекомендовал загружать учетную запись службы JSON и указывать на нее переменную среды, поскольку не каждый API поддерживает учетную запись пользователя.

credentials = GoogleCredentials.get_application_default() 
compute_service = discovery.build(
    'compute', 'v1', credentials=credentials) 

Примечание для большинства API, вам не нужно указывать области действия, так как он автоматически вводится, но если вы отсутствуете проблемы области действия, попробуйте использовать «credentials.created_scoped» метод.

Наконец, вам почти никогда не нужно использовать что-то вроде запросов для непосредственного взаимодействия с REST apis, то есть основной точкой клиентских библиотек. Это гарантирует, что ваш запрос HTTP будет правильно разрешен, и у вас будут методы уровня языка вместо строк URL. Вместо этого, сделать что-то вроде:

jsonBody = { 
    #see request body section here for how to fill this in  #https://cloud.google.com/compute/docs/reference/latest/disks/createSnapshot 
} 
compute_service.disks().createSnapshot(project=project, zone=zone, disk=diskName, body=jsonBody) 

Это может быть не точный синтаксис, оставьте комментарий, если вы не можете заставить его работать, и я постараюсь это исправить.

+0

Билл, спасибо за тщательный ответ. Очевидно, что методы библиотеки клиентов - это предпочтительный способ делать что-то, но я думаю, что для этого случая они довольно ограничены (список, добавление, удаление, запуск, остановка - https://cloud.google.com/compute/docs/tutorials/python -руководство # nextsteps). Я не вижу никаких методов 'disks'. Я предполагаю, что необходим «низкоуровневый» API (https://cloud.google.com/compute/docs/reference/latest/disks/createSnapshot). Пожалуйста, поправьте меня, если я ошибаюсь. Или вы имели в виду, что мне нужно использовать этот низкоуровневый вызов POST напрямую, но иначе? – PyGAE

+0

@PyGAE, я столкнулся с подобной проблемой, но пока не уверен. Возможно, это проблема с удалением неверного документа открытия или неправильной версии API. Это определенно проблема с клиентскими библиотеками, если вы не можете совершать вызовы API с ними, вам никогда не придется использовать запросы. Я нахожусь на рождественском перерыве, но я снова посмотрю, когда вернусь. –

+0

Думаю, я нашел его. Не так прямо из документации API разработчиков. Вот метод 'createnapshot' (https://developers.google.com/resources/api-libraries/documentation/compute/v1/python/latest/compute_v1.disks.html#createSnapshot), и вот все' диски ' методы и методы клиентской библиотеки для GCE - https://developers.google.com/resources/api-libraries/documentation/compute/v1/python/latest/compute_v1.disks.html. Я попробую и отправлю отчет – PyGAE

Смежные вопросы