AWS CodeCommit をスイッチロールで利用する

## はじめに
CodeCommitリポジトリをスイッチロール権限でローカルにgit cloneすることを目的とします。
スイッチロールについてや設定方法については本記事では言及しません。

### 使用環境とバージョン
- macOS Catalina
- git version 2.24.3 (Apple Git-128)
- aws-cli/2.0.28


## 記事の対象
- ある程度AWSとGitの知識がある方
- CodeCommitを利用して開発を行いたい方
- CodeBuild、CodePipelineを使用したCI/CDに興味がある方

※ CodeCommitとGitの違いについて公式ドキュメントのQ&A
[AWS CodeCommit のよくある質問](https://aws.amazon.com/jp/codecommit/faqs/)

## 事前準備
- Git 1.7.9 以降がインストールされていること（Macではプリインストールされているはず）
- スイッチロールを作成済み。スイッチロール先にCodeCommit操作権限が付与されていること

## 1. AWS CLIのインストール
以下のコマンドを実行し、AWS CLIをインストールします。

```
$ brew install awscli  // 更新の場合: brew upgrade awscli
...

$ aws --version
aws-cli/2.0.28 Python/3.8.3 Darwin/19.5.0 botocore/2.0.0dev32
```

## 2. IAMユーザのアクセスキーとシークレットキーを発行
AWS CLIを使用するためにはIAMユーザを紐づける必要があります。
事前にAWSコンソールから自身のユーザを選択し、アクセスキーを発行します。
![screencapture-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756249/c4a2ccc3-7c73-0979-8add-28ae12e8a652.png)

## 3. configおよびcredentialsを設定
`aws configure`コマンドを使用して、AWS CLIに事前に取得した`アクセスキー`と`シークレットキー`を設定します。

```
$ aws configure
AWS Access Key ID [None]: [アクセスキー]
AWS Secret Access Key [None]: [シークレットキー]
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
上記コマンドを実行することで以下の2ファイルに設定が追加されます。

```text:~/.aws/credentials
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=xxxxxxxxxxxxxxxxx
```

```text:~/.aws/config
[default]
region=ap-northeast-1
output=json
```

## 4. configにスイッチ先のプロファイル情報を記載
configにスイッチ先のプロファイル情報を追加します。
追加したプロファイルを指定することで自身のIAMユーザに権限がアタッチされていないサービスでもスイッチロール先の権限を利用してサービスを利用できます。

```text:~/.aws/config
[default]
region=ap-northeast-1
output=json

+ [profile switchrole]
+ role_arn = arn:aws:iam::{スイッチ先のAWSアカウントID}:role/{ロール名}
+ source_profile = default
+ region=ap-northeast-1
+ output=json
```

## 5. 認証情報ヘルパーを設定
Gitでは認証情報ヘルパーを利用して先ほど追加したプロファイルを指定します。
以下のコマンドで認証情報ヘルパーにプロファイル情報を設定してください。

```
$ git config --global credential.helper '!aws --profile switchrole codecommit credential-helper $@'
$ git config --global credential.UseHttpPath true

$ git config --global user.name "kazuki.kano"
$ git config --global user.email kano@xxxx
```

`user.name`などのユーザ情報は適宜設定してください。
設定ルールなどを決めて設定することをお勧めします。

設定内容は以下のようになります。

```text:~/.gitconfig
[credential]
	helper = !aws --profile switchrole codecommit credential-helper $@
	UseHttpPath = true
[user]
	name = kazuki.kano
	email = kano@xxxx
```

## 6. CodeCommitからclone
あとはGitリポジトリと同様にcloneすれば完了です。

```
$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/demo-api
```

しばらくすると以下のようなエラーが発生する場合があります。

```
fatal: unable to access 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/demo-api/': The requested URL returned error: 403
```

これはAWS公式のドキュメントにもあるように、macOSでは`Keychain Access ユーティリティ`によりCodeCommitリポジトリへのアクセスは15分で無効になります。

>
OS X および macOS でリリースされているデフォルトバージョンの Git では、Keychain Access ユーティリティを使用して、生成された認証情報を保存します。セキュリティ上の理由により、CodeCommit リポジトリにアクセスするために生成されるパスワードは一時パスワードであるため、15 分経過すると、キーチェーンに保存されている認証情報は無効になります。

[認証情報ヘルパーと AWS CodeCommit への HTTPS 接続のトラブルシューティング](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/troubleshooting-ch.html)

対処法は以下のように`helper = osxkeychain`をコメントアウトして下さい。

```
$ git config -l --show-origin | grep credential
file:/Library/Developer/CommandLineTools/usr/share/git-core/gitconfig   credential.helper=osxkeychain
file:/usr/local/etc/gitconfig	credential.helper=osxkeychain
...

$ sudo vi /Library/Developer/CommandLineTools/usr/share/git-core/gitconfig
[credential]
        # helper = osxkeychain  // コメントアウトします
```

上記だけで認証できない場合は、`Keychain Access ユーティリティ`に認証情報が残っている可能性があるのでこちらはアプリから削除して下さい。
![スクリーンショット 2021-01-12 11.22.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756249/7103d090-bd64-980c-ae98-c00254de5a6d.png)
検索ウインドで`git`などで検索すると絞り込めます。
![スクリーンショット 2021-01-12 11.23.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756249/dda3d9c8-3290-f4e1-f2af-e93ee5fbfb46.png)

## 参考記事
- [AWS CodeCommit のよくある質問](https://aws.amazon.com/jp/codecommit/faqs/)
- [認証情報ヘルパーと AWS CodeCommit への HTTPS 接続のトラブルシューティング](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/troubleshooting-ch.html)
- [AWS CLI 認証情報ヘルパーを使用して AWS CodeCommit リポジトリへの HTTPS 接続をセットアップする手順](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-https-unixes.html)