boto3 - конфигурация жизненного цикла в кодировке base64 вызывает сбой экземпляра - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь настроить конфигурации жизненного цикла для ноутбуков Sagemaker через aws api через boto3.Из документов он читает, что необходимо предоставить строку конфигурации в кодировке base64.

Я использую следующий код:

with open(lifecycleconfig.sh, 'rb') as fp:
    file_content = fp.read()
config_string = base64.b64encode(file_content).decode('utf-8')
boto3.client('sagemaker').create_notebook_instance_lifecycle_config(
    NotebookInstanceLifecycleConfigName='mylifecycleconfig1',
    OnCreate=[
        {
            'Content': config_string
        },
    ],
)

С некоторыми lifecycleconfig.sh:

#!/bin/bash

set -e

Это создает конфигурацию жизненного цикла, которая отображается в веб-интерфейсе и содержимое которой, по-видимому, идентично созданию конфигурации вручную: image .

Однако ноутбуки, использующие конфигурацию жизненного цикла, созданные с помощью boto3, не запустятся, и в файле журнала отобразится ошибка:

/home/ec2-user/SageMaker/create_script.sh: line 2: $'\r': command not found
/home/ec2-user/SageMaker/create_script.sh: line 3: set: -
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

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

Как мне кодировать bash-скрипт для рабочей конфигурации жизненного цикла aws?

1 Ответ

0 голосов
/ 21 февраля 2019

Обнаружено, что на самом деле это специфическая проблема Windows, касающаяся разницы между open(..., 'rb').read() и open(..., 'r').read().encode('utf-8').

На моей машине с Linux эти два результата дают один и тот же результат.В Windows, однако, open(..., 'rb') предоставляет такие вещи, как \r\n для новых строк, что, по-видимому, может быть понято через веб-интерфейс Amazon, но не для машины linux, на которой развернут скрипт.

Это независимое от ОС решение:

with open(lifecycleconfig.sh, 'r') as fp:
    file_content = fp.read()
config_string = base64.b64encode(file_content.encode('utf-8')).decode('utf-8')
...