AWS CodeArtifactにPythonパッケージを登録して、実際に使ってみた

この記事は ハンズラボ Advent Calendar 2022 23日目の記事です。
Qiita初投稿となります。よろしくお願いいたします。

# CodeArtifactについて

Node.jsのパッケージであればnpm、PythonのパッケージであればPyPIが有名なパッケージリポジトリとしてありますが、CodeArtifactはAWSがフルマネージドで提供する、プライベートリポジトリサービスになります。

# CodeArtifactにパッケージを登録して、使ってみよう！

### 1. CodeArtifactにドメインとレポジトリを作成する
マネジメントコンソール上からドメインとリポジトリを作成します。
ドメインはリポジトリを要素として持つ集合なので、ドメインの作成を先に行ってからリポジトリの作成を行います。

ドメイン名をsample-domainとして作成します。
![スクリーンショット 2022-12-19 18.26.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398443/f31398ba-193e-254d-a692-a88585938bc4.png)

リポジトリ名をsample-repositoryとして作成します。
登録するパッケージにPyPIを経由して取得する外部パッケージがある場合、パブリックアップストリームリポジトリの選択をすることにより公式パッケージの取得時間の短縮（CodeArtifactにキャッシュされる）などが期待できます。
今回パブリックアップストリームリポジトリの選択はスキップします。
![スクリーンショット 2022-12-19 18.26.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398443/739daa6b-b65f-6a27-b4c4-a7b8d27e9ad0.png)

### 2. パッケージ化したいコードを用意する

Pythonのパッケージ作成方法については以下の記事を参考に作成していきました。
[Packaging Python Projects — Python Packaging User Guide](https://packaging.python.org/en/latest/tutorials/packaging-projects/)

ディレクトリ構成は上記ドキュメントと同じ構成にしています。
```
sample_python_package/
├── LICENSE
├── pyproject.toml
├── README.md
├── src/
│   └── sample_package/
│       ├── __init__.py
│       └── sample.py
└── tests/
```

```python:sample.py
def add_one(number):
    return number + 1
```
パッケージのビルドをすると、プロジェクトルートにdistディレクトリが追加されます。
これで配布用パッケージの作成は完了です。
```
dist/
├── sample_package-0.0.1-py3-none-any.whl
└── sample_package-0.0.1.tar.gz
```

### 3. パッケージ登録先のリポジトリを設定する

aws cliを使用して、CodeArtifactのリポジトリ設定（認証情報等）を`~/.pypirc`に設定していきます。
マネジメントコンソール上からCodeArtifactのリポジトリ（今回はsample-repository）を選択し、「接続手順の表示」を押下します。
今回はtwineクライアントを使用して設定していきますので、パッケージマネージャークライアントは「twine」を選択します。

![スクリーンショット 2022-12-20 12.38.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398443/e5c29aad-0818-f3e7-fe40-9cd45fc35457.png)

推奨設定に表示されるaws cliのコマンドをコピーし、ホストマシン上でコマンドを実行します。
このコマンドを実行することにより、`~/.pypirc`にリポジトリの情報が書き込まれます。
```zsh:コマンド例（CodeArtifactのドキュメントより）
% aws codeartifact login --tool twine --domain my_domain --domain-owner 111122223333 --repository my_repo
```
以下のメッセージが表示されれば、リポジトリの設定は完了になります。
`aws codeartifact login`で作成されるトークンは12時間有効になっています。
```
Successfully configured twine to use AWS CodeArtifact repository https://~
```

### 4. パッケージをCodeArtifact上のリポジトリに登録する
先ほど作成したPythonパッケージをCodeArtifact上のリポジトリに登録します。
dist以下に作成されたパッケージのパスを指定し、リポジトリのオプションは`codeartifact`を指定します。
```zsh
% twine upload --repository codeartifact dist/*
```
実行後、パッケージのアップロードが完了したことを確認します。
```
Uploading distributions to https://~
Uploading sample_package-0.0.1.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB • 00:00 • 15.6 MB/s
```

### 5. CodeArtifactのリポジトリに登録したパッケージを使ってみよう！

pipを使ってパッケージをインストールするため、pip.confにリポジトリの情報を書き込みます。
Step 3の流れと同様に「接続手順の表示」を押下し、「pip」を選択します。

推奨設定に表示されるaws cliのコマンドをコピーし、ホストマシン上でコマンドを実行します。
```zsh:コマンド例（CodeArtifactのドキュメントより）
aws codeartifact login --tool pip --domain my_domain --domain-owner 111122223333 --repository my_repo
```
以下のメッセージが表示されれば、設定は完了になります。リポジトリ登録時と同様で、トークンは12時間有効となります。
```
Successfully configured pip to use AWS CodeArtifact repository https://~
```
別のプロジェクトへ移動し、pipでパッケージのインストールを行います。パッケージ名はsample-packageなので、以下のように入力し、実行します。
```
pip install sample-package
```
実際にadd_oneメソッドを呼んでみます。
```
>>> from sample_package import sample
>>> sample.add_one(2)
3
```
パッケージ内のメソッドを呼び出すことができました！


# 実際のユースケースを考える

他のプロジェクトでも利用できる処理をまとめておくことにより、何か共通部分に変更があった場合はパッケージをアップデートすることでパッケージを利用しているプロジェクトに効率良く変更を配布することが可能になります。
また、メンテナンスするコード量も減らすこともできるので、パッケージ化することの大きなメリットは「コードのメンテナンス性向上」だと考えています。


# まとめ

AWSが公開しているドキュメントに手順が細かく書かれていることもあり、パッケージの作成から使用までスムーズに進めることができました。
今回CodeArtifactのリポジトリに登録したのはPythonパッケージでしたが、Node.jsパッケージについても同じようにパッケージ登録することが可能なので、こちらも別でやってみようと思います。
最後まで読んでくださり、ありがとうございました！

# 参考

- [CodeArtifact - AWS Developer Tools](https://docs.aws.amazon.com/codeartifact/latest/ug/welcome.html)
- [Packaging Python Projects — Python Packaging User Guide](https://packaging.python.org/en/latest/tutorials/packaging-projects/)