Благодарим Вас за использование Amazon SageMaker.
Официального способа выполнения кода в экземпляре Notebook от Lambda не существует, но ниже приведено несколько неэффективное решение.
В дополнение к этому, если использование Lambda не является жестким требованием, то вы можете использовать какое-то задание cron в своем экземпляре Notebook для периодического запуска блокнотов jupyter.
Поскольку вы уже нашли способ запустить экземпляр Notebook из Lambda, вы можете использовать следующий код (замените notebook_instance_name на имя экземпляра Notebook), чтобы подключиться к своему экземпляру InService Notebook и выполнить на нем команду, включая ту, которую вы предоставили запустите блокноты Jupyter.
import boto3
import time
from botocore.vendored import requests
import websocket
def lambda_handler(event, context):
sm_client = boto3.client('sagemaker')
notebook_instance_name = 'test'
url = sm_client.create_presigned_notebook_instance_url(NotebookInstanceName=notebook_instance_name)['AuthorizedUrl']
url_tokens = url.split('/')
http_proto = url_tokens[0]
http_hn = url_tokens[2].split('?')[0].split('#')[0]
s = requests.Session()
r = s.get(url)
cookies = "; ".join(key + "=" + value for key, value in s.cookies.items())
ws = websocket.create_connection(
"wss://{}/terminals/websocket/1".format(http_hn),
cookie=cookies,
host=http_hn,
origin=http_proto + "//" + http_hn
)
ws.send("""[ "stdin", "jupyter nbconvert --execute --to notebook --inplace /home/ec2-user/SageMaker/Scikit.ipynb --ExecutePreprocessor.kernel_name=python3 --ExecutePreprocessor.timeout=1500\\r" ]""")
time.sleep(1)
ws.close()
return None
Обратите внимание, что в следующем коде используется модуль веб-сокета python websocket-client
, который не поставляется по умолчанию, поэтому вам нужно будет упаковать его с вашим лямбда-кодом и загрузить в lambda. Я следовал документации Lambda для упаковки зависимостей.