実務のプロジェクトでUIライブラリを開発し、その成果物をGitHub Actionsでビルドし、CodeArtifactにPushするワークフローを構築した。その忘備録として記載する。
必要な手順
GitHub ActionsからAWS CodeArtifactへPushするためには、以下のステップが必要になる。
- AWS CodeArtifactのリポジトリを作成する
- OIDC (OpenID Connect)に必要なAWSロールを作成し、ポリシーをアタッチする
- ワークフローを実装する
AWS CodeArtifactのリポジトリを作成する
こちらの手順を実行することで、ワークフローに以下の値をセットできる(ワークフローは次のセクションで解説)。
DOMAIN: ${AWS CodeArtifactのドメイン名}
DOMAIN_OWNER: ${AWS CodeArtifactのドメインオーナー AWSアカウントIDが入る}
REPOSITORY: ${AWS CodeArtifactのリポジトリ名}
AWS CodeArtifactの管理コーンソールに移動し、リポジトリを作成する。
リポジトリ名を入力して「次へ」を押下する。これがREPOSITORY
に該当する。
ドメインとAWSアカウントの設定を行う。これが、DOMAIN
とDOMAIN_OWNER
に該当する。
設定が完了すれば、CodeArtifactでの設定は終わり。
OIDC (OpenID Connect)に必要なAWSロールを作成する
セキュリティリスクを考慮し、GitHub ActionsとAWS CodeArtifactの認証はOIDC (OpenID Connect)を使用する。アクセスキーIDとシークレットアクセスキーIDを使用する方式は、セキュリティリスクが高いため採用しない。
ロールの作成手順は、以下の記事の「OpenId ConnectによるAWS連携」を参照のこと。
DockerイメージをGithub ActionsからAWS ECSに自動デプロイする手順
この記事はECSの例だが、OIDC (OpenID Connect)の設定に関しては流用できるので、手順通りに進めること。ただし、記事の「IAMポリシーのアタッチ」だけ、CodeArtifact用に変更する必要がある。最低でも以下の権限が必要。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"codeartifact:PublishPackageVersion", // パッケージの公開に必要
"codeartifact:GetAuthorizationToken", // 認証トークンの取得に必要
"codeartifact:GetRepositoryEndpoint" // リポジトリエンドポイントの取得に必要
],
"Resource": [
"arn:aws:codeartifact:<AWS_REGION>:<AWS_ACCOUNT_ID>:repository/<DOMAIN_NAME>/<REPOSITORY_NAME>"
]
},
{
"Effect": "Allow",
"Action": "sts:AssumeRoleWithWebIdentity", // OIDC に必要
"Resource": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<ROLE_NAME>"
}
]
}
CodeArtifactのポリシー 一覧:
https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_awscodeartifact.html
Statement
> Resource
の箇所は、AWS CodeArtifactの管理コーンソール > 該当のリポジトリを選択 > 詳細ダブを開く > 「リポジトリARN」から確認できる。
ワークフローを実装する
GitHub Actions→AWS CodeArtifactへPushするためのワークフローを記載する。env
には、上記の手順で作成した各種情報が入る。
name: Publish to AWS CodeArtifact
on:
push:
branches:
- main
env:
ROLE_ARN: arn:aws:iam::${AWS_ACCOUNT_ID}:role/${ロール名}
AWS_REGION: ap-northeast-1
DOMAIN: ${AWS CodeArtifactのドメイン名}
DOMAIN_OWNER: ${AWS CodeArtifactのドメインオーナー AWSアカウントIDが入る}
REPOSITORY: ${AWS CodeArtifactのリポジトリ名}
jobs:
publish:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
# リポジトリのコードをチェックアウト
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js 20.x
uses: actions/setup-node@v4
with:
node-version 20
# AWS OIDC の認証: GitHub ActionsからAWSリソースにアクセスできるようになる
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ env.ROLE_ARN }}
aws-region: ${{ env.AWS_REGION }}
# AWS CodeArtifact に認証し、npm install や npm publish を実行できるように .npmrc を設定する
- name: Authenticate to CodeArtifact
run: |
export CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token \
--domain ${{ env.DOMAIN }} \
--domain-owner ${{ env.DOMAIN_OWNER }} \
--query authorizationToken \
--output text)
echo "//${{ env.DOMAIN }}-${{ env.DOMAIN_OWNER }}.d.codeartifact.${{ env.AWS_REGION }}.amazonaws.com/npm/${{ env.REPOSITORY }}/:_authToken=$CODEARTIFACT_AUTH_TOKEN" > ~/.npmrc
echo "@<ORG_NAME>:registry=https://${{ env.DOMAIN }}-${{ env.DOMAIN_OWNER }}.d.codeartifact.${{ env.AWS_REGION }}.amazonaws.com/npm/${{ env.REPOSITORY }}/" >> ~/.npmrc
# パッケージのビルド
- name: Build the package
run: npm install && npm run build
# CodeArtifact にパッケージを公開
- name: Publish package to CodeArtifact
run: npm publish
重要な部分の解説
- 認証トークンを取得:
export CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token
にて、CodeArtifact にアクセスするための一時的な認証トークンを取得(有効期限: 最大12時間)。 .npmrc
の設定(echoコマンドの箇所): CodeArtifact のリポジトリに対する認証情報を.npmrc
に設定。スコープ付きパッケージ(例:@my-org/mylib
)は CodeArtifact を利用するよう設定している。
このスクリプトを使うことで、GitHub Actions 上で CodeArtifact の認証が完了し、パッケージのインストールや公開が可能になる。
ワークフローの実装で参考にした公式ドキュメント: https://docs.aws.amazon.com/ja_jp/codeartifact/latest/ug/npm-auth.html
コメント