AWS CLIからAWS CodeCommitのSSH設定&HTTPS認証ヘルパー設定

業務で使うためのaws-cliコマンドのメモ

## CodeCommitのリポジトリアクセス方法？

記のように３種類の方法がある

| No |　プロトコル　|　説明　|
|:---:|---|---|
| 1 |　SSH　|　暗号キーペアによる認証　|
| 2 |　HTTPS　|　aws-cliのIAMプロファイルによるIDフェデレーション(HTTPS認証ヘルパー)　|
| 3 |　HTTPS　|　マネコンからCodeCommit用のID,PWを生成する方法　|

1,2 の方法について記載します。

## 前提条件

* aws-cliが[インストール](https://qiita.com/yuyj109/items/3163a84480da4c8f402c)されている 
* IAMに適切な管理ポリシーが設定されている


## AWS CodeCommit用の管理ポリシー

| 管理ポリシー | 説明 | 
|---|---|
| AWSCodeCommitFullAccess | CodeCommitのすべての制御 |
| AWSCodeCommitPowerUser | リポジトリの削除ができない |
| AWSCodeCommitReadOnly | 読み取り専用 |
| AdministratorAccess | なんでもできる管理者ポリシー(非推薦) |

## CodeCommit用のSSH認証ファイル作成

* 変数は適切に変更して使ってください


```bash:作成
IAM_USER=codecommit-handson
SSH_NAME=~/.ssh/${IAM_USER}-$(date +%Y%m%d)
ssh-keygen -t rsa -b 2048 -f ${SSH_NAME} -N '' -C ''
```

```bash:作成結果
Generating public/private rsa key pair.
Your identification has been saved in /Users/yu/.ssh/codecommit-handson-20180102.
Your public key has been saved in /Users/yu/.ssh/codecommit-handson-20180102.pub.
The key fingerprint is:
SHA256:Ncp+5fEJ/l0BLz+AfeKuPwTM0TvYxyz123456789N/g 
The key's randomart image is:
+---[RSA 2048]----+
|            .    |
|           + o o |
|          = X.+.+|
|       . o BoBo=o|
|        S  .*=+++|
|       .   +.=*.+|
|        . . +.+oo|
|         .  .+ o=|
|           .oo+E+|
+----[SHA256]-----+
```


```bash:確認
ssh-keygen -l -f ${SSH_NAME}
```

```bash:確認結果
2048 SHA256:Ncp+5fEJ/l0BLz+AfeKuPwTM0TvYxyz123456789N/g /Users/yu/.ssh/codecommit--handson-20180102.pub (RSA)
```


## CodeCommit用SSH設定

SSHの認証Keyによってアクセスする場合


### IAMユーザにアップロード

```bash:アップロード
SSH_PUBKEY=$(cat ${SSH_NAME}.pub)
SSH_PUBKEY_ID=$(aws iam upload-ssh-public-key \
--user-name ${IAM_USER} \
--ssh-public-key-body "${SSH_PUBKEY}" \
--output text \
--query SSHPublicKey.SSHPublicKeyId) && echo ${SSH_PUBKEY_ID}
```

```bash:結果_例)
APKAI3YRE4AABBCCDDEE
```



### 確認およびconfig用テキスト作成


```bash:確認
cat << ETX
Host git-codecommit.*.amazonaws.com
  User ${SSH_PUBKEY_ID}
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
  IdentityFile ${SSH_NAME} 
ETX
```

結果を `~/.ssh/config`に追加

```bash:結果_例)
Host git-codecommit.*.amazonaws.com
  User APKAI3YRE4AABBCCDDEE
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
  IdentityFile ~/.ssh/codecommit-handson-20180102
```


### 接続確認

```bash:確認
ssh git-codecommit.ap-northeast-1.amazonaws.com
```

```bash:結果
Warning: Permanently added 'git-codecommit.ap-northeast-1.amazonaws.com,52.119.218.16' (RSA) to the list of known hosts.
You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit. Interactive shells are not supported.Connection to git-codecommit.ap-northeast-1.amazonaws.com closed by remote host.
Connection to git-codecommit.ap-northeast-1.amazonaws.com closed.
```

## CodeCommit用のHTTPS認証ヘルパー設定

gitconfigの設定

```bash:gitconfig設定
git config --global credential.helper '!aws --profile codecommit-handson codecommit credential-helper $@'
git config --global credential.UseHttpPath true
```

`~/.gitconfig`に下記の情報が追加される

```bash:~/.gitconfig
[credential]
	helper = !aws --profile codecommit-handson codecommit credential-helper $@
	UseHttpPath = true
```

## テストレポジトリを作成しcloneしてみる

```bash:作成
REPO_NAME=${IAM_USER}-$(date +%Y%m%d%H%M%S)
aws codecommit create-repository --repository-name ${REPO_NAME} \
--repository-description "codecommit handson 2018"
```

```bash:結果
{
    "repositoryMetadata": {
        "repositoryName": "codecommit-handson-20180103140202", 
        "cloneUrlSsh": "ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/codecommit-handson-20180103140202", 
        "lastModifiedDate": 1514955723.245, 
        "repositoryDescription": "codecommit handson 2018", 
        "cloneUrlHttp": "https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/codecommit-handson-20180103140202", 
        "creationDate": 1514955723.245, 
        "repositoryId": "8842d149-b58f-4531-9081-020f07d9fc5c", 
        "Arn": "arn:aws:codecommit:ap-northeast-1:674xxxxxxxxx:codecommit-handson-20180103140202", 
        "accountId": "674xxxxxxxxx"
    }
}
```

結果のURL`cloneUrlSsh`はSSH情報、`cloneUrlHttp`はHTTPSから接続できます。

```bash:例-sshの場合
git clone ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/codecommit-handson-20180103140202
```
```bash:例-httpsの場合
git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/codecommit-handson-20180103140202
```

## リポジトリの削除

```bash:削除
aws codecommit delete-repository \
--repository-name "codecommit-handson-20180103140202"
```

```bash:結果
{
    "repositoryId": "8842d149-b58f-4531-9081-020f07d9fc5c"
}
```



以上。