CodeCommit で利用できる3種類のアクセス方法ハンズオン

## はじめに
AWSが提供するコードリポジトリサービスのCodeCommitを利用するための、アクセス方法までをメモ。
つくったはいいけど、どうやって接続したらいいの？と毎回ググる自分のために。

ちなみに最近ググったのは下記ブログを書いた際
[CloudFormationでCodeCommit 作成時にリポジトリを反映する構築ハンズオン](https://cloud5.jp/cfn-by-codecommit-creating-repository/)

------------

## CodeCommitのアクセス方法3種類の違い（ざっくり）
|アクセス方法|説明|
|:-:|:-|
|HTTPS|IAM ユーザで設定する__HTTPS Git認証情報__を利用　|
|SSH|IAM ユーザに__公開鍵を登録__して利用 |
|HTTPS(GRC)|IAM ユーザ の__権限(アクセスキー/シークレットアクセスキー)__で利用。※ GRC は git-remote-codecommit の略語。|

<br />

------------

## ハンズオン
### 前提条件
|CodeCommitリポジトリ名|AWS Region|
|:-:|:-|
|【MY-REPOSITORY】|ap-northeast-1　|

※リポジトリ名は利用者によって都度変更ください
<br />

### 1.HTTPS
#### 1.1.IAMユーザの認証情報から`AWS CodeCommit の HTTPS Git 認証情報`でID・Password発行
・マネジメントコンソールから、`IAM`→左ペイン：`ユーザー`→タブ：`認証情報`→`AWS CodeCommit の HTTPS Git 認証情報`→`認証情報を生成`押下してID・Passwordを発行する

![](https://cloud5.jp/wp-content/uploads/2023/01/スクリーンショット-2023-01-08-9.30.12-640x118.png)
<br />

#### 1.2.ターミナル画面でリポジトリをCloneする

```yaml
% git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/【MY-REPOSITORY】
Cloning into '【MY-REPOSITORY】'...

The config profile (CodeCommitProfile) could not be found
Username for 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/【MY-REPOSITORY】':  #1.1で取得した【ユーザー名】
Password for 'https://【ユーザー名】@git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/【MY-REPOSITORY】':  #1.1で取得した【パスワード】
remote: Counting objects: 6, done.
Unpacking objects: 100% (6/6), 1.36 KiB | 154.00 KiB/s, done.
```

※上記設定時 clone をした際に `403`エラーが自分の環境では確認出来ました。
[認証情報ヘルパーと への HTTPS 接続のトラブルシューティングAWS CodeCommit](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/troubleshooting-ch.html#troubleshooting-macoshttps)の手順に従い問題を解決しました。

### 2.SSH
#### 2.1.自身のPCでパブリックキーとプライベートキーをセットアップする
|プライベートキーファイル|パブリックキーファイル|
|:-:|:-:|
|codecommit_rsa |codecommit_rsa.pub　|

※設定時にパスワードの設定が求められます（2.5でリポジトリを取得する際に必要となります）
※任意で名前を変えられます

<br />

```yaml
% ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/home/user-name/.ssh/id_rsa): 【codecommit_rsa】

Enter passphrase (empty for no passphrase): 【パスワード入力】
Enter same passphrase again: 【同：パスワード入力】

Your identification has been saved in /home/user-name/.ssh/【codecommit_rsa】.
Your public key has been saved in /home/user-name/.ssh/【codecommit_rsa.pub】.
The key fingerprint is:
45:63:d5:99:0e:99:73:50:5e:d4:b3:2d:86:4a:2c:14 user-name@client-name
The key's randomart image is:
+--[ RSA 2048]----+
|        E.+.o*.++|
|        .o .=.=o.|
|       . ..  *. +|
|        ..o . +..|
|        So . . . |
|          .      |
|                 |
|                 |
|                 |
+-----------------+
```
#### 2.2.コマンドを実行して、パブリックキーファイルの値を表示する
`% cat ~/.ssh/codecommit_rsa.pub`
上記コマンドを実行して、下記のような乱数を取得する（AWSユーザガイドより抜粋）
![](https://cloud5.jp/wp-content/uploads/2023/01/スクリーンショット-2023-01-08-10.33.18-640x104.png)


#### 2.3. IAMユーザの認証情報から`AWS CodeCommit の SSH キー`でパブリックキーファイルの値を登録
マネジメントコンソールから、`IAM`→左ペイン：`ユーザー`→タブ：`認証情報`→`AWS CodeCommit の SSH キー`→`SSHパブリックキーのアップロード`を押下して、2.2で取得した値を登録（コピペして貼り付ける）する
<br />
下記画像のようにSSH KEY ID 情報が登録される
![](https://cloud5.jp/wp-content/uploads/2023/01/スクリーンショット-2023-01-08-9.48.07-640x117.png)
<br />
#### 2.4. `.ssh/config`ファイルを編集して、2.3で表示された`SSH キー ID`を登録する
自身のターミナル画面で`% vi .ssh/config`を押下して、configファイルに設定を登録する

```yaml
Host git-codecommit.*.amazonaws.com
  User 【SSHキーID】
  IdentityFile ~/.ssh/codecommit_rsa
```
上記設定後 `:x` で `vi` を保存して閉じる。
ターミナルで下記コマンドを実行して、設定ファイルへのアクセス権限を変更する
`% chmod 600 config`
<br />
#### 2.5.ターミナル画面でリポジトリをCloneする
2.1.で自身で設定したパスワードを入力を求められる部部があります
```yaml
% git clone ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/【MY-REPOSITORY】
Cloning into '【MY-REPOSITORY】'...
Enter passphrase for key '/Users/inamurateppei/.ssh/codecommit':【パスワード入力】 
remote: Counting objects: 6, done.
Receiving objects: 100% (6/6), 1.38 KiB | 471.00 KiB/s, done.
```
<br />

### 3.HTTPS(GRC)
#### 3.1.`git-remote-codecommit`をインストールする
マネジメントコンソールから、`Codecommit`→左ペイン：`リポジトリ`→任意：`設定したいリポジトリ選択`→上部ボタン：`URLのクローン`→`接続のステップ`を押下→タブ：`HTTPS(GRC)`を選択
<br />
`pip install git-remote-codecommit`コマンドを実行してgit-remote-codecommit をインストールする

#### 3.2.AWSプロファイルの設定
AWS CLIのインストールする
参照：[AWS CLI の最新バージョンをインストールまたは更新します。](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)

##### 3.2.1.`.aws/config`の設定
```yaml
% vi .aws/config

[profile myaccount]
region = ap-northeast-1
output = json
```
上記設定後、`:x`で保存して閉じる
<br />
##### 3.2.2.`.aws/credentials`の設定
```yaml
[myaccount]
aws_access_key_id = 【自身に払い出されているアクセスキー】
aws_secret_access_key = 【自身に払い出されているシークレットアクセスキー】
```
#### 3.3.ターミナル画面でリポジトリをCloneする
`git clone codecommit::ap-northeast-1://myaccount@【MY-REPOSITORY】`コマンドの【】前にある部分(myaccount)部分が、3.2.で設定した自身のAWSプロファイル情報にあたります

```yaml
% git clone codecommit::ap-northeast-1://myaccount@【MY-REPOSITORY】
Cloning into '【MY-REPOSITORY】'...
remote: Counting objects: 6, done.
Unpacking objects: 100% (6/6), 1.36 KiB | 199.00 KiB/s, done.
```

------------

## さいごに
毎回SSH接続していましたが、改めて3種類全てを実施してみると、アクセスキー/シークレットキーが払い出されている環境であれば、`HTTPS(GRC)`が一番簡単ですね。
このメモを覗き見しながら、それぞれ条件が異なる案件であってもCodeCommitを利用する際の設定はチョットワカル感だしていけるかと思います。

------------

## 参考URL
参考:[AWS CodeCommit の使い方](URLhttps://qiita.com/Catalyst3104/items/3b2cafa838e0902bc5fe)
参考:[git-remote-codecommit(GRC)を使ってCodeCommitのリポジトリに接続してみる](https://dev.classmethod.jp/articles/git-remote-codecommit-setting/)