GitHub Actions→AWS CodeArtifactへPushする手順【OIDCを使用】

実務のプロジェクトで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アカウントの設定を行う。これが、DOMAINDOMAIN_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

関連記事

コメント

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