AWS DOPの勉強をしていた時に、Code XXXXというサービスが複数出題範囲に含まれており、わくわくした覚えがあります。
今回はその中でもあまりピンと来ていなかったCode Artifactについて書いてみようと思います。
概要
CodeArtifactはアーティファクト管理ツールです。
自作のパッケージを管理したり、インターネット上のパッケージをCodeArtifact経由でダウンロードしたりすることができます。
概念
概念については以下のURLにまとまっています。
上記のページの抜粋ですが、リポジトリとドメインはCodeArtifactにおける核となる概念なので抜粋したものをかみ砕いて記載します。
・リポジトリ
読んで字のごとく、パッケージを管理するためのリポジトリのことです。
このリポジトリの中に各種パッケージが保存されます。
リポジトリ自体にイメージがわかない人は、パッケージが配置されているフォルダのようなものとイメージするとよいでしょう。
・ドメイン
単数ないし複数のリポジトリを管理するための単位です。
複数のリポジトリをグループ化することができ、各リポジトリに対して一貫したアクセスポリシーの管理が可能です。
ユースケース
以下のようなユースケースが考えられます。
・社内やPJ内といった限定されたコミュニティにおけるパッケージ配布
・インターネットアクセスができない環境でのパッケージダウンロード
・パッケージ更新をトリガーとしたCIの自動実行
検証
①インターネットアクセスができない環境からCodeArtifact経由でパッケージをダウンロードする
まずはインターネットにアクセスできない環境でCodeArtifactをプロキシとして使用し、パッケージがダウンロードできるかどうか検証します。
・リポジトリの作成
コンソールからリポジトリを作成します。
画面からリポジトリを選択し、任意のリポジトリ名を指定して作成します。

・ドメインの作成
リポジトリはドメインと紐づいている必要があります。
そのため、リポジトリを紐づけるドメインを作成します。任意のドメイン名を指定します。

・cloudshellの起動
コンソールからcloudshellを起動します。
検索画面右上のボタン(画像の赤く囲った部分)を押下するとターミナルが起動します。

インターネットアクセスができないことを確認したのち、CodeArtifactのリポジトリに接続します。
CodeArtifactへの接続方法はリポジトリの「接続手順の表示」から確認することができます(コマンドが表示されます)。

・パッケージがDLできることを確認
リポジトリに接続したうえで、pipコマンドを用いパッケージをダウンロードできることを確認します。
今回は試しにpandasを入れてみました。


②マルチアカウントでCodeArtifactを利用する
・ドメインポリシーの設定
別アカウントからアクセスできるように、ドメインポリシーを設定します。
ドメインポリシーのprincipalに別AWSアカウント番号を、actionにて以下の操作を許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[AWSアカウント]:root"
},
"Action": [
"codeartifact:GetRepositoryEndpoint",
"codeartifact:GetPackageVersionReadme",
"codeartifact:GetAuthorizationToken",
"codeartifact:ReadFromRepository"
],
"Resource": "*"
}
]
}

ドメインポリシーは「ドメイン」から「ドメインポリシーの編集」で設定できます。
・別アカウントでcloudshellを起動
別アカウントのコンソールからcloudshellを起動します。
インターネットアクセスができないことを確認したのち、CodeArtifactのリポジトリに接続します。
CodeArtifactへの接続方法はリポジトリの「接続手順の表示」から確認することができます(コマンドが表示されます)。
・パッケージがDLできることを確認
pip installを実行し、パッケージがDLできることを確認します。

③自作パッケージのアップロード
・パッケージ管理用リポジトリの作成
先の手順と同じ要領でリポジトリを作成します。

以下のようなディレクトリを作成します。
my_package/ ├── src/ │ └── my_package/ │ └── __init__.py ├── pyproject.toml ├── README.md
pyproject.tomlを以下の通り編集します。
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "my-package"
version = "0.1.0"
description = "My first Python package"
readme = "README.md"
requires-python = ">=3.7"
authors = [
{name = "Your Name", email = "your@email.com"}
]
license = {text = "MIT"}
dependencies = []
init.pyを以下の通り編集します。
def hello():
return "Hello from my_package!"
以下のコマンドを実行します。
pip install build python -m build
・アップロードと画面確認
パッケージをCodeArtifactのリポジトリにアップロードします。
先の手順と同じ要領で作成したリポジトリに接続します。
twineでパッケージをアップロードします。
pip install twine twine upload -r codeartifact dist/*
コンソール画面から自作パッケージがアップロードされたことが確認できます。

④パッケージ更新時の通知
EventBridgeと連携させることで、パッケージが更新されたことを起因に次のアクションを実行させることができます。
・EventBridgeとSNSの設定
SNSトピックを作成します。


{
"source": ["aws.codeartifact"],
"detail-type": ["CodeArtifact Package Version State Change"]
}
EventBridgeのルールのターゲットに先ほど作成したSNSトピックを指定します。

・自作パッケージを更新する
pyproject.tomlのバージョンを以下の通り編集します。
version = "0.1.1"
再度以下のコマンドを実行し、パッケージをアップロードします。
twine upload -r codeartifact dist/*
※重複ファイルが存在するというエラーが出る場合は、古いバージョンのパッケージファイルを削除してアップロードします。
コンソールからパッケージが更新されていることを確認します。

・DLできることを確認
別アカウントのCloudshellからCodeArtifactに接続し、自作パッケージをダウンロードします。

・通知が来ていることを確認
以下のようなメールが来ていました。パッケージ更新に伴うSNS通知ができているようです。
{"version":"0","id":"480eb532-f3a8-237a-9874-219df09d6d94","detail-type":"CodeArtifact Package Version State Change","source":"aws.codeartifact","account":"[アカウント番号],"time":"2025-07-07T07:25:06Z","region":"ap-northeast-1","resources":["arn:aws:codeartifact:ap-northeast-1:[アカウント番号]:package/test-artifact-domain/my_package_repo/pypi//my-package"],"detail":{"domainName":"test-artifact-domain","domainOwner":"[アカウント番号]","repositoryName":"my_package_repo","repositoryAdministrator":"[アカウント番号]","packageFormat":"pypi","packageNamespace":null,"packageName":"my-package","packageVersion":"0.1.1","packageVersionState":"Published","packageVersionRevision":"wJSOlLMENi83tAeBD8na6H220KfxFulKtwfEvNt1/Js=","changes":{"assetsAdded":1,"assetsRemoved":0,"metadataUpdated":true,"assetsUpdated":0,"statusChanged":true},"operationType":"Created","sequenceNumber":3,"eventDeduplicationId":"FzO99LG3qdDqmc8vg6MFTU5YA/ZXvxV5SLjJIzi/GtA="}}
今回は実施しませんでしたがSNS通知だけでなく、CIに組み込むことも可能です。
パッケージの更新に伴いデプロイが失敗するケースなどを、早めに検知できる仕組みが構築できそうです。
課金
CodeArtifactの料金は以下の通りまとまっています。
ストレージ、リクエスト数、データ転送に対して課金が発生します。
また、ストレージ2GBおよび100000リクエストが無料枠として設けられています。
試しに10GBのストレージ、100000リクエスト、インターネットへのデータ転送10GBで試算したところ
月の請求は2.34USDと出ました。

まとめ
実際に触ってみるまでイメージがついていなかったサービスですが、プライベート環境でパッケージのダウンロードだけ許可したい場合やPJ内部でパッケージを配布したい場合など、特定の要件が存在する場合に使い勝手が良いサービスだと思いました。
今回は試しませんでしたが、パッケージの更新が発生した際にそれをトリガーとしてCIを実行できることも非常に便利だと感じました。




