AWS SSO × CodeCommit の認証設定

# はじめに
AWS の CodeCommit を使用してソース管理をしていますが、CodeCommitとGitの設定情報に関して基礎から理解できていなかったため、改めて調べたことを備忘録として残します。恐らく初学者向けです。

# 概要

- git config
- AWS CLI に関するファイル
    - ~/.aws/config
    - ~/.aws/credentials
    - プロファイルの設定
- git config の認証情報に AWSのプロファイルを設定
- 元々やりたかったこと
- 実際に起きていたこと
- 補足

# git config

git config は Gitの設定を行うためのコマンドになり、ここで設定した内容は `.gitconfig` ファイルに保存されます。

例えば、`git config user.email`と実行し、メールアドレス`user@mail.com`を入力すると、

```.gitconfig
[user]
    email = user@mail.com
```
というように設定されます。

また、設定されるconfigファイルは大きく３種類あり、それぞれ`local`、`global`、`system`で対象の範囲が異なります。

| 種類 | 対象範囲 | 場所（Windows）| 場所（Mac） | 備考 |
| ---- | ---- | ---- | ---- | ---- |
| system | システム全体（全ユーザーの全リポジトリ） | [gitインストール先]¥etc¥gitconfig<br>[gitインストール先]¥mingw64¥etc¥gitconfig<br>一般的な場所<br>C:¥Program Files¥Git¥etc¥gitconfig<br>C:¥Program Files¥Git¥mingw64¥etc¥gitconfig<br>C:¥Program Files (x86)¥Git¥etc¥gitconfig<br>C:¥Program Files (x86)¥Git¥mingw64¥etc¥gitconfig | 一般的な場所 <br>/usr/local/etc/gitconfig <br> /usr/local/git/etc/gitconfig | - |
| global | 該当ユーザーの全リポジトリ | C:¥Users¥[ユーザー名]¥.gitconfig | ~/.gitconfig | ホーム直下|
| local | 該当リポジトリ | [リポジトリのルートディレクトリ]¥.git¥config | [リポジトリのルートディレクトリ]/.git/config | リポジトリの`.git`直下 |

そのため、それぞれの範囲別に値を設定したい場合は、`git config --global <name>`のようにオプションが必要になります。

色々な設定がありますが、設定を変更したい場合は、コマンドから変更しても直接設定ファイルを書き換えてもどちらでも大丈夫です。

| 項目 | オプション | 備考 |
| ---- | ---- | ---- |
| ユーザー名 | user.name | |
| メールアドレス | user.email | |
| デフォルトのpush方式（nothing） | push.default current | git push origin masterのように常にpush元と先を指定する |
| デフォルトのpull方式（false） | pull.ff false | fast-forwardかどうかに関わらず常にマージコミットを作成する。（= git pull --no-ff） |
| デフォルトのブランチ名 | init.defaultBranch | |
| 認証ヘルパーの読み込み | credential.helper | AWSのプロファイル等を指定することも可能 |

【参考資料】

https://note.nkmk.me/git-config-setting/

https://www.curict.com/item/fe/fe45741.html#google_vignette

https://blog.katsubemakito.net/git/git-config-1st

# AWS CLI に関するファイル

AWS CLIはコマンドラインからAWSリソースを管理するためのコマンドラインツールですが、どのAWS環境にアクセスするかといった情報を設定する必要があります。

AWS CLIをインストールした直後はまだありませんが、`aws configure`を実行し、必要な情報を入力することで

`~/.aws/config`
`~/.aws/credentials（※アクセスキーとシークレットアクセスキーを入力した場合）`

の２つの設定ファイルが生成され、設定した情報のAWS環境へアクセスすることができるようになります。

![スクリーンショット 2023-11-20 193440.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/13c559dc-3d64-5040-1c23-359a8cc1e979.png)

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

```.aws/credentials
[default]
aws_access_key_id = *********************
aws_secret_access_key = ******************************
```

※入力したアクセスキーやシークレットアクセスキーは漏洩しないように管理しましょう。

# プロファイルの設定

上記の場合、`aws configure`というように名前を指定せずに設定したので`[default]`の項目に値が設定されました。

これはプロファイルを指定しなかった時に読み込まれる情報という意味になりますが、権限ごとにプロファイルを分けて設定することができます。

`aws configure --profile プロファイル名（今回はtest）`とすると、下記のように指定した名前で新たなプロファイルが作成されます。

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

