403 Отказано в доступе к AutoML из PubSub - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь создать приложение, используя Google Cloud Platform AutoML, используя Python. Мой общий поток кода выглядит так:

Взаимодействие с пользователем -> данные, отправленные в PubSub -> обратный вызов, вызывает мой AutoML -> Результат

Фрагмент, который вызывает pubsub, выглядит следующим образом:

blob=blob+bytes(doc_type,'utf-8')
        publisher.publish(topic,blob)
        future=subscriber.subscribe(subscription,callback=callback)
        #flash("The object is "+future,'info')
        try:
            future.result()
        except Exception as ex:
            subscriber.close()

В PubSub обратный вызов:

def callback(message):
     new_message=message.data
     display_name,score=predict_value(new_message,"modelID","projectid",'us-central1')
     message.ack()

А мой predict_value получает model_id, project id и вычисляет region и выполняет прогноз.

Когда я напрямую звоню predict_value без использования PubSub, он работает нормально. Если мне это нравится, я получаю сообщение об ошибке ниже:

google.api_core.exceptions.PermissionDenied: 403 Permission 'automl.models.predict' denied on resource 'projects/projectID/locations/us-central1/models/' (or it may not exist).

Пожалуйста, помогите мне решить проблему

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Большое спасибо за все ваши ответы. Я только что исправил проблему, используя приведенный ниже пример фрагмента

def receive_messages_synchronously(project, subscription_name):
"""Pulling messages synchronously."""
# [START pubsub_subscriber_sync_pull]
# project           = "Your Google Cloud Project ID"
# subscription_name = "Your Pubsub subscription name"
subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(
    project, subscription_name)

# Builds a pull request with a specific number of messages to return.
# `return_immediately` is set to False so that the system waits (for a
# bounded amount of time) until at lease one message is available.
response = subscriber.pull(
    subscription_path,
    max_messages=3,
    return_immediately=False)

ack_ids = []
for received_message in response.received_messages:
    print("Received: {}".format(received_message.message.data))
    ack_ids.append(received_message.ack_id)

# Acknowledges the received messages so they will not be sent again.
subscriber.acknowledge(subscription_path, ack_ids)
# [END pubsub_subscriber_sync_pull]

Причиной того, что созданная подписка использует запрос на извлечение. Я предполагаю, что концепция метода обратного вызова в основном используется для «push», что может быть причиной того, что я не дал конечную точку и токен для публикации сообщения. Надеюсь, что я думаю, правильно. Дайте мне знать ваши взгляды.

0 голосов
/ 05 сентября 2018

Вероятно, это связано с одним из двух факторов:

  • неверные учетные данные, используемые при отправке запроса в API AutoML - весьма вероятно, что pubsub выполняется в другом контексте и не может получить учетные данные по умолчанию

  • неверное имя ресурса модели (убедитесь, что оно правильное) - оно должно выглядеть примерно так: «projects / 12423534 / location / us-central1 / models / 23432423"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...