GitHub Actions — это мощная платформа непрерывной интеграции и непрерывной доставки (CI/CD), которая позволяет разработчикам автоматизировать конвейеры сборки, тестирования и развертывания. Рабочие процессы автоматически создают и тестируют код всякий раз, когда происходит событие, такое как запрос на вытягивание или развертывание объединенных запросов на вытягивание в рабочей среде. Лучше всего то, что вы можете использовать его, не выходя из собственного репозитория!

С момента своего выпуска в 2018 году Github Actions стал популярным выбором CI/CD для инженеров по машинному обучению и специалистов по данным. Но для пользователей одной из самых распространенных платформ машинного обучения, AWS SageMaker, предоставление Github разрешения на автоматизацию рабочих процессов машинного обучения является трудной первой задачей. Каким бы крутым ни был подъем, есть достаточно мотивации, чтобы настроить эти два устройства вместе. Пользователи SageMaker могут использовать GitHub Actions для автоматизации всего рабочего процесса машинного обучения, от разработки до эксплуатации. Это включает в себя автоматизацию задач предварительной обработки данных, создание и отправку учебных заданий в SageMaker, а также развертывание обученных моделей непосредственно в производственных средах, где их можно использовать для реальных приложений, таких как поиск лекарств, обнаружение мошенничества или системы рекомендаций. Использование GitHub Actions для автоматизации жизненного цикла машинного обучения экономит время и повышает точность благодаря автоматическому тестированию на каждом этапе конвейерного процесса. Это стоит первоначальной настройки, и цель этого поста — показать вам, как это сделать.

Существует два варианта настройки учетных данных AWS в GitHub Actions. Первый проще, но менее безопасен и часто не соответствует требованиям безопасности организации. Второй вариант требует больше предварительной работы, но он более безопасен и рекомендуется AWS и экспертами по безопасности.

Вариант 1. Сохранение учетных данных IAM в виде секретов на GitHub

Первый вариант — сохранить ключ доступа IAM и секрет пользователя SageMaker в качестве секрета репозитория GitHub Actions. Как правило, это не рекомендуется, поскольку для этого требуется создать учетные данные в AWS, а затем дублировать их в GitHub в качестве секрета. Однако это самый простой способ подключить GitHub Actions и SageMaker.

Каждый из следующих шагов хорошо известен, поэтому я приведу ссылки на эти задачи, чтобы вы могли выполнить их самостоятельно:

1а. Создание пользователя и роли IAM для SageMaker

1б. Создать ключ доступа и секрет пользователя IAM

1с. Добавить ключ доступа пользователя IAM и секрет в Github Actions как секреты

1д. [Необязательно] Добавьте регион AWS в качестве секрета.

После сохранения учетных данных AWS в GitHub вы можете настроить свои учетные данные в рабочем процессе Github, используя aws-actions и сохраненные секреты.

1e: добавьте действие в yaml рабочего процесса GitHub:

- name: Configure AWS Credentials
  uses: aws-actions/configure-aws-credentials@v1
  with:
    aws-access-key-id: ${{secrets.AWS_ACCESS_KEY_ID}}
    aws-secret-access-key: ${{secrets.AWS_SECRET_ACCESS_KEY}}
    aws-region: ${{secrets.AWS_REGION}}

Вариант 2. Используйте краткосрочные учетные данные через OIDC.

Если вам сойдет с рук вариант 1 в вашем бизнесе, просто знайте, что вы живете хорошей жизнью, потому что хранить учетные данные AWS в репозиториях GitHub, как бы это ни было просто, обычно не рекомендуется. Более безопасный вариант — использовать OpenID Connect (OIDC) для запроса краткосрочных учетных данных для вашего рабочего процесса при каждом его запуске.

OpenID Connect Connect (OIDC) — это протокол, созданный на основе протокола OAuth 2.0 для аутентификации пользователей. Вы можете настроить IAM, чтобы установить доверие между поставщиком удостоверений, совместимым с OIDC, и вашей учетной записью AWS, а также создать краткосрочные учетные данные для вашего рабочего процесса Github для доступа к ресурсам AWS. Как только ваш рабочий процесс Github завершится, срок действия учетных данных истекает, и их нельзя использовать повторно.

Существует множество поставщиков удостоверений, совместимых с OIDC, таких как Google, Facebook или Amazon Cognito, но, поскольку мы уже используем GitHub Actions, мы будем использовать GitHub.

