実務プロジェクトで、複数のプロジェクトで共通して使用するUIライブラリを開発した。その過程で、GitHubを使ったソース管理とAWS CodeBuildによるビルド環境の組み合わせにおいて、npm install時に発生する認証エラーという課題に直面した。固定トークンを利用した認証が企業のセキュリティ要件を満たさず、従来のGitHub Packagesによる管理が不可能となったため、AWS CodeArtifactへの移行を決断した。この記事では、課題を解決するために採用した構成や手法を解説する。同様の状況に悩む方にとって参考になる内容だ。
発生した問題
ソース管理はGitHub、ビルドはAWS CodeBuild
私の場合、ライブラリを使用する側のプロジェクトは、以下のようなビルド構成になっていた。共通パッケージに関しては、GitHub Actionsでビルドし、GitHub Packagesに公開する手法を採用していた。

ここで発生した問題が、AWS CodeBuildで共通パッケージをnpm installする際に、GitHub Packagesの認証エラーが発生してしまうということだ。その理由として、Privateリポジトリでの開発 + GitHub Packagesで管理しているパッケージをnpm installする場合、GitHubの認証が必要になるからだ。
PAT(パーソナルアクセストークン)は使用できない
個人開発や、ローカル環境での開発であれば、.npmrcファイルにパーソナルアクセストークンをセットすればnpm installは可能だが、ビルド環境で固定のトークンを使用するのはセキュリティリスクが高い。企業のセキュリティ要件にも引っかかる。そのため、個別のアクセストークンを使用する案は採用できなかった。
解決へのアプローチ
結論、以下のような構成にすることでビルドの問題を解決した。
- パッケージの管理をGitHub PackagesからAWS CodeArtifactへ移行
- CodeBuildでパッケージをnpm installする際に、CodeArtifactを参照するようにbuildspecを修正

共通パッケージの管理をGitHub PackagesからAWS CodeArtifactへ移行
GitHub Packagesへの認証で個別のトークンを使えないので、別サービスで管理できないかを検討していたところ「AWS CodeArtifact」が適任であると判断した。GitHub Actionsでライブラリをビルドし、AWS CodeArtifactにPushするワークフローの実装が必要になるが、以下の記事で解説しているので参照してほしい。
GitHub Actions→AWS CodeArtifactへPushする手順【OIDCを使用】
CodeBuildでパッケージをnpm installする際に、CodeArtifactを参照するようにbuildspecを修正
共通パッケージを利用する側のbuildspec.yml > pre_buildに以下のスクリプトを追加する。
※<>で囲っている変数は、プロジェクトの設定に書き換える必要がある
phases:
  pre_build:
    commands:
      # CodeArtifact にログインして npm の認証情報を設定
      - echo "Logging in to CodeArtifact"
      - export CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token \
          --domain <DOMAIN_NAME> \
          --domain-owner <AWS_ACCOUNT_ID> \
          --query authorizationToken \
          --output text)
      - echo "//<DOMAIN_NAME>-<AWS_ACCOUNT_ID>.d.codeartifact.<AWS_REGION>.amazonaws.com/npm/<REPOSITORY_NAME>/:_authToken=$CODEARTIFACT_AUTH_TOKEN" > ~/.npmrc
      - echo "@<ORG_NAME>:registry=https://<DOMAIN_NAME>-<AWS_ACCOUNT_ID>.d.codeartifact.<AWS_REGION>.amazonaws.com/npm/<REPOSITORY_NAME>/" >> ~/.npmrc
      - echo "CodeArtifact authentication completed."
  build:
    commands:
      # npm install の実行
      - echo "Installing dependencies"
      - npm install参考ドキュメント:
https://docs.aws.amazon.com/ja_jp/codeartifact/latest/ug/npm-auth.html
上記の設定をすることで、CodeBuild で共通パッケージを npm install する際に、 CodeArtifact を利用する設定が完了する。
まとめ
共通UIライブラリの開発と管理は、複数のプロジェクトで効率的にコードを再利用するために不可欠だ。しかし、GitHubをソース管理に使用し、AWS CodeBuildをビルド環境とする場合、認証やセキュリティ要件の課題が発生する。この記事では、以下の解決策を採用した。
- パッケージ管理をGitHub PackagesからAWS CodeArtifactに移行
 CodeArtifactはAWS IAMを利用した認証が可能で、固定トークンを使用せずにセキュアな環境を実現する。GitHub Actionsでライブラリをビルドし、自動的にCodeArtifactにプッシュする仕組みを構築した。
- CodeBuildでnpm install時にCodeArtifactを参照
 buildspec.ymlのpre_buildセクションでCodeArtifactに認証するスクリプトを追加し、npm install時に必要な認証情報を設定した。
これらの手法により、セキュリティ要件を満たしながら、AWS CodeArtifactを利用した効率的なパッケージ管理を実現した。同様の課題を抱えている場合、この方法を参考に適切な構成を検討してほしい。
 
         
        




コメント