Amazon SageMakerのユーザープロファイルレベルのライフサイクル設定でpipをAWS CodeArtifactリポジトリ経由にする
データ事業本部の鈴木です。
Amazon SageMaker StudioにPythonライブラリを追加するケースで、閉域環境などの都合でAWS CodeArtifactのパブリックアップストリームリポジトリ経由でpip installしたいことがあると思います。
今回はJupyterLabスペース向けのライフサイクル設定を使って、StudioのユーザーからはJupyterLab起動時に自然にpipがCodeArtifactのパブリックアップストリームリポジトリに接続されたリポジトリ経由で行われるように見える設定をご紹介します。
CodeArtifact経由のpip installの設定
以前CodeArtifactを経由してpipするための記事を紹介しました。
CodeArtifactにPyPIからライブラリをインストールできるよう、パブリックアップストリームリポジトリに接続されたリポジトリを作成しておくのでした。
このとき、クライアント側ではCodeArtifactへの十分な権限をつけた上で、aws codeartifact loginコマンドを実行し、ログイン情報などをローカルに残しておく必要があります。
pipの場合は、オプションで--tool pipと指定することで、~/.config/pip/pip.confにログイン情報を保存することができます。(この点は補足でご紹介する内容のポイントです)
SageMakerのライフサイクル設定について
SageMaker Studio管理者およびユーザーは、ライフサイクル設定(LCC)を作成およびアタッチすることで、SageMaker Studioのドメインやユーザープロファイル単位で各種アプリケーション起動時にスクリプトを実行することができます。
以前の画面になりますが、以下のブログ記事も参考になります。
今回はこの仕組みを使い、JupyterLab起動時に自動でaws codeartifact loginコマンドを実行することで、Studioのユーザーからは自然にpipがCodeArtifactのパブリックアップストリームリポジトリに接続されたリポジトリ経由で行われるようにします。
やってみる
1. CodeArtifactのリソース作成
以前のブログと同様に、pypi-storeリポジトリとsample-domainドメインを作成しておきました。

pypi-storeリポジトリより、ログイン用のコマンドをコピーしました。

2. ライフサイクル設定の作成
SageMaker AIのコンソールより、管理者設定 > ライフサイクル設定と開きました。

今回はJupyterLabスペースに設定したかったので、JupyterLabのタブから、設定の作成を押しました。
ちなみに画面からはCode Editor用にも設定できることが伺えます。
ライフサイクル設定の作成画面で、スクリプトに先ほどコピーしたログイン用のコマンドを貼り付けて設定を作成しました。

3. SageMakerドメインへのアタッチ(ユーザープロファイル向け)
続いて、作成したライフサイクル設定をユーザープロファイルにアタッチしました。
画面を確認すると分かりますが、管理者からは以下の2つの粒度でライフサイクル設定アタッチすることができます。
- ドメイン
 - ユーザープロファイル
 
見たいものとしてはあまり変わらないだろうということで、今回はユーザープロファイルにアタッチしました。
以降、紹介したい手順が少し長くなるため、さらに細かくセクションを分けて記載します。
i. ドメインの作成
まず、SageMakerドメインをクイックセットアップで新規作成しました。(あくまで検証のためで、既存のドメインがある方はそれを使って頂いて良いと思います。)

ii. ユーザープロファイルへのLCCのアタッチ
作成されているユーザープロファイルを開き、ユーザーの詳細タブからユーザーにアタッチされたライフサイクル設定を見つけます。

アタッチを押して、先ほど作成したライフサイクル設定をアタッチしました。

ユーザーにアタッチされたライフサイクル設定にライフサイクル設定がアタッチされたことを確認しました。

この状態で、SageMaker Studioからライフサイクル設定が使えますが、デフォルトで実行とビルトインとして実行の設定を行うこともできます。
デフォルトで実行は管理者向けの設定、ビルトインとして実行はユーザー向けの設定で、実行される順序がデフォルトで実行の方が後となり※、そのライフサイクル設定で設定した内容で最終的に上書きされるという仕組みのようです。
※AWS CLIのドキュメントから確認しました。
以下ドキュメントより2025/3/26に引用
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sagemaker/create-user-profile.htmlBuiltInLifecycleConfigArn -> (string)
The lifecycle configuration that runs before the default lifecycle configuration. It can override changes made in the default lifecycle configuration.
今回はデフォルトで実行をYesにしたという前提で話を進めます。(設定は同画面より簡単にできます。)
iii. SageMaker実行ロールへの権限追加
今回はJupyterLabスペースのJupyterLabからCodeArtifactのAPIを実行したいため、必要な権限をSageMaker実行ロールへ追加しました。
コンソールから実行ロールを確認し、AWSCodeArtifactReadOnlyAccessをアタッチしました。

4. JupyterLabでの動作確認
SageMaker Studioを起動し、プライベートスペースを作成しました。(今回は新しくドメインを作ったため)

Run spaceを押してJupyterLabサーバーを起動しました。

ここで1点大事なこととして、上記画面のLifecycle ConfigurationよりドメインやユーザープロファイルにアタッチしたLCCが選択できます。
今回は、この記事で実行したいLCCをデフォルトとして設定した前提のため、ここはNo Scriptでも後のCodeArtifactへのログインが実行されます。
デフォルトではない場合は、実行したいLCCを選択の上、スペースを起動すると良いと思います。
後はJupyterLabのノートブックなどからpip installを実行すると、確かにCodeArtifact経由でインストールされることが確認できました。

補足
普通のインターネット経由に戻したいときの操作
今回の想定だとあまりないパターンですが、普通のインターネット経由に戻したいときの操作について気になったのでご紹介します。
単純に考えるとLCCをドメインやユーザープロファイルからデタッチすれば元に戻るように思いますが、さらに追加の作業が必要になります。
以下の質問にあるように、CodeArtifact経由でpip installを実行していた環境で、普通のインターネット経由でのpip installをしたい場合、aws codeartifact loginコマンドを実行した後に作成された~/.config/pip/pip.confを削除する必要があります。
JupyterLab環境ではライフサイクル設定で作成した~/.config/pip/pip.confが残ってしまうため、このファイルを削除しない限りはCodeArtifactにアクセスしてしまいます。
運用の変更などでこのような切り替えがあった際には思い出して頂けると幸いです。
最後に
今回はJupyterLab向けのライフサイクル設定を使って、StudioのユーザーからはJupyterLab起動時に自然にpipがCodeArtifactのパブリックアップストリームリポジトリに接続されたリポジトリ経由で行われるように見える設定をご紹介しました。







