AWS CodeCommitへの接続方法一覧(2024年度版)

## はじめに
AWS CodeCommit利用にあたって複数の接続方法が存在しているため、
それぞれ違い/利点をまとめた記事になります。

## AWS CodeCommitとは
Gitベースのリポジトリを安全にホストする、
フルマネージドサービス型のソース管理サービスこと**CodeCommit**

### CodeCommitのメリット
- 認証情報にIAMユーザが利用できるため、余分な認証情報の保持が不要となり認証制御が円滑に行える
- フルマネージドサービスにつきインフラの管理が不要
- 自動的に保管時/転送時にデータ暗号化
    - セキュリティリスク低下/運用コスト低下

## 前提知識のおさらい
### Gitについて
Gitはオープンソースのソースコード管理システム。Gitではブランチと呼ばれるリポジトリ(データの格納場所)のコピーが作成できる。
ブランチを使用することで、マスターバージョンのコードからコピーして自分の変更を加えることが可能になります。
ブランチのコードを変更したら、コミットという操作を行い差分として変更を登録したり、
共同作業者に変更点を通知してその人のブランチ取り込んでもらったり、マスターバージョンのリポジトリにマージすることができます。

### GitとGitHubの違い
※私も混合して理解していました。
**「Gitはシステムの名前で、GitHubはWebサービス(ツール)の名前であり、
この2つの関係は「メール」というシステムにおける「Gmail」というサービス」**
という説明が一番しっくりくる説明かと思います。
GitHubやCodeCommitはあくまでGitというソースコード管理システムを利用するためのサービスであるということです。
とはいえ、便利な機能が存在しているためGitHub上で操作が完結することもできます。

※上記は以下サイトの説明がわかりやすく引用させていただきました。

https://www.i3design.jp/in-pocket/3111

#### Git単体では使用できず、Github/CodeCommitを通して利用できる機能例
- コードレビュー機能(PullRequest)
- 変更履歴を取り込む(merge)
- リポジトリをコピー(Fork)
- クラウド上にリポジトリを設置
- 世界中の開発者からアドバイスや開発の協力を得られる



## 【本題】CodeCommitのgitリポジトリへの接続方法(全4種類)
CodeCommitではリポジトリの接続方法として、SSHとHTTPSが提供されています。
以下が接続方法の一覧となります。

①https接続(Git認証情報)
②ssh接続
③https接続(認証情報ヘルパー)
④https接続(GRC)：★AWS推奨★
### ①https接続(Git認証情報)
AWS IAMからCodeCommit用のGit認証情報を発行し接続する方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/dbf3ba3c-059e-1c6f-123e-44e6513e300d.png)

【メリット】
　・簡単に設定可能
【デメリット】
　・IAMユーザからGit認証情報を発行するため、管理対象の認証情報が増加
　　→セキュリティリスク増加

#### 接続手順
※前提として以下手順で使用するIAMユーザには「AWSCodeCommitFullAccess」の権限が付与されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/87f533d0-a92c-0306-634d-981760e3c3a6.png)
AWSコンソールのIAMより該当ユーザを選択し、「AWS CodeCommit の HTTPS Git 認証情報」から「認証情報の生成」を押下する。
※ユーザーとパスワードがダウンロードできるので控えておくこと

```bash
sh-4.2$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test
Cloning into 'test'...
Username for 'https://git-codecommit.ap-northeast-1.amazonaws.com': <IAMユーザから取得したGit認証情報>
Password for 'https://Codecommit-test-at-<アカウントI>@git-codecommit.ap-northeast-1.amazonaws.com':<IAMユーザから取得したGit認証情報>
remote: Counting objects: 3, done.
Unpacking objects: 100% (3/3), 187 bytes | 187.00 KiB/s, done.
```

### ②ssh接続
IAMユーザに公開鍵を登録し、SSH接続する方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/854a0849-2154-66b8-47aa-0a2b95dbdfd0.png)

#### 接続手順
```bash
sh-4.2$ ssh-keygen
```
下記コマンドでsshキーの作成。
※途中聞かれるパスフレーズは未設定でもOK

```bash
sh-4.2$ cd ~/.ssh/
sh-4.2$ ls -l
total 8
-rw------- 1 ssm-user ssm-user 1679 Nov 23 01:22 id_rsa
-rw-r--r-- 1 ssm-user ssm-user  437 Nov 23 01:22 id_rsa.pub
```
.sshディレクトリ配下に2つのファイルが生成されていることを確認
※「id_rsa.pub」がIAMユーザに登録する公開鍵


```bash
sh-4.2$ vi ~/.ssh/id_rsa.pub
```
「id_rsa.pub」ファイルの中身をコピー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/22fbc0c2-9813-c1e7-e2c8-b742e7a8038d.png)
AWSコンソールのIAMより該当ユーザを選択し、「id_rsa.pub」ファイルの中身をIAMユーザへ登録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/88e19b0c-9889-46b1-7466-e1e477197d45.png)

```bash
sh-4.2$ vi ~/.ssh/config
## 上記configファイルに以下を入力
Host git-codecommit.*.amazonaws.com
User <SSHIDキー>
IdentityFile ~/.ssh/id_rsa
```
表示されるSSHキーIDをコピーして~/.ssh/configファイルを作成

```bash
sh-4.2$ git clone ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test
```
上記コマンドでリポジトリとの接続を確認
※上記コマンドの接続先(ssh以下)はCodecommitのコンソールから取得し、書き換え

### ③https(認証情報ヘルパー)
AWS IAMのアクセス/シークレットキーを接続元クライアントに付与し、CodeCommitに接続する方法
※認証情報ヘルパーとはgitの認証情報ではなく、フェデレーティッドアクセス(他のサービスユーザ認証)、ID プロバイダー、または一時的な認証情報を使用して CodeCommit に接続するためのサポートサポートツール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/fbe7e9ac-2b81-a1e4-1bc8-841dcce25b54.png)

【メリット】
　・IAMユーザのアクセスキー/シークレットキーのみでCodeCommitへ接続が可能
【デメリット】
　・CodeCommit用の認証情報ヘルパーがGitツールのバージョン/Gitの認証情報ヘルパーと競合してしまうことがある

#### 接続手順
※前提として以下手順で使用するIAMユーザには「AWSCodeCommitFullAccess」の権限が付与されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/31507c21-c92c-2e8b-f415-60db4cb0b1e6.png)
AWSコンソールのIAMより該当ユーザを選択し、「アクセスキー」から「アクセスキーの作成」を押下する。
※アクセスキー/シークレットアクセスキーがダウンロードできるので控えておくこと
※IAMユーザ作成時に生成されるキーも利用可能
```bash
sh-4.2$ aws --profile codecommit configure
AWS Access Key ID [None]: IAMユーザのアクセスキー
AWS Secret Access Key [None]: IAMユーザのシークレットアクセスキー
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
上記コマンドよりAWS CLIに**codecommit**という名前のプロファイルを作成し、
CodeCommit用アクセスキー/シークレットキーを設定

```bash
sh-4.2$ git config --global credential.helper '!aws --profile codecommit codecommit credential-helper $@'
sh-4.2$ git config --global credential.UseHttpPath true
sh-4.2$ git config --global -l
credential.helper=!aws --profile codecommit codecommit credential-helper $@
credential.usehttppath=true
```
上記コマンドにて認証ヘルパーとしてAWSコマンドを指定。
「credential.helper」を使用することで、クライアントをセットアップするパラメーターとして使用することができ、
Git が CodeCommitリポジトリとやり取りするためにAWSで認証する必要があるときはIAM ユーザー認証情報または Amazon EC2 インスタンス ロールを使用できるようになる。

```bash
sh-4.2$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test
```
上記コマンドでリポジトリとの接続を確認
※上記コマンドの接続先(https以下)はCodecommitのコンソールから取得し、書き換え



### ④https(GRC)：★AWS推奨★
GRCはgit-remote-codecommitの略語であり、
IAMユーザー認証情報を利用しCodeCommitに接続できるpipのライブラリ上に存在するAWS社のパッケージソフト。
https(認証情報ヘルパー)との違いとして、CodeCommit用の認証情報ヘルパーはGitツールのバージョン/Gitの認証情報ヘルパーと競合してしまうことがあるが、GRCの場合は多くのGitのバージョンやGit自体の認証情報ヘルパーとの互換性をもっているため、その問題を低減できる可能性が高いという点がある。
上記より最も信頼性の高い本接続方法を推奨としていると考える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/23e7b99f-9119-be76-e74e-94be67aa4640.png)

【メリット】
　・IAMユーザのアクセスキー/シークレットキーのみでCodeCommitへ接続が可能

【デメリット】
　・「git-remote-codecommit」のインストールが必要であり、
　　　そのためにPython (バージョン 3 以降) とそのパッケージマネージャーpipが必要になる

#### 接続手順
※前提として以下手順で使用するIAMユーザには「AWSCodeCommitFullAccess」の権限が付与されています。

```bash
sh-4.2$ python3 -V
Python 3.7.10
sh-4.2$ pip3 -V
pip 20.2.2 from /usr/lib/python3.7/site-packages/pip (python 3.7)
```
「python3」と「pip3」が導入されていることを確認
　※導入手順は省略します。

```bash
sh-4.2$ aws configure
AWS Access Key ID [None]: IAMユーザのアクセスキー
AWS Secret Access Key [None]: IAMユーザのシークレットアクセスキー
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
上記コマンドよりAWS CLIにCodeCommit用アクセスキー/シークレットキーを設定

```bash
sh-4.2$ sudo pip3 install git-remote-codecommit
```
上記コマンドよりGRCをインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/e1c025b9-b8a1-c911-237c-36b40178c7ab.png)
CodeCommitコンソール上より「HTTPSのクローン(GRC)」を選択し、URLを控える

```bash
sh-4.2$ git clone codecommit::ap-northeast-1://test
Cloning into 'test'...
remote: Counting objects: 3, done.
Unpacking objects: 100% (3/3), 187 bytes | 187.00 KiB/s, done.
```
上記コマンドでリポジトリとの接続を確認

#### 以下エラーに直面し接続に失敗場合
```bash
sh-4.2$ git clone codecommit::ap-northeast-1://test
Cloning into 'test'...
git: 'remote-codecommit' is not a git command. See 'git --help'.
```

以下コマンドでgit-remote-codecommitのPATHを確認
```bash
which git-remote-codecommit
```
PATHが通っているか確認
```bash
which git-remote-codecommit
```

PATHが通ってない場合は、一度アンインストール
```bash
sh-4.2$ pip3 uninstall git-remote-codecommit
```

管理者権限と「force」オプションを付与して再度インストール
```bash
sh-4.2$ sudo pip3 install git-remote-codecommit --force
```

再度PATHが通っているか確認。
※通っていればcodecommitと接続が可能になる。
```bash
sh-4.2$ which git-remote-codecommit
/usr/local/bin/git-remote-codecommit
```

## 終わりに
複数存在しているCodeCommitへの接続方法をまとめてみました。
接続方法に悩んでいる方の参考になれば幸いです。