CodeCommitエンドポイントでPrivateサブネットからgit cloneしてみる

# はじめに
- 今回は
    1. Privateサブネット内にある
    1. EC2インスタンスから
    1. VPCエンドポイントを使って
    1. AWS CodeCommitにアクセスし
    1. リソースを`git clone`
- してみます


# 構造図
- Publicサブネット × 1
    - SSHアクセス用の踏み台インスタンス　× 1
- Privateサブネット × 2
    - VPC（CodeCommit）エンドポイントを置くサブネット × 1
    - 　　　      　　　　 〃　　　　　 　　　　   を置かないサブネット × 1
        - `git clone`をテストする用インスタンス × 1 ずつ
  
![codecommit_endpoint-Page-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779593/d324e5a3-ee54-c40a-c15b-14180e80e380.png)



# つまづきそうなところ
- セキュリティグループの設定
    - インバウンド、アウトバウンドの設定を理解していないと沼る危険性があります
        - 筆者は時間を溶かしました...
    - 本記事では設定の目的を簡潔に添えているため、理解されていない方は一読することを推奨します
        - また、間違いがありましたらご指摘ください
- IAMユーザ認証の作成
    - `git clone`する際には「ユーザ名」と「PW」を求められます
    - IAMでユーザの認証情報を作成する必要があります
    - [ドキュメント（ステップ3）](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-gc.html)を参考にご作成ください

# 手順

## 1. ネットワークを構築する
- VPC、Publicサブネット、Privateサブネットを作ります
    - 作成手順は過去記事: [「Amazon VPCでシンプルなネットワークを構築する」](https://qiita.com/TaishiOikawa/items/6201eceaa7a4e815b175)を参照
- VPCの「DNSホスト名」「DNS 解決」はどちらも**有効**

## 2. EC2インスタンスを生成する
- 作成手順は過去記事: [「Amazon EC2を起動し、MacのターミナルからSSH接続してみる」](https://qiita.com/TaishiOikawa/items/2af53935e5f741f05bbb)を参照
- セキュリティグループ以外は特筆すべき設定はなし

### セキュリティグループ
- CodeCommit-step-sg(踏み台サーバ用）
    - インバウンド: SSH
        - ローカルPCからのSSHアクセスを許可
    - アウトバウンド: SSH
        - Privateサブネット内のサーバへのSSHアクセスを許可
    ![スクリーンショット 2021-01-11 20.20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779593/869f98b1-8fb5-0c35-a1f6-c2b92f9c2438.png)



- CodeCommit-clong-sg(git cloneテストサーバ用）
    - インバウンド: SSH
        - 踏み台サーバからのSSHアクセスを許可するため
    - アウトバウンド: HTTPS
        - HTTPSによる`git clone`を許可するため（SSHによる`git clone`がしたい場合はSSHを許可）
    ![スクリーンショット 2021-01-11 20.25.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779593/a9bf6b18-5dba-fac8-8616-7564b25a2fc8.png)

## 3. VPCエンドポイントを作成する
- サービスカテゴリ: AWSサービス
- サービス名: com.amazonaws.ap-northeast-1.git-codecommit(`git`で検索すれば出る)
    ![スクリーンショット 2021-01-11 20.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779593/732c6014-f0e9-0d5a-1063-9fc0a2409c91.png)


- VPC: 10.1.0.0/16
- サブネット: 10.1.2.0/24
- Enable DNS name: **有効にする**

### セキュリティグループ
- インバウンド: HTTPS
    - Privateサブネット内のサーバからHTTPSアクセスを許可するため 
- アウトバウンド: HTTPS
    - CodeCommitへの`git clone`を許可するため
        ![スクリーンショット 2021-01-11 20.16.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779593/234ec52f-6ed4-8eaa-f834-38e782a02a9b.png)

## 4. EC2インスタンスにgitをインストールする
- Privateサブネットのインスタンスに入れていく
- Amazon Linuxn 2にはExtras Library と呼ばれるパッケージ群が存在
    - インターネットに繋がなくてもgit等をインストール可能
    - 中身は`amazon-linux-extras`で確認可能（アウトバウンドにHTTPを追加する必要あり）

- いざgitを入れていく
    - `sudo yum update -y`
        - 成功
    - `sugo yum install git -y`
        - **応答がない...**
- amazon-linux-extrasから`yum install`するためにはS3エンドポイントを設定する必要がある
    - パッケージはS3に保存されているため
    
### S3エンドポイントを配置する
- サービスカテゴリ: AWSサービス
- サービス名: com.amazonaws.ap-northeast-1.s3
- ルートテーブルの設定: **Privateサブネットのルートテーブル**

### リベンジ
- `sudo yum install git -y`
    - 無事にインストール完了


## 5. CodeCommitにリポジトリを作る
- リポジトリを作成
    - リポジトリ名、説明: endpoint-test
    - ファイルの作成
        - ファイル名: endpoint-test.text
        - 内容: endpoint-test


## 6. IAMで「AWS CodeCommit の HTTPS Git 認証情報」を生成
- IAM
- ユーザー
    - リポジトリを作成したユーザを選択
    - 「認証情報」タブ
        - 「AWS CodeCommit の HTTPS Git 認証情報」で「認証情報を生成」
        - これがgit cloneの際に要求される「Username」と「Password」になる
            - 保存しておく（取り扱いには注意する）

## 7. `git clone`（HTTPS）
- [CodeCommit]
    - リポジトリ →　URLのクローン（HTTPS）
- [ローカルのターミナル]
    - Privateサブネットのインスタンスにsshアクセス
    - 踏み台サーバを経由
- [PrivateサブネットのEC2サーバ内]
    - `git clone <CodeCommitリポジトリのHTTPS URL>`
        - Username, Password: 認証情報を参照して入力
    - codecommit-test1、codecommit-test2のどちらも`git clone`可能
- 完了


# おわりに
- Privateサブネット内のEC2インスタンスからVPCエンドポイントを利用して`git clone`することができました
- 理解が浅く不安な点もあるので、ご指摘等ございましたらどしどしコメントください

### 参考資料
- Git 認証情報を使用した HTTPS ユーザーのセットアップ
    - https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-gc.html
- インターフェイス VPC エンドポイント (AWS PrivateLink)
    - https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpce-interface.html
- Codecommit の VPC エンドポイント対応を確認する
    - https://mkr-note.net/2019/03/09/codecommit-endpoint/