Вопрос или проблема
Однажды все было хорошо, но на следующий день я начал сталкиваться с проблемами при использовании Python SDK azureml v1 для отправки заданий конвейера с моего локального компьютера в рабочую область Azure Machine Learning Studio. У меня начали появляться ошибки SSL. Я создал минимальное задание конвейера, чтобы воспроизвести ошибку. Этот код просто создает задание конвейера с одним шагом, с токен-скриптом под названием “script.py”, который ничего не делает.
Можно ли игнорировать проверку SSL где-то, или, может, как-то исправить это, не игнорируя проверку?
Версии библиотек:
azureml-core 1.55.0
azureml-pipeline 1.55.0
Вот мой минимальный код:
from azureml.core import Workspace, Environment, Experiment
from azureml.pipeline.steps import PythonScriptStep
from azureml.core.runconfig import RunConfiguration
from azureml.pipeline.core import Pipeline
subscription_id = <SUBSCRIPTION_ID>
resource_group = <RESOURCE_GROUP>
workspace_name = <WORKSPACE_NAME>
ws = Workspace(subscription_id, resource_group, workspace_name)
compute_target="my_compute_target"
runconfig = RunConfiguration()
runconfig.target = compute_target
curated_environment = Environment.get(workspace=ws, name="myenv")
runconfig.environment = curated_environment
step = PythonScriptStep(
script_name="script.py",
source_directory='.',
runconfig=runconfig,
allow_reuse=False,
)
pipeline = Pipeline(workspace=ws, steps=[step])
pipeline_run = Experiment(ws, 'token_experiment').submit(pipeline)
Вот сообщение об ошибке:
Traceback (most recent call last):
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\connectionpool.py", line 715, in urlopen
httplib_response = self._make_request(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\connectionpool.py", line 404, in _make_request
self._validate_conn(conn)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\connectionpool.py", line 1058, in _validate_conn
conn.connect()
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\connection.py", line 419, in connect
self.sock = ssl_wrap_socket(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\util\ssl_.py", line 449, in ssl_wrap_socket
ssl_sock = _ssl_wrap_socket_impl(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\util\ssl_.py", line 493, in _ssl_wrap_socket_impl
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\ssl.py", line 500, in wrap_socket
return self.sslsocket_class._create(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\ssl.py", line 1073, in _create
self.do_handshake()
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\ssl.py", line 1342, in do_handshake
self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1131)
Во время обработки вышеупомянутого исключения возникло другое исключение:
Traceback (most recent call last):
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\requests\adapters.py", line 486, in send
resp = conn.urlopen(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\connectionpool.py", line 799, in urlopen
retries = retries.increment(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\util\retry.py", line 592, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host="brazilsouth.api.azureml.ms", port=443): Max retries exceeded with url: /rp/workspaces/subscriptions/<subscription_id>/resourceGroups/<resource_group>/providers/Microsoft.MachineLearningServices/workspaces/<workspace_name>/computes?$skipToken=W3sidG9rZW4iOiIrUklEOn5nNTExQU13bVlTSmlLR1lBQUFBQUFBPT0jUlQ6MSNUUkM6MTAjSVNWOjIjSUVPOjY1NTUxI1FDRjo4I0ZQQzpBZ0tZQVo4Qm1BRUVBR0tvUEkrZkFRUUF4YU9FbXc9PSIsInJhbmdlIjp7Im1pbiI6IiIsIm1heCI6IkZGIn19XQ&api-version=2020-02-02 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1131)')))
Во время обработки вышеупомянутого исключения возникло другое исключение:
Traceback (most recent call last):
File "token_pipeline.py", line 35, in <module>
pipeline = Pipeline(workspace=ws, steps=[step])
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\core\_experiment_method.py", line 104, in wrapper
return init_func(self, *args, **kwargs)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\pipeline\core\pipeline.py", line 180, in __init__
self._graph = self._graph_builder.build(self._name, steps, finalize=False)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\pipeline\core\builder.py", line 1497, in build
graph = self.construct(name, steps)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\pipeline\core\builder.py", line 1519, in construct
self.process_collection(steps)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\pipeline\core\builder.py", line 1555, in process_collection
builder.process_collection(collection)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\pipeline\core\builder.py", line 1845, in process_collection
self._base_builder.process_collection(item)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\pipeline\core\builder.py", line 1549, in process_collection
return self.process_step(collection)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\pipeline\core\builder.py", line 1593, in process_step
node = step.create_node(self._graph, self._default_datastore, self._context)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\pipeline\steps\python_script_step.py", line 243, in create_node
return super(PythonScriptStep, self).create_node(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\pipeline\core\_python_script_step_base.py", line 150, in create_node
compute_target_name, compute_target_type, compute_target_object = _PythonScriptStepBase.\
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\pipeline\core\_python_script_step_base.py", line 214, in _extract_compute_target_params
compute_target_object = context.get_target(compute_target_name)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\pipeline\core\_graph_context.py", line 60, in get_target
self._targets = self._workspace.compute_targets
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\core\workspace.py", line 1069, in compute_targets
compute_target.name: compute_target for compute_target in ComputeTarget.list(self)}
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\core\compute\compute.py", line 519, in list
paginated_results = get_paginated_compute_results(result_list, headers)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\_compute\_util.py", line 46, in get_paginated_compute_results
resp = ClientBase._execute_func(get_requests_session().get, next_link, headers=headers)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\_restclient\clientbase.py", line 375, in _execute_func
return cls._execute_func_internal(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\_restclient\clientbase.py", line 368, in _execute_func_internal
left_retry = cls._handle_retry(back_off, left_retry, total_retry, error, logger, func)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\_restclient\clientbase.py", line 400, in _handle_retry
raise error
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\_restclient\clientbase.py", line 359, in _execute_func_internal
response = func(*args, **kwargs)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\requests\sessions.py", line 602, in get
return self.request("GET", url, **kwargs)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\requests\sessions.py", line 589, in request
resp = self.send(prep, **send_kwargs)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\requests\sessions.py", line 703, in send
r = adapter.send(request, **kwargs)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\requests\adapters.py", line 517, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host="brazilsouth.api.azureml.ms", port=443): Max retries exceeded with url: /rp/workspaces/subscriptions/<subscription_id>/resourceGroups/<resource_group>/providers/Microsoft.MachineLearningServices/workspaces/<workspace_name>/computes?$skipToken=W3sidG9rZW4iOiIrUklEOn5nNTExQU13bVlTSmlLR1lBQUFBQUFBPT0jUlQ6MSNUUkM6MTAjSVNWOjIjSUVPOjY1NTUxI1FDRjo4I0ZQQzpBZ0tZQVo4Qm1BRUVBR0tvUEkrZkFRUUF4YU9FbXc9PSIsInJhbmdlIjp7Im1pbiI6IiIsIm1heCI6IkZGIn19XQ&api-version=2020-02-02 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1131)')))
(myenv) C:\Users\myuser\token_pipeline>python token_pipeline.py
Traceback (most recent call last):
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\connectionpool.py", line 715, in urlopen
httplib_response = self._make_request(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\connectionpool.py", line 404, in _make_request
self._validate_conn(conn)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\connectionpool.py", line 1058, in _validate_conn
conn.connect()
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\connection.py", line 419, in connect
self.sock = ssl_wrap_socket(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\util\ssl_.py", line 449, in ssl_wrap_socket
ssl_sock = _ssl_wrap_socket_impl(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\util\ssl_.py", line 493, in _ssl_wrap_socket_impl
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\ssl.py", line 500, in wrap_socket
return self.sslsocket_class._create(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\ssl.py", line 1073, in _create
self.do_handshake()
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\ssl.py", line 1342, in do_handshake
self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1131)
Во время обработки вышеупомянутого исключения возникло другое исключение:
Traceback (most recent call last):
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\requests\adapters.py", line 486, in send
resp = conn.urlopen(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\connectionpool.py", line 799, in urlopen
retries = retries.increment(
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\urllib3\util\retry.py", line 592, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host="brazilsouth.experiments.azureml.net", port=443): Max retries exceeded with url: /environment/v1.0/subscriptions/b5d6fe63-452f-433a-9bb3-53f751969cc9/resourceGroups/rg-sbx-pocd-brazilsouth/providers/Microsoft.MachineLearningServices/workspaces/mlw-sbx-pocd-brazilsouth/environments/myenv (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1131)')))
Во время обработки вышеупомянутого исключения возникло другое исключение:
Traceback (most recent call last):
File "token_pipeline.py", line 25, in <module>
curated_environment = Environment.get(workspace=ws, name="myenv")
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\core\environment.py", line 1158, in get
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\azureml\_restclient\environment_client.py", line 36, in _get_environment_definition
response = requests.get(environment_url, headers=headers)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\requests\api.py", line 73, in get
return request("get", url, params=params, **kwargs)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\requests\api.py", line 59, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\requests\sessions.py", line 589, in request
resp = self.send(prep, **send_kwargs)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\requests\sessions.py", line 703, in send
r = adapter.send(request, **kwargs)
File "C:\Users\myuser\AppData\Local\miniforge3\envs\myenv\lib\site-packages\requests\adapters.py", line 517, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host="brazilsouth.experiments.azureml.net", port=443): Max retries exceeded with url: /environment/v1.0/subscriptions/b5d6fe63-452f-433a-9bb3-53f751969cc9/resourceGroups/rg-sbx-pocd-brazilsouth/providers/Microsoft.MachineLearningServices/workspaces/mlw-sbx-pocd-brazilsouth/environments/myenv (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1131)')))
Ответ или решение
В данной ситуации вы сталкиваетесь с ошибкой SSL, связанной с самоподписанными сертификатами при использовании Azure Machine Learning SDK в Python (версии 1.x). Ошибка SSLCertVerificationError
указывает на то, что ваша локальная машина не доверяет сертификату, который используется для обеспечения безопасного соединения с сервисами Azure.
Возможные решения проблемы:
1. Убедитесь в правильности сертификатов
Наиболее предпочтительное решение – это удостовериться, что сертификаты на вашей локальной машине обновлены и корректны. Убедитесь, что ваша версия библиотеки certifi
, которая используется для проверки SSL сертификатов, актуальна:
pip install --upgrade certifi
2. Настройка переменных окружения
Если вы находитесь в корпоративной сети или используете локальный прокси-сервер, возможно, ваш сетевой администратор требует дополнительной настройки. В таких случаях вам может быть необходимо указать переменные окружения для импортирования необходимых сертификатов:
set SSL_CERT_FILE=<path_to_certifi_certificates>
где <path_to_certifi_certificates>
должен указывать на файл сертификатов из вашей установки certifi
.
3. Игнорирование проверки SSL (не рекомендуется)
Если предыдущие шаги не помогли, вы можете временно отключить проверку SSL. Однако это решение небезопасно и не рекомендуется для производственной среды. Для этого можно добавить следующие строки в свой код:
import os
os.environ['CURL_SSL_BACKEND'] = 'secure-transport' # Если на Mac
os.environ['REQUESTS_CA_BUNDLE'] = '/path/to/your/certificate.pem' # Укажите свой сертификат
Или просто игнорировать ошибки SSL:
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# Игнорировать предупреждения о SSL сертификате
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
response = requests.get('your_url', verify=False)
Важно: Игнорирование проверки сертификатов может подвергать ваши данные риску, а также не рекомендуется использовать в рабочей среде.
4. Проверка надстроек прокси
Если ваш интернет-трафик проходит через прокси-сервер, убедитесь, что настройки прокси корректно настроены в AzureML и Python. Вы можете указать прокси в коде:
import os
os.environ['HTTP_PROXY'] = "http://user:pass@proxy:port"
os.environ['HTTPS_PROXY'] = "http://user:pass@proxy:port"
Заключение
Если ни одно из указанных выше решений не помогло устранить вашу ошибку, вам стоит обратиться к вашему сетевому администратору или в службу поддержки Azure. Они смогут диагностировать проблемы с сертификатами и сетевыми настройками более тщательно. Убедитесь также, что ваша версия SDK и другие зависимости актуальны, так как с помощью обновлений могут закладываться важные исправления безопасности.