GitHub PackagesからAWS CodeArtifactへ移行した理由とその効果

実務プロジェクトで、複数のプロジェクトで共通して使用する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をビルド環境とする場合、認証やセキュリティ要件の課題が発生する。この記事では、以下の解決策を採用した。

  1. パッケージ管理をGitHub PackagesからAWS CodeArtifactに移行
    CodeArtifactはAWS IAMを利用した認証が可能で、固定トークンを使用せずにセキュアな環境を実現する。GitHub Actionsでライブラリをビルドし、自動的にCodeArtifactにプッシュする仕組みを構築した。
  2. CodeBuildでnpm install時にCodeArtifactを参照
    buildspec.ymlのpre_buildセクションでCodeArtifactに認証するスクリプトを追加し、npm install時に必要な認証情報を設定した。

これらの手法により、セキュリティ要件を満たしながら、AWS CodeArtifactを利用した効率的なパッケージ管理を実現した。同様の課題を抱えている場合、この方法を参考に適切な構成を検討してほしい。

関連記事

コメント

この記事へのトラックバックはありません。