1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS CodeArtifactを設定してnpm installするとなぜ通信がCodeArtifact経由になるの?

Last updated at Posted at 2023-08-30

前提:CodeArtifactはnpmだけでなくmavenやgradleやpipなどにも使えますが、npmに絞って検証しています

業務でnpm installをCodeArtifact経由で行っているのですが、
何を設定したらそうなる?というのが疑問だったので調べてみました。
というかCodeArtifact自体よく分かってなかったので、そこも整理しておきます。

なぜCodeArtifactを使う?

CodeArtifact は maven や npm などの対応するパッケージマネージャーの Proxy として利用できます。
管理者はパッケージへのアクセス制御が可能となり、組織内で使用が承認されている
最新のパッケージのみを開発者に提供できるようになります。
また組織のポリシーによっては自由に公開リポジトリにアクセスできない場合もあります。
VPC Endpoint 利用することでインターネットを経由せずに、CodeArtifact にキャッシュされた
パッケージにアクセスできます。またダウンロード時間の短縮も期待できます。

引用元:https://qiita.com/hayao_k/items/d55576a2920cb859901c

公式読んでも腑に落ちないところあったのですが、上記記事の説明が非常にわかりやすかったです。

  • パッケージマネージャーのproxyとしての役割を持つ
  • 組織内で使用するパッケージやバージョンの管理が可能
  • パッケージダウンロード時のネットワークをprivateに閉じることが可能
  • (上記引用文には書かれていませんが)独自パッケージのprivate管理が可能

といったところが使用する理由ですね。
自身のケースで言うとCloud9で開発していて外部アクセス不可の環境でしたのでCodeArtifactを使用しているのだと解釈しました。

また、CodeArtifactの重要な概念として「ドメイン」と「リポジトリ(アップストリーム/ダウンストリーム)」がありますが、本題じゃないのであまり深掘りせずさらっと確認だけしておきました。

本題の「AWS CodeArtifactを設定してnpm installするとなぜCodeArtifact経由になる?」を検証して確認してみます!

実際にCodeArtifactを設定してnpmアクセス

CodeArtifact設定前のnpm接続先確認

まずnpm installしたときのinstall元の設定はどこに書かれているのかわからなかったので調べました。
npm config ls- l で確認可能なようです。

% npm config ls -l|grep "registry"                   
metrics-registry = "https://registry.npmjs.com/" 
omit-lockfile-registry-resolved = false 
registry = "https://registry.npmjs.org/"
replace-registry-host = "npmjs" 

registry = "https://registry.npmjs.org/" <- この項目で指定しているようです。

CodeArtifact設定

IAMユーザ作ってAWS CLI設定までは終わっている前提で、、
AWS公式の手順に沿ってやってみました。

# ドメイン作成
aws codeartifact create-domain --domain my-npm
# リポジトリ作成
aws codeartifact create-repository --domain my-npm --domain-owner 111122223333 --repository my-npm-repo
# my-npm-repoのアップストリームリポジトリ作成
aws codeartifact create-repository --domain my-npm --domain-owner 111122223333 --repository npm-store
# リポジトリの外部接続設定
aws codeartifact associate-external-connection --domain my-npm --domain-owner 111122223333 --repository npm-store --external-connection "public:npmjs"
# my-npm-repoとnpm-storeの紐付け
aws codeartifact update-repository --repository my-npm-repo --domain my-npm --domain-owner 111122223333 --upstreams repositoryName=npm-store
# CodeArtifactログイン
aws codeartifact login --tool npm --repository my-npm-repo --domain my-npm --domain-owner 111122223333

上記コマンド1つずつ打ちながらnpmのconfig設定を確認していったところ、
aws codeartifact loginで変化が!

% npm config ls -l|grep "registry"                                                                      
metrics-registry = "https://my-npm-111122223333.d.codeartifact.ap-northeast-1.amazonaws.com/npm/my-npm-repo/" 
omit-lockfile-registry-resolved = false 
; registry = "https://registry.npmjs.org/" ; overridden by user
replace-registry-host = "npmjs" 
registry = "https://my-npm-111122223333.d.codeartifact.ap-northeast-1.amazonaws.com/npm/my-npm-repo/"

; registry = "https://registry.npmjs.org/" ; overridden by userとなっていて、registrymetrics-registryがcodertifactになっていることを確認できました。

タイミングとしてはまぁそうだろうなという感じですが、実際に検証することでより納得感を得ることができたと思います。

npm config設定を以下コマンドで戻して、CodeArtifact掃除して終わり。

npm config set registry https://registry.npmjs.com/

不明点

CodeArtifactを使用するメリットに「組織内で使用するパッケージやバージョンの管理が可能」ということは言えると思うのですが、開発者がinstallできるパッケージやバージョンを制限することも可能なのかがわからないです。
(package.jsonにパッケージ追加したりバージョン書き換えたりしてのnpm install を制御できたりするのか?という意味)
制御するなら「パッケージオリジンコントロール設定」あたりの機能になるかと思うのですが、
こちらは改めて調査して検証してみたいと思います。

参考

CodeArtifactユーザーガイド
https://docs.aws.amazon.com/codeartifact/latest/ug/welcome.html
AWS CodeArtifact でプライベートリポジトリを作ろう
https://qiita.com/hayao_k/items/d55576a2920cb859901c
proxy環境下でのnpm config設定
https://qiita.com/tenten0213/items/7ca15ce8b54acc3b5719

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?