Здесь происходят две вещи:
- Вы не используете
request-futures
полностью правильно. Поскольку запрос выполняется асинхронно, необходимо заблокировать результат до того, как функция неявно вернется, иначе он может вернуться до завершения HTTP-запроса (хотя, вероятно, в этом примере):
session = FuturesSession()
future = session.get("{}".format(cf2_endpoint))
resp = future.result() # Block on the request completing
Запрос, который вы делаете для второй функции, на самом деле не является аутентифицированным запросом. Исходящие запросы от облачной функции не проходят проверку подлинности по умолчанию. Если вы посмотрите на фактический ответ выше, вы увидите:
>>> resp.status_code
403
>>> resp.content
b'\n<html><head>\n<meta http-equiv="content-type" content="text/html;charset=utf-8">\n<title>403 Forbidden</title>\n</head>\n<body text=#000000 bgcolor=#ffffff>\n<h1>Error: Forbidden</h1>\n<h2>Your client does not have permission to get URL <code>/function_two</code> from this server.</h2>\n<h2></h2>\n</body></html>\n'
Вы можете перепрыгнуть через множество обручей для правильной аутентификации этого запроса, как подробно описано в документации: https://cloud.google.com/functions/docs/securing/authenticating#function -to-function
Однако, лучшей альтернативой было бы сделать вашу вторую функцию "фоновой" функцией и вызывать ее через сообщение PubSub, опубликованное вместо первой функции:
from google.cloud import pubsub
publisher = pubsub.PublisherClient()
topic_name = 'projects/{project_id}/topics/{topic}'.format(
project_id=<your project id>,
topic='MY_TOPIC_NAME', # Set this to something appropriate.
)
def function_one(request):
message = b'My first message!'
publisher.publish(topic_name, message)
def function_two(event, context):
message = event['data'].decode('utf-8')
print(message)
Пока ваши функции имеют разрешения на публикацию сообщений sh PubSub, это избавляет от необходимости добавлять авторизацию к HTTP-запросам, а также обеспечивает доставку по крайней мере один раз.