[test]
region = ap-northeast-1
output = json
```

```.aws/credentials
[default]
aws_access_key_id = *********************
aws_secret_access_key = ******************************

[test]
aws_access_key_id = *********************
aws_secret_access_key = ******************************
```

例えば上記の設定内容であるコマンドを実行したい場合は、

`aws 何かしらのコマンド --profile test`

とすることで`test`の認証情報でコマンドを実行することが可能になります。

`aws 何かしらのコマンド` だけの場合は、`default`のプロファイルが適用されます。

# git config の認証情報に AWSのプロファイルを設定

前項でお伝えした`~/.aws/credentials`にアクセスキーやシークレットアクセスキーが設定されていれば git コマンドでCodeCommit上のリポジトリにアクセスすることができますが、
今回は上記のキーを設定していない状態で、CodeCommitの認証にSSOを使用したいと思います。

そのためには、まず `~/.aws/config` ファイルにSSOの情報を記載します。

```.aws/config
[profile プロファイル名]
sso_start_url = SSO作成時に払い出されたURL
sso_region = ap-northeast-1
sso_account_id = SSOを作成したAWSのアカウントID
sso_role_name = SSOを作成したロール名
region = ap-northeast-1
output = json
```

そして、`~/.gitconfig` ファイルに `[credential]` の項目を追加します。

```.gitconfig
[user]
    name = user_name
    email = user@mail.com

# 追加
[credential]
    helper = !aws --profile プロファイル名 codecommit credential-helper $@
    UseHttpPath = true
```

このようにすることで、git コマンドで CodeCommitのリポジトリにアクセスした際、SSOの認証が切れていればアクセスが不可になります。

![スクリーンショット 2023-11-20 202131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/968084d8-7808-58f2-6e80-ecc59271f9b2.png)


認証が切れていれば `aws sso login --profile プロファイル名` で再度認証することができます。

これでローカルのファイルにアクセスキーやシークレットアクセスキーを保存しておく必要がなくなりました。

※AWS SSO の認証情報のキャッシュは `~/.aws/cli/cache` と `~/.aws/sso/cache` に保存されます。

# 元々やりたかったこと

元々は上記でご説明したように、CodeCommitのリポジトリにgitコマンドでアクセスする時に AWS SSOの認証が必要である仕組みを作るつもりでした。

# 実際に起きていたこと

しかし、SSOの有効期限が切れても`git fetch`等のリポジトリの参照処理ができてしまうという状況が起きていました。

IAMユーザーに「AWS CodeCommit の HTTPS Git 認証情報」というものが設定されていましたが（画像は削除済み）、これのせいでSSOなど関係なく、初回でIDとパスワードを入力すればHTTPSでGitの認証ができてしまっていました。

![スクリーンショット 2023-11-20 184210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1021235/9f5677a4-5884-921c-c843-c143a9f87d43.png)

しかも `~/.gitconfig` の内容が

```.gitconfig
[credential]
        helper = !aws codecommit credential-helper $@
        UseHttpPath = true
```

となっており、プロファイルが設定されていなかったのでそりゃできないですね。

そのため、.gitconfig の見直しとHTTPS Git 認証情報の削除によって予定通りに動作するようになりました。

# 補足

筆者の開発環境は Windows と Macbook の２種類ありますが、Macbook側にはデフォルトの**Apple Git**がインストールされていました。

そのためホームディレクトリ配下に `.gitconfig`なるものが存在せず、どこかしらに設定ファイルがあると思い探しましたが見つからなかったので Homebrew 経由で Git をインストールしました。

Apple Git でも .gitconfig のように設定する方法について、わかる方がいればコメントいただけると幸いです。

https://qiita.com/shott/items/ec9d8fe95cae1d9eb9d8

# 最後に

業務でちょこちょこAWSは触っていましたが、IAMを含めた認証や権限周りの仕組みや設定がかなり難しく、初学者の参入障壁になっているような気がします...

【参考記事】

https://note.nkmk.me/git-config-setting/

https://www.curict.com/item/fe/fe45741.html#google_vignette

https://blog.katsubemakito.net/git/git-config-1st

https://qiita.com/suuungwoo/items/66f39ac1d12c7a800d98

https://dev.classmethod.jp/articles/lim-cli-profile/

https://nopipi.hatenablog.com/entry/2019/08/12/192047

https://qiita.com/tomoya_oka/items/953531b0e483c4f62d6e