SageMakerとGitHubのプライベートリポジトリを連携させる

AI.RL.LYsのcursheyです。
今回はAmazon SageMakerとGitHubのプライベートリポジトリのGit連携をさせるのに詰まってしまったので、その時の手順を備忘録として記事にしたいと思います。大まかな手順は、

1. GitHubの個人用アクセストークンの作成
2. SageMakerのGitリポジトリの作成
3. SageMakerのノートブックインスタンスの作成

となります。

# GitHubの個人用アクセストークンの作成
　GitHubのプライベートリポジトリをユーザ名とパスワードを入力する必要がありますが、このパスワードは個人用アクセストークンを入力するのがベストプラクティスとして推奨されています。なので、まずはこれを作ります。なお、１年以上使われていないトークンは自動的に削除されますので注意してください。

1. GitHubの個人アカウントにログインします。

2. 右上の隅にあるプロフィールアイコンをクリックし、メニューから「Settings」をクリックします。
![github_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/f05597e9-4008-284b-5886-20a343faac69.png)

3. 左側のサイドバーから「Developer settings」をクリックします。
![github_developer_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/63f5b263-29ea-7d51-fa0e-de5cad258626.png)

4. 左側のサイドバーから「Personal access tokens」をクリックします。
![github_personal_access_token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/68d0a4f3-faa8-7357-dabe-d87228477a0b.png)

5. 「Generate new token」をクリックします。
![github_generate_new_token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/f282aa62-d1b8-a895-2ea6-aea0d96468d4.png)

6. トークンに命名をします。

7. トークンに付与する権限を選択します。特に、**コマンドラインからリポジトリにアクセスする場合は「repo」を選択します**。
![github_token_scope.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/b7326890-c25e-9b4b-2d0b-e2ed5337e958.png)

8. 「Generate token」をクリックしてトークンを作成します。
![github_generate_token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/227dbaa9-b31d-1446-d2cc-8da17129a861.png)

9. トークンが作成されます。この時、**別ページに移動すると、このトークンを再確認することはできないので、必ず控えておきます**。

10. 作成したトークンの「Enable SSO」をクリックし、「Authorize」をクリックします。

    10-1. トークンをアップデートした時も、「Disable SSO」をクリックし、「Authorize」をクリックする必要があります。

# Gitリポジトリの作成

　ここではAmazon SageMakerコンソールに入り、Gitリポジトリを作成します。Gitリポジトリは必ずしも必要ではなく、Jupyter上のターミナルからsshキーを作成し、公開鍵をリポジトリのdeploy keyに登録することでもgit連携をすることができます。しかし、ノートブックインスタンスを落とすたびにこの操作をやり直す必要があります。また、アクセストークンは操作のスコープを決定でき、SageMakerからは実行したくない操作を制限できますのでこちらの方がおすすめです。

1. AWS環境にログインし、SageMakerのコンソールを開きます。

2. 左側のサイドバーから「Git リポジトリ」をクリックします。
![sagemaker_git_repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/1e511e23-5d32-f59f-51e8-2b76e22e4019.png)

3. 「リポジトリの追加」をクリックします。
![sagemaker_add_repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/5921b366-9b26-7409-5f12-052e4843de6c.png)

4. 「GitHub または他の Git ベースのリポジトリ」を選択します。
![sagemaker_select_repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/9babccb8-da58-79a9-f2e6-9489dfba01b0.png)

5. 「Amazon SageMaker リポジトリ名」を命名します。この命名はGitHubに作成しているリポジトリ名と一致させる必要はありませんが、アカウントおよびAWSリージョン内で一意にする必要があります。

6. 「Git リポジトリの URL」に連携させるリポジトリのURLを入力します。このとき、URLに**.git**は付けないようにしてください。

7. Git 認証情報を選択します。「シークレットがありません」を選択した場合、プライベートリポジトリと連携ができないので選択しないようにしてください。

    7a. 「既存のシークレットの使用」を選択した場合

        7a-1.「シークレットの検索」から使用するシークレットを探して選択します。

    7b. 「シークレットの作成」を選択した場合

        7b-1. 「シークレット名」を命名し、GitHubのユーザー名を「ユーザー名」、作成した個人用アクセストークンを「パスワード」にそれぞれ入力します。
![make_secret.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/4358b0be-74da-35bd-3c93-3f15843fe9f8.png)

        7b-2. 「シークレットの作成」をクリックします。

8. 「リポジトリの追加」をクリックし、Git リポジトリを作成します。
![sagemaker_make_repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/33354a3b-5182-d130-d1b7-38f456300c12.png)

# SageMakerの設定

 ここでのGit連携に必要な操作はGitリポジトリを選択することだけですが、IAMロールの設定は必要に応じて設定するようにしてください。また、ネットワークは一度設定してしまうと後から変更できなくなりますので、制限がある場合は確認してから設定するようにしてください。

1. AWS環境にログインし、SageMakerのコンソールを開きます。

2. 左側のサイドバーから「ノートブックインスタンス」をクリックします。
![sagemaker_notebook_instance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/3007d244-9f18-2163-ba22-bc7fec5507a0.png)

3. 「ノートブックインスタンスの作成」をクリックします。
![sagemaker_make_notebook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/3d12cf05-ced1-fd4d-c512-e46980d4ce5a.png)

4. 「ノートブックインスタンス名」を命名し、任意の「ノートブックインスタンスのタイプ」を選択します。
![sagemaker_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287466/a470982a-8886-1ea0-fe48-ad889e79d08a.png)

5. 「アクセス許可と暗号化」は必要に応じて設定します。

6. 「Git リポジトリ」で上記で作成したGitリポジトリを選択します。

7. 「ノートブックインスタンスの作成」をクリックし、作成されます。

一連の手順が終わりましたらノートブックインスタンスの管理画面に戻ります。作成したノートブックインスタンスのステータスが「InService」になりましたら起動できますので、Jupyterを開いてgit連携ができているか確認しましょう。

# 参考
- https://help.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line
- https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/nbi-git-repo.html