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

前提：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` で確認可能なようです。
```shell
% 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公式](https://docs.aws.amazon.com/ja_jp/codeartifact/latest/ug/npm-auth.html)の手順に沿ってやってみました。


```shell
# ドメイン作成
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
```

上記コマンド１つずつ打ちながらnpmのconfig設定を確認していったところ、
`aws codeartifact login`で変化が！
```shell
% 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`となっていて、`registry`と`metrics-registry`がcodertifactになっていることを確認できました。

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

npm config設定を以下コマンドで戻して、CodeArtifact掃除して終わり。
```
npm config set registry https://registry.npmjs.com/
```


# 不明点
CodeArtifactを使用するメリットに「組織内で使用するパッケージやバージョンの管理が可能」ということは言えると思うのですが、開発者がinstallできるパッケージやバージョンを制限することも可能なのかがわからないです。
（package.jsonにパッケージ追加したりバージョン書き換えたりしてのnpm install を制御できたりするのか？という意味）
制御するなら「[パッケージオリジンコントロール設定](https://docs.aws.amazon.com/ja_jp/codeartifact/latest/ug/package-origin-controls.html)」あたりの機能になるかと思うのですが、
こちらは改めて調査して検証してみたいと思います。

# 参考
**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