AnsibleをAWS Systems Managerから実行するCI/CDを構築する。（その２：CodeCommitの準備）

# はじめに
前回は`Systems Manager`の`RunCommand`機能を使って`Ansible`を実行してみました。

今回は`Ansible`の`Playbook`等を格納するGitリポジトリを`CodeCommit`を使用して作成＆アップロードしてみようと思います。

- 【前】[AnsibleをAWS Systems Managerから実行するCI/CDを構築する。（その１：Systems ManagerからのAnsible実行）](https://qiita.com/sakai00kou/items/5604b94dd2c87922538f)
- 【次】[AnsibleをAWS Systems Managerから実行するCI/CDを構築する。（その３：SNS、Chatbotの準備）](https://qiita.com/sakai00kou/items/b75e763aef0af475dfb2)

# CodeCommitとは
`CodeCommit`は`AWS`で提供しているGitリポジトリとなり、他の`AWS`サービスと連携がしやすくなっているサービスとなります。

# CodeCommitの作成
`CodeCommit`のGitリポジトリの作成は簡単で、マネジメントコンソールから「`AWS CodeCommit`」→「**リポジトリを作成**」でリポジトリを作成します。

![Monosnap_20220914_203433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/3896e8bc-4d59-79eb-2fad-7c56fadff844.png)

リポジトリ名は適当な名前をつけて「**作成**」をクリックすれば完成です。

![Monosnap_20220914_203515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/5e553770-25f3-b79e-f068-a4b62045dc61.png)

# CodeCommit使用前準備
リポジトリの準備ができたので、クライアント側のセットアップを行います。

`CodeCommit`からファイルを取得する方法はいくつかありますが、今回は操作端末に設定されているIAMユーザで取得する方法を紹介します。

## Gitのインストール
操作端末に`Git`がインストールされていなければ、各OSごとのインストール方法に従って`Git`のダウンロード＆インストールを行います。

以下はMacでインストールする場合の例。

```bash:Gitのインストール(Mac)
brew install git
```

## クレデンシャルの設定
操作端末の`~/.aws/credentials`にクレデンシャルが登録されていなければ登録しておきます。

```bash:認証情報の設定
aws configure
```

## 認証情報ヘルパー設定
以下の設定を行わない場合、`CodeCommit`にアクセスした際に、認証情報が聞かれてしまうため、認証情報ヘルパーをセットアップします。

```bash:認証情報ヘルパー設定
git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true
```

【参考】
- [AWS CodeCommit 認証情報ヘルパーを使用して Windows で AWS CLI リポジトリへの HTTPS 接続をセットアップする手順](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-https-windows.html)
- [AWS CLI 認証情報ヘルパーを使用した、Linux、macOS、または UNIX での AWS CodeCommit リポジトリへの HTTPS 接続のセットアップ手順](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-https-unixes.html)
- [AWS CodeCommit 認証情報ヘルパーを使用して Windows で AWS CLI リポジトリへの HTTPS 接続をセットアップする手順](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-https-windows.html)

## （MacOSのみ）キーチェーンパスワード自動削除
`MacOS`で`CodeCommit`を使用すると先程まで`pull`や`push`ができていたのに急に403エラーとなり、以降エラーとなり続けるという事象が発生します。

これは`MacOS`で`CodeCommit`に接続する際に使用している認証情報は15分しか使えないキーチェーンとなり、期限が切れるとキーが使えなくなることから接続できなくなってしまいます。

「**Launchpad**」→「**その他**」→「**キーチェーンアクセス**」より以下のような「`git-codecommit.ap-northeast-1.amazonaws.com`」といった名前のキーを削除すればまたアクセスできるようになりますが、いちいち削除するのは面倒なので、以下のサイトを参考に、`CodeCommit`で使用している認証情報を定期的に削除する処理を追加しておきます。

![Monosnap_20220919_124042.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/0b2ac995-c4d3-3874-4d8f-ec1d17162f2d.png)

　- [【macOS】リポジトリアクセス時の403エラー対策！AWS CodeCommitのキーチェインパスワードを自動的に削除してみる](https://dev.classmethod.jp/articles/codecommit-keychainpassword-delete/)

# CodeCommitへのpush
準備ができたので、作業端末の適当な場所に移動し、以下コマンドで`CodeCommit`リポジトリをクローンします。

なお、現時点では`CodeCommit`のリポジトリには何も登録されていないため、「`warning: You appear to have cloned an empty repository.`」といったワーニングが出力されても無視します。

```bash:CodeCommitからクローン取得
git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/[CodeCommitリポジトリ名]
```

## Ansible Playbookソース登録
カレントディレクトリにクローンしたディレクトリが存在するはずなので、クローンしたディレクトリ配下に、[前回](https://qiita.com/sakai00kou/items/5604b94dd2c87922538f)使用した`Ansible Playbook`のソースを登録します。

クローンしたディレクトリ配下に前回`ansible_playbook`ディレクトリ配下に格納した各種ソースをコピーまたは移動してしまいます。

以下、前回作成した`ansible_playbook`ディレクトリと今回Gitクローンした`ssm_ansible`ディレクトリが同階層にある前提で説明します。

```　bash:ソースファイルの移動
cd ansible_playbook
mv * ../ssm_ansible
cd ../ssm_ansible
```

```bash:ローカルへのコミット
git add .
git commit -m "first commit"
```

## CodeCommitへのpush
ローカルのリポジトリにコミットしたソースをリモートリポジトリ（`CodeCommit`）に`push`します。

```bash:CodeCommitへのpush
git push origin master
```

マネジメントコンソールより先程`push`したファイル・ディレクトリが表示されていれば成功です。

![Monosnap_20220919_125947.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/fd67360b-d9fb-b0c4-82a0-ad274e843541.png)

# おわりに
今回は`CodeCommit`を作成し、前回作成した`Playbook`のファイルをリポジトリ登録するところまで実施しました。

次回は`SNS`、`Chatbot`の準備を行い、`Slack`へ通知するための仕組み作りをしようと思います。