2a. Добавьте GitHub в качестве поставщика удостоверений в IAM.

Первый шаг — добавить GitHub в качестве поставщика федеративных удостоверений в IAM, чтобы создать доверие.

Перейдите на https://console.aws.amazon.com/iam/ и на панели навигации выберите Поставщики удостоверений, а затем выберите Добавить поставщика.

  • Для URL поставщика: используйте https://token.actions.githubusercontent.com.
  • Нажмите Получить отпечаток, чтобы проверить сертификат сервера нашего поставщика удостоверений, GitHub.
  • Для аудитории: используйте sts.amazonaws.com, так как мы используем официальное действие.

2b: Создайте роль IAM для нашего поставщика удостоверений.

Теперь вам нужно создать новую роль IAM для назначения нашему поставщику удостоверений. Это дает GitHub разрешение на доступ к ресурсам AWS в вашей учетной записи. Естественно, мы не хотим предоставлять всем разрешения GitHub, поэтому задайте область разрешений, определив условия. Условия в политике доверия вашей роли IAM могут быть установлены так, чтобы только указанный репозиторий, филиал или организация могли запрашивать токены у AWS.

  1. Вернитесь на https://console.aws.amazon.com/iam/ и нажмите Создать роль.
  2. Выберите Пользовательская политика доверия.
  3. Для элемента Principal используйте строку {“Federated”:providerArn} и замените providerArn на имя ресурса Amazon (ARN) поставщика удостоверений (GitHub), созданного выше.
  4. Для элемента Condition добавьте репозиторий или ветку вашего проекта Sagemaker в token.actions.githubusercontent.com:sub. Например, «репозиторий: GITHUB_ORG_OR_USER/GITHUB_REPO:*»

Используйте следующий JSON для политики доверия вашей роли IAM. Замените ARN поставщика удостоверений на «arn:aws:iam::7000000001:oidc-provider/token.actions.githubusercontent.com» и свой репозиторий Github на «repo:GITHUB_ORG_OR_USER/GITHUB_REPO:*».

{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Principal":{"Federated":"arn:aws:iam::7000000001:oidc-provider/token.actions.githubusercontent.com"},
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
               "StringEquals": {
                   "token.actions.githubusercontent.com:sub": "repo:GITHUB_ORG_OR_USER/GITHUB_REPO:*"
},
“StringLike”: {
                   "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
   }
              }
           }
       }
   ]
}

Использование предполагаемой роли без предоставления идентификатора ключа доступа aws или файла маркера веб-идентификации для pre встроенное действие, которое вы хотите использовать поставщиком OIDC.

5. После создания вашей роли прикрепите любую политику SageMaker, которую вы использовали для своей исполнительной роли. Политика, управляемая IAM, — AmazonSageMakerFullAccess.

2в. Добавьте разрешения в свой рабочий процесс GitHub

В yaml рабочего процесса Github установите разрешения на уровне рабочего процесса:

permissions:
  id-token: write # This is required for requesting the JWT
  contents: write  # This is required for actions/checkout

2д. Добавьте запрос токена доступа в рабочий процесс GitHub.

Действие aws-actions/configure-aws-credentials получает JWT от поставщика OIDC GitHub, а затем запрашивает токен доступа от AWS.

В разделе Jobs добавьте действие в yaml рабочего процесса и замените значения aws-region, role-to-assume и role-session-name своими собственными:

- name: Configure AWS Credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-region: us-east-1
        role-to-assume: arn:aws:iam::765936207681:role/github-iam-role
        role-session-name: OIDCsession

БУМ! AWS настроен!

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

# Create estimator
estimator = SKLearn(
    entry_point='train.py',
    role=role,
    sagemaker_session=sagemaker_session,
    instance_count=1,
    instance_type='ml.m5.large',
    framework_version='1.0-1',
    py_version='py3',
    source_dir='.',
    hyperparameters={'alpha': alpha, 'max_depth':max_depth, 'eta':eta, 'num_class':num_class, 'eval_metric':eval_metric}
)

train_sklearn = "sklearn-training-job-{}".format(int(time.time()))

estimator.fit(job_name=train_sklearn)

Из-за действия AWS в моем рабочем процессе файл python сможет отправить задание обучения в SageMaker.

Полезные ссылки

AWS: Создание и управление провайдером OIDC (консоль)

GitHub: Настройка OpenID Connect с AWS

AWS-Действия

Элиас: развертывание AWS с помощью Github Actions