httpsとsshの両方でAWS CodeCommitを導入してみた(httpsでエラーが出た時の対処法も載せた)

AWS CodeCommitをローカル環境のUbuntu14.04から導入したときのメモです。

SSHでgit cloneする場合は導入がスムーズだったのですが、httpsでgit cloneした場合はGitをOpenSSLでコンパイルする作業があり、思った以上に工数があったので、それの解決方法も追記しました。


#IAMグループの作成
1. IAMで"グループ"の項目から新しいグループの作成"を選択する。
2. 手順1でグループ名の選択でグループ名(例. codecommit-test)を入力する。
3. 手順2で"ポリシーのアタッチ"でAWSCodeCommitPowerUserを選択する。
4. 手順3で設定の確認をしたらグループの作成を選択する。

#IAMユーザーの作成
1. "ユーザー"の項目から"新規ユーザーの作成"を選択する。
2. ユーザー名を入力して、発行される認証情報(以下のようなアクセスキーIDとシークレットアクセスキーの情報)のcsvファイルをダウンロードして閉じるを選択する。 ※再度ダウンロードできなくなるので注意(ダウンロードしないで閉じようとすると、その旨が表示されて本当に閉じていいか確認画面が出てくる)

```
 test-user
アクセスキー ID: XXXXXXXXXXXXXXXXXXXX
シークレットアクセスキー: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

#作成したIAMユーザーをグループにアタッチ
1. 作成したユーザーを選択して、"グループ"から"グループにユーザーを追加"を選択して先ほど作成した湯ループを選択してアタッチする。


#公開鍵のアップロード
1. ターミナルから以下のコマンドを実行

```bash
$ ssh-keygen
```

2. IAMユーザーの"認証情報"タブ中の"AWS CodeCommit の SSH キー"の項目から"SSH 公開キーのアップロード"を選択する。
3. ```ssh-keygen```で作成した公開鍵の情報(.pubの識別子の中身)をコピペする。

#SSHの設定

~/.ssh/config中に以下の内容を追記する

```bash
Host '<CodeCommitのエンドポイントのホスト名>'
    User '<SSH ID>'
    IdentityFile '<ssh-keyで鍵を生成するときに指定した鍵のパス>'
```  

HostはCodeCommitの"Code"項目中の"Clone URL"などから確認できる。git-codecommit.<リージョン名>.amazonaws.com(2016年6月現在ではリージョン名はus-east-1のみ)となる。

UserはIAMユーザーの"認証情報"タブ中の"AWS CodeCommit の SSH キー"の項目のSSH IDとなる。

#設定ができたかの確認

```bash
$ ssh git-codecommit.us-east-1.amazonaws.com
Enter passphrase for key '/home/test-user/awstest/id_rsa_codecommit_test': 
You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit. Interactive shells are not supported.Connection to git-codecommit.us-east-1.amazonaws.com closed by remote host.
Connection to git-codecommit.us-east-1.amazonaws.com closed.
```
以上で通常通りにgitを使えるようになる。


#CodeCommitでgit cloneしてみる

##sshでgitを操作する場合

```bash
$ git clone ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/test-codecommit test-repo
```

鍵のフレーズが問われるので、```ssh-keygen```で生成したときに設定したパスワードを入力する。



##httpsでgitを操作する場合

httpsで操作する場合は以下のようなエラーが出てgit cloneなどの操作ができなかったので対処法について書きます。

```bash
$ git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/test-codecommit
Cloning into 'test-codecommit'...
fatal: unable to access 'https://git-codecommit.us-east-1.amazonaws.com/v1/repos/test-codecommit/': gnutls_handshake() failed: Illegal parameter
```

何もしない状態でUbuntu14.04からgit cloneをするとエラーになる。
エラーの内容としてはGnuTLSでエラーが出ます。
これに対しては、GitをOpenSSLでコンパイルする必要がある。

##GitをOpenSSLでコンパイル

```bash
$ sudo apt-get update
$ sudo apt-get install build-essential fakeroot 
$ dpkg-dev libcurl4-openssl-dev
$ sudo apt-get build-dep git
$ mkdir ~/git-openssl
$ cd ~/git-openssl

