🪩

GitHub ActionsとIAM Roleを用いてPushを契機にリポジトリをCodeCommitにミラーリングする方法

2023/06/17に公開

こんにちは!@Ryo54388667です。
今回は、GitHub Actionsと AWS IAM Roleを用いて、Pushを契機にGitHubのリポジトリをAWS CodeCommitにミラーリングする手順を説明していきます!

https://twitter.com/Ryo54388667

ごちゃごちゃ言わずに手順を教えてくれ!という方はこちらのリンクからジャンプしてください!

AWS CodeCommit にミラーリングするメリット

CodeCommitにミラーリングするメリットは2点あります。
まず1つ目は、セキュリティの観点です!これが大部分です!

例えば、GitHubと別のプラットフォームとの連携を考えたとき、それらの連携には多くの場合アクセストークンを使います。でも、これが盗まれてしまうと、自分の知らないところで悪意ある第三者によって自由に利用されてしまう可能性があります。これは緊急事態です!🤯現に、今年の始めに大手某社のトークンが盗まれる、という事件が起きています。決して、稀有な事象では無いので、このあたりは慎重に対応したいところです。

そのようなリスクを避けるためにも、連携するプラットフォームは最小限に留めることが推奨されます。一度CodeCommitにリソースを移すことができれば、AWS 内のセキュリティ環境をとなるので、他のプラットフォームの連携よりは比較的安全になると思います。

2つ目は、AWSの他のサービスとの親和性です。例えば、AWSの開発ツール(AWS CodeBuildやAWS CodePipelineなど、いわゆるcodeシリーズ)やAWS Lambdaなどとの連携がしやすくなります。公式のドキュメントもあるのでありがたいです!

 
 

なぜIAM Roleを使うのか?

ズバリ、SSHキーの管理がツラい! これですよね。。

SSHキーは、コンピュータ間の通信を安全にするためのものですが、それを紛失すると大変なことになります🤯
例えば、開発中のプロジェクトで、SSHキーを紛失したとします。その場合、SSHキーが登録されていたサーバーへのアクセスが一切できなくなり、プロジェクトの進行が大幅に遅れるどころか、完全にストップしてしまいます。。さらに、もしSSHキーが第三者に渡ってしまった場合、その人は、元の持ち主の代わりにサーバーにアクセスでき、悪用されかねません。。考えたくないですね。。そのような対策として定期的に更新する必要があります。

あとは、チームで開発するような、複数人でSSHキーを共有する際には管理が煩雑になることがあります。
以上のような管理の手間があったので、代替としてIAM Roleを利用しました!

IAMロールはAWSが提供する権限管理の機能で、特定のサービスやユーザーに対して、必要な権限だけを付与することができます。これにより、SSHキーを紛失するリスクなく、安全にコードを管理することが可能になります!もちろん、こちらも紛失することは否めないです。リスクゼロとは言えませんので、慎重にお願いします。。

 
 

手順

① IDプロバイダの設定とIAMロールの割り当て

AWSのIAM管理画面で、新しいロールを作成します。その際、Github Actionsが利用するロールとして、適切なポリシーを割り当てる必要があります。これにより、Github ActionsがAWSのリソースを操作できるようになります。

GitHub公式からOpenIDを利用したIAM Roleの利用方法を提示していますので、それを参考にしていきます!

https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services

まず、AWSコンソール上での作業になります。
IAMのトップページに遷移してから、左サイドバーから「IDプロバイダ」をクリックします。
すると、下の画像のページに遷移するので、「プロバイダを追加」ボタンをクリックします。

 

すると、IDプロバイダの設定画面に遷移します。
デフォルトのプロバイダタイプはSAMLになっているので、「OpenID Connect」を選択してください。
同じ画面上に、プロバイダのURLと対象者のテキストボックスがあるので、そこに下記の文字列を入力してください。(公式doc)

//プロバイダURL
https://token.actions.githubusercontent.com
//対象者
sts.amazonaws.com

その後、画面右下の「プロバイダを追加」ボタンをクリックします。

 

次に、この作成したIDプロバイダにロールを割り当てていきます。
IAMページのサイドバーのIDプロバイダーのページに遷移すると、先ほど追加したプロバイダが表示されています。そのプロバイダ名をクリックすると詳細ページに遷移します。その後、「ロールの割り当て」ボタンをクリックします。(※IDプロバイダを作成後、すぐに画面上部に「ロールの割り当て」が表示される場合もあります。その場合、そちらをクリックしてもOKです。)

ボタンをクリック後、下記のモーダルが表示されます。
今回は新規作成しますが、すでに割り当てる予定のロールがある場合は、既存のものを選択してください。

信頼されたエンティティの種類を選択の部分は、「ウェブID」を選択します。
すると、IDプロバイダーとAudienceのセレクトボックスが表示されます。先ほど作成したIDプロバイダーを選択してください。選択後、「次のステップ」ボタンをクリックします。

 

続いて、ロールにアタッチするポリシーを選択します。
ポリシーのフィルタのテキストボックスに「codecommit」と入力すると、下記の画像のようなAWSのマネージドポリシーが表示されるので、「AWSCodeCommitFullAccess」のチェックボックスにチェックをし、「次のステップ」をクリックします。

ロール名を決めて、ロールを作成します。
ロール名をコピーしておいてください。 こちらは後ほど、利用します。

ロールを作成後、IAMロールのページに、作成したロールが表示されます。
そちらのロール名をクリックし、詳細画面に遷移します。下記の画像の「信頼関係」のタブをクリックします。
するとJSONのエディター画面が表示されるので、そちらを下記のコードに差し替えます。(公式doc)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::(***ここにアカウントIDが入ります***):oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:octo-org/octo-repo:*"
                },
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}

最後に、「ARN」の部分をコピーしておきます。 後ほど利用します。
以上でIAM Roleの設定は終了です!

 
 

② GitHub SecretsへIAMロールのARNの保存およびymlファイルの作成

上記で取得したIAMロールのARNを、GitHub Secretsに保存します。これにより、Github Actionsが動作する際に、このIAMロールを使ってAWSのリソースにアクセスできるようになります。

ここからは、GitHub上の対象のリポジトリのページで作業します。

下の画像の「Settings」タブをクリックし、設定ページに遷移します。

設定ページの左サイドバーの「Secrets and variables」をクリックし、表示された「Actions」をクリックします。すると、右のメインエリアにSecretsの設定画面が表示されます。

下の画像のように、Secretsタブになっていることを確認し、「New repository secret」をクリックします。

「Name」には任意の変数名を入力します。
「Secrets」には、先ほどAWSコンソールでコピーしたARNを貼り付けます。最後に「Add secret」をクリックします。

GitHub SecretsへIAMロールのARNの保存が完了しました。

 

続いて、VScode等ローカルエディターの作業に移ります。
プロジェクトのルートに.githubディレクトリを作成し、さらに、そのディレクトリ内にworkflowsディレクトリを作成します。workflowsディレクトリの中にdeploy.ymlファイルを作成します。

下記のコードをymlファイルに書きます。(公式doc)

# .github/workflows/deploy.yml
name: AWS CodeCommit Mirror with GitHub Actions
on: push
env:
  AWS_REGION: ap-northeast-1
  REPOSITORY_NAME: {{ リポジトリ名が入ります }}
permissions:
  id-token: write
  contents: read
jobs:
  CodeCommitMirror:
    runs-on: ubuntu-latest
    steps:
      - name: Git clone the repository (Checkout)
        uses: actions/checkout@v3
        with:
          fetch-depth: 0 #これがない場合、checkout時にエラーが出る。
      - name: Configure AWS
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: ${{ secrets.IAM_ROLE_ARN }} # ここにGitHub Secretsに保存した変数名が入ります。
          role-session-name: {{ ここにコピーしたロール名が入ります }}
          aws-region: ${{ env.AWS_REGION }}
      - name: Push to CodeCommit (Mirroring)
        run: |
          git config --global credential.helper '!aws codecommit credential-helper $@'
          git config --global credential.UseHttpPath true
          git remote add codecommit https://git-codecommit.${{ env.AWS_REGION }}.amazonaws.com/v1/repos/${{ env.REPOSITORY_NAME }}
          git push --mirror codecommit

 
 

③ AWS CodeCommitにリポジトリを作成

最後に、AWSのCodeCommitで新しいリポジトリを作成します。これが、Githubのリポジトリをミラーリングする先となります。箱を用意します。リポジトリが作成されたら、それをGithub Actionsの設定に追加します。リポジトリ名はGitHubのリポジトリと同じ名前にしてください。

これらの手順を踏むことで、GitHubのリポジトリがPushされるたびに、それが自動的にAWS CodeCommitのリポジトリにも反映される(ミラーリングされる)ようになります。これにより、開発作業の効率化だけでなく、セキュリティの向上も図れますね!

 

最後まで読んでいただきありがとうございます!
気ままにつぶやいているので、気軽にフォローをお願いします!🥺

https://twitter.com/Ryo54388667

Discussion