Функция облачного развертывания Google с разрешением «Не проверять подлинность» в python - PullRequest
1 голос
/ 17 апреля 2020

Я развертываю облачную функцию Google из другой облачной функции с Python. См. Мой код ниже:

import requests
import json


def make_func(request):


    # Get the access token from the metadata server
    metadata_server_token_url = 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?scopes=https://www.googleapis.com/auth/cloud-platform'
    token_request_headers = {'Metadata-Flavor': 'Google'}
    token_response = requests.get(metadata_server_token_url, headers=token_request_headers)
    token_response_decoded = token_response.content.decode("utf-8")
    jwt = json.loads(token_response_decoded)['access_token']

    # Use the api to create the function
    response = requests.post('https://cloudfunctions.googleapis.com/v1/projects/myproject/locations/us-central1/functions',
                               json={"name":"projects/my-project/locations/us-central1/functions/funct","runtime":"python37","sourceArchiveUrl":"gs://bucket/main.zip","entryPoint":"hello_world","httpsTrigger": {} },
                               headers={'Accept': 'application/json', 
                                        'Content-Type': 'application/json',
                                        'Authorization': 'Bearer {}'.format(jwt)} )   
    if response:
         return 'Success! Function Created'
    else:
         return str(response.json())  

Однако эта функция не имеет функции «разрешить аутентификацию» автоматически. Таким образом, запросы извне не допускаются. Как я могу изменить свой код Python, чтобы добавить эту функцию при развертывании новой функции?

Спасибо

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Помимо ответа Дастина, вы должны знать, что --allow-unauthenticated для удобства разработчика. Под капотом он выполняет 2 вещи

  • Развертывание вашей функции в приватном режиме
  • Добавление всех пользователей в качестве участника с ролью Cloudfunction.invoker
gcloud functions add-iam-policy-binding --member=allUsers --role=roles/cloudfunctions.invoker function-1

Итак действительно, используйте для этого библиотеку google-cloud-iam.

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

  • Действительно, у вас есть авторизованная ошибка (401) -> Вы предоставляете заголовок авторизации, но он не авторизуется.
  • Без заголовка вы получаете ошибку 403 -> не аутентифицированную .

В любом случае вам необходимо иметь подписанный токен . У вас есть описание и python фрагмент кода здесь

1 голос
/ 17 апреля 2020

Вам необходимо дополнительно дать члену allUsers роль Cloud Functions Invoker:

from googleapiclient.discovery import build
service = build('cloudfunctions', 'v1')

project_id = ...
location_id = ...
function_id = ...
resource = f'projects/{project_id}/locations/{location_id}/functions/{function_id}'

set_iam_policy_request_body = {
    'policy': {
        "bindings": [
            {
              "role": "roles/cloudfunctions.invoker",
              "members": ["allUsers"],
            },
        ],
    },
}

request = service.projects().locations().functions().setIamPolicy(
    resource=resource,
    body=set_iam_policy_request_body,
)
response = request.execute()

print(response)

При этом используется пакет google-api-python-client.

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