実務プロジェクトで、複数のプロジェクトで共通して使用する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を利用した効率的なパッケージ管理を実現した。同様の課題を抱えている場合、この方法を参考に適切な構成を検討してほしい。
コメント