githubとaws codecommitをミラーリングする

## 概要
code commitを仕事で使う可能性があるので、勉強がてら触ってみます。
せっかくなので前々からやってみたかったgithubとのミラーリングをしてみます。

この記事はそのメモやまとめです。
すでに設定済みの項目がいくつかある。
試行錯誤しながらやったので、手順として不要かもしれない。**あくまでメモ用。**

## どうミラーリングするか
githubとcodecommitのミラーリングについて調べるとsshキーを利用する方法がかなりの数ヒットしました。
ですがsshを利用する方法だとIAMにキーを登録して～githubにも登録して～そんでもってキーを管理して～と非常に面倒だなと思いました。

調べてみるとIAMロールでもできるとのこと。

https://zenn.dev/ryota_09/articles/2b6389d8985356

AWSとgithubのIAMロールでの連携はすでに実装済みなのでこちらのほうが実装も管理も楽そうでしたので、
こちらの方法でやってみます。

## 自分の環境に合わせる点の洗い出し
参考記事からいくつか自分の環境に合わせて変えている部分がいくつかあります。

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

同じリポジトリのgithub actions用のポリシーをすでにs3へUpするactionsで作成済みだったので、そのポリシーに「AWSCodeCommitFullAccess」を追加しました。


> 「Secrets」には、先ほどAWSコンソールでコピーしたARNを貼り付けます。最後に「Add secret」をクリックします

すでにAWSアカウントのIDがSecretに登録済みでしたので、envでSecret呼び出しています。
```
env:
  AWS_REGION: ap-northeast-1
  AWS_ROLE_ARN: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/github_assume_role

 role-to-assume: ${{ env.AWS_ROLE_ARN }}
```
 のようにしています。

## workflowを書く
参考記事を見ながらworkflowを書きます。
この時点では参考記事から大きな変更はなく、変えるべき場所を変えた程度です。

## terraformでcodecommitのリポジトリを作る
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/codecommit_repository
```terraform
resource "aws_codecommit_repository" "inugami-techlab" {
  repository_name = "inugami-techlab"
  description     = "inugami-techlabのterraform,Hugoなどのコードです"
}

output "repository_clone_url_http" {
  value = aws_codecommit_repository.inugami-techlab.clone_url_http
}

output "repository_clone_url_ssh" {
  value = aws_codecommit_repository.inugami-techlab.clone_url_ssh
}
```

これといって特別なことはしていません。
こちらをapply。そのままgithubへworkflowと一緒にマージしてactionsの動作確認をします。

## 問題発生
pushしたときのjobは問題ないが、マージした後に走るjobが以下のエラーで失敗する。
```
remote: error: refusing to delete the current default branch 'refs/heads/create_codecommit'.
fatal: the remote end hung up unexpectedly
```
調べるとどうやらcodecommit側のブランチに問題がありそうです。
こちらの方と同じような感じでした。

https://qiita.com/hirai-11/items/ae9c299669ab4c4c08a2

codecommitのブランチを見てみるとデフォルトブランチが「create_codecommit」になっていました。
GIUでデフォルトブランチを「master」に変更します。
(変更の仕方はこちらを見ました)

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-change-branch.html


修正すると、今度は逆にpushしたときのjobが失敗し、マージした後に走るjobが成功するようになってしまいました。
成功しているしcodecommitにもミラーリングはされていますが、なんだか気持ちが悪いので、マージされたときにのみ実行されるようにします。

https://qiita.com/okazy/items/7ab46f2c20ec341a2836

こんな感じに修正しました。
```
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
+    branches:
+      - master
+    types:
+      - closed
 
 env:
     AWS_REGION: ap-northeast-1
@@ -13,6 +18,7 @@ permissions:
 
 jobs:
   CodeCommitMirror:
+    if: github.event.pull_request.merged == true
     runs-on: ubuntu-latest
     steps:
       - name: Git clone the repository (Checkout)
```

これでマージされたときのみjobが実行され、codecommitにミラーリングされるようになりました。

## もうちょっと修正
```
CodeCommitMirror
Node.js 16 actions are deprecated. Please update the following actions to use Node.js 20: actions/checkout@v3, aws-actions/configure-aws-credentials@v2. For more information see: https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/.
```
が出力されていたのでV4にして解消させます。
```
     runs-on: ubuntu-latest
     steps:
       - name: Git clone the repository (Checkout)
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
           fetch-depth: 0 #これがない場合、checkout時にエラーが出る。
       - name: Configure AWS
-        uses: aws-actions/configure-aws-credentials@v2
+        uses: aws-actions/configure-aws-credentials@v4
:
```


## 終わりに
今回は本当に作っただけでした。
codepipelineを利用して、Hugoのビルドとs3への保存やterraformの実行などサせるようにしていきたいです。