# gitのソースコードをダウンロード
$ apt-get source git
```


```bash
$ gpg --list-keys
/home/test-user/.gnupg/pubring.gpg
------------------------------
pub   4096R/AA02C70A 2011-09-01
uid                  Tyler Hicks <tyhicks@tyhicks.net>
uid                  Tyler Hicks <tyhicks@ou.edu>
uid                  Tyler Hicks <tyhicks@gmail.com>
uid                  Tyler Hicks <tyhicks@kernel.org>
uid                  Tyler Hicks <tyhicks@ubuntu.com>
uid                  Tyler Hicks <tyhicks@canonical.com>
uid                  Tyler Hicks <tyler.hicks@ubuntu.com>
uid                  Tyler Hicks <tyler.hicks@canonical.com>
sub   4096R/CB16CDD4 2011-09-01

#$ sudo gpg --armor --export AA02C70A | sudo apt-key add -
#gpg: 警告: 構成ファイル「/home/test-user/.gnupg/gpg.conf」の安全でない所有者
#OK

$ gpg --no-default-keyring -a --export AA02C70A | gpg --no-default-keyring --keyring ~/.gnupg/trustedkeys.gpg --import -
gpg: 鍵輪「/home/test-user/.gnupg/trustedkeys.gpg」ができました
gpg: 鍵AA02C70A: 公開鍵“Tyler Hicks <tyhicks@tyhicks.net>”を読み込みました
gpg: 処理数の合計: 1
gpg:               読込み: 1  (RSA: 1)
gpg: 絶対的に信用する鍵が見つかりません


$ dpkg-source -x git_1.9.1-1ubuntu0.3.dsc
dpkg-source: info: extracting git in git-1.9.1
dpkg-source: info: unpacking git_1.9.1.orig.tar.xz
dpkg-source: info: unpacking git_1.9.1-1ubuntu0.3.debian.tar.gz
```

次に重要な作業があり、```gksu```を使うなどして```debian/control```中の```libcurl4-gnutls-dev```を```libcurl4-openssl-dev```に書き替える。

```bash
$ gksu vim debian/control
```

パッケージをビルドする。しばらく時間がかかる。


```bash
$ sudo apt-get install libcurl4-openssl-dev
$ sudo dpkg-buildpackage -rfakeroot -p -uc -us
```

ビルドしたパッケージをインストールする。

```bash
$ cd ../
$ sudo dpkg -i git_1.9.1-1ubuntu0.3_amd64.deb
```

##git credential helperの設定

```bash
$ git config --global credential.helper '!aws --region us-east-1 codecommit credential-helper $@'
$ git config --global credential.UseHttpPath true
```

すると、```~/.gitconfig```に以下の内容が追記される。


```
[credential]
        helper = !aws --region us-east-1 codecommit credential-helper $@
        UseHttpPath = true
```

以上でgitが使えるようになる。



#(追記) AWS CodeCommit CLIコマンド　一覧
CodeCommitには以下の14種類のコマンドが用意されている。

```bash
batch-get-repositories
create-branch
create-repository
delete-repository
get-branch
get-repository
get-repository-triggers
list-branches
list-repositories
put-repository-triggers
test-repository-triggers
update-default-branch
update-repository-description
update-repository-name
```

例えば、リモートのブランチの一覧を表示させたいときは以下のように入力する。

```bash
aws codecommit list-branches --repository-name test-codecommit --region us-east-1
```

##参考
- gnutls_handshake() failed: Illegal parameterについて
http://askubuntu.com/questions/186847/error-gnutls-handshake-failed-when-connecting-to-https-servers
- gpg: 署名を検査できません: 公開鍵が見つかりません
http://d.hatena.ne.jp/labunix/20130528
- Setup Steps for HTTPS Connections to AWS CodeCommit Repositories on Linux, OS X, or Unix
http://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-https-unixes.html#setting-up-https-unixes-credential-helper
- AWS CodeCommit Command Line Reference
http://docs.aws.amazon.com/codecommit/latest/userguide/cmd-ref.html