GithubActionsでIAMRoleを使ってCodeCommitにミラーリングする

6357 ワード

概要

GithubからActionsを使ってCodeCommitへミラーリングをさせる方法について記載します。

検索した限りでは、こちらのアクションを使って実装できるようです。
pixta-dev/repository-mirroring-action

ただ、上記はIAMのSSHキーをSecretsに登録してpushさせる方法になっていますが、
この間GithubがAWSのフェデレーションに対応したという話を聞きました。

セキュリティ的にも可能なのであればIAMRoleを使って実装したいと思い、調べたのでメモします

手順

IAMRoleの作成

Github側でAssumeRoleするためのRoleを用意します。
こちらの記事を参考にしてGithubActionsDeployRoleを作成、Roleのarnを後続作業で使います。

actionsの設定

以下のyamlをactionsに設定、pushすればミラーリングされます。簡単!

name: Mirror to CodeCommit

on:
  push:

env:
  AWS_REGION: ap-northeast-1
  AWS_ROLE_ARN: arn:aws:iam::xxxxxxxx:role/GithubActionsDeployRole
  AWS_WEB_IDENTITY_TOKEN_FILE: /tmp/awscreds
  ECR_REPOSITORY: yourrepo

jobs:
  deploy:
    name: Mirror
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read

    steps:
    - name: Checkout
      uses: actions/checkout@v2
      with:
        fetch-depth: 0

    - name: Configure AWS
      run: |
        echo AWS_WEB_IDENTITY_TOKEN_FILE=$AWS_WEB_IDENTITY_TOKEN_FILE >> $GITHUB_ENV
        echo AWS_ROLE_ARN=$AWS_ROLE_ARN >> $GITHUB_ENV
        echo AWS_DEFAULT_REGION=$AWS_REGION >> $GITHUB_ENV
        curl --silent -H "Authorization: bearer ${ACTIONS_ID_TOKEN_REQUEST_TOKEN}" "${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=sigstore" | jq -r '.value' > $AWS_WEB_IDENTITY_TOKEN_FILE

    - name: Configure git
      run: |
        git config --global credential.helper '!aws codecommit credential-helper $@'
        git config --global credential.UseHttpPath true
        
    - name: Mirroring
      run: |
        git remote add mirror https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/$ECR_REPOSITORY
        git push --tags --force --prune mirror "refs/remotes/origin/*:refs/heads/*"

IAMRoleのarnとリポジトリ名をそれぞれ設定しましょう

AWSの認証を作成する部分はAWS federation comes to GitHub Actionsを参考にしています
AWSアカウントをSecretsに登録するのがよりベターかと思います

gitのconfig追加はAWSのドキュメントを参考にして、認証情報ヘルパーを設定しています

ミラーリングのコマンドはpixta-dev/repository-mirroring-actionを参考に設定

一度以下のようなエラーが発生しましたが、
checkoutwith:fetch-depth: 0というパラメータが必要なようです

remote: Unknown commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
error: remote unpack failed: Unknown commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/xxxxxx
 ! [remote rejected] origin/main -> main (unpacker error)
error: failed to push some refs to 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/xxxxxx'

SSHキーの運用から解放されましょう!