AWS CodeArtifactを使ってみた|使い方・検証・費用まとめ

AWS DOPの勉強をしていた時に、Code XXXXというサービスが複数出題範囲に含まれており、わくわくした覚えがあります。

今回はその中でもあまりピンと来ていなかったCode Artifactについて書いてみようと思います。

概要

CodeArtifactはアーティファクト管理ツールです。
自作のパッケージを管理したり、インターネット上のパッケージをCodeArtifact経由でダウンロードしたりすることができます。

概念

概念については以下のURLにまとまっています。

docs.aws.amazon.com

上記のページの抜粋ですが、リポジトリドメインはCodeArtifactにおける核となる概念なので抜粋したものをかみ砕いて記載します。

リポジトリ
読んで字のごとく、パッケージを管理するためのリポジトリのことです。
このリポジトリの中に各種パッケージが保存されます。
リポジトリ自体にイメージがわかない人は、パッケージが配置されているフォルダのようなものとイメージするとよいでしょう。

ドメイン
単数ないし複数のリポジトリを管理するための単位です。
複数のリポジトリをグループ化することができ、各リポジトリに対して一貫したアクセスポリシーの管理が可能です。

ユースケース

以下のようなユースケースが考えられます。

・社内やPJ内といった限定されたコミュニティにおけるパッケージ配布

・インターネットアクセスができない環境でのパッケージダウンロード

・パッケージ更新をトリガーとしたCIの自動実行

検証

①インターネットアクセスができない環境からCodeArtifact経由でパッケージをダウンロードする

まずはインターネットにアクセスできない環境でCodeArtifactをプロキシとして使用し、パッケージがダウンロードできるかどうか検証します。

リポジトリの作成
コンソールからリポジトリを作成します。
画面からリポジトリを選択し、任意のリポジトリ名を指定して作成します。

リポジトリの作成

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

ドメインの作成
AWSアカウント番号は塗りつぶしています。

・cloudshellの起動

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

cloudshell

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

接続手順

・パッケージがDLできることを確認

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

pip install
CodeArtifactのリポジトリを確認するとパッケージがストアされていることが分かります。
パッケージ

②マルチアカウントで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": "*"
        }
    ]
}

ドメインポリシー
AWSアカウント番号は塗りつぶしています。
ドメインポリシーは「ドメイン」から「ドメインポリシーの編集」で設定できます。

・別アカウントでcloudshellを起動

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

・パッケージがDLできることを確認

pip installを実行し、パッケージがDLできることを確認します。

pip install
同プロジェクトでチームごとに別々のAWSアカウントを利用しているといった場合でも、パッケージの管理を一つのリポジトリで行うことができます。

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

自作パッケージ用リポジトリ
・パッケージの作成
以下のようなディレクトリを作成します。

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/*

コンソール画面から自作パッケージがアップロードされたことが確認できます。

my_package

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

SNSトピック
サブスクリプションは自分のメールアドレスに設定します。
サブスクリプション
以下のEventBridgeルールを作成します。

{
  "source": ["aws.codeartifact"],
  "detail-type": ["CodeArtifact Package Version State Change"]
}

EventBridgeのルールのターゲットに先ほど作成したSNSトピックを指定します。

ターゲット

・自作パッケージを更新する

pyproject.tomlのバージョンを以下の通り編集します。

version = "0.1.1"

再度以下のコマンドを実行し、パッケージをアップロードします。

twine upload -r codeartifact dist/*

※重複ファイルが存在するというエラーが出る場合は、古いバージョンのパッケージファイルを削除してアップロードします。

コンソールからパッケージが更新されていることを確認します。

更新後リポジトリ
バージョンが0.1.1に代わっているので、パッケージが更新されたと分かります。

・DLできることを確認

別アカウントのCloudshellからCodeArtifactに接続し、自作パッケージをダウンロードします。

パッケージダウンロード
0.1.1のパッケージがダウンロードできたことが分かります。

・通知が来ていることを確認
以下のようなメールが来ていました。パッケージ更新に伴う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リクエストが無料枠として設けられています。

aws.amazon.com

試しに10GBのストレージ、100000リクエスト、インターネットへのデータ転送10GBで試算したところ 月の請求は2.34USDと出ました。

月次請求
用途は限られますが、パッケージ配布のためのサーバを構築する、packageダウンロードのためにNatGatewayを立てるといったアプローチと比較した場合、大幅にコストを抑えることができそうです。

まとめ

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