GCPのAlways FreeでVaultをHTTPSで起動するまで

# やりたいこと
クレデンシャル情報のセキュアな管理がしたい。
[HashiCorp Vault](https://www.vaultproject.io/)を使ってやってみたい。
とりあえずGCPで無料でやりたい。

# 事前準備
HTTPS化するためにドメインを1つ取得しておいてください。

# GCP
インフラの作成を実施してきます。

## GCE
[GCE](https://cloud.google.com/compute?hl=ja)とは、GCPのコンピューティングサービスです。AWSで言うところのEC2。
Always Freeのf1.micro in オレゴンリージョンで作成します。
ストレージも無料枠の30GBで作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/fc608da7-b705-f4f7-ef40-65cf22f3d4c2.png)

VaultのBackend StorageとしてGCSを利用するため、下記で権限を付与しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/bc764f4f-26bf-b88b-84a9-b8d5466931aa.png)


## GCS
Vaultのbackend strageとしてGCSを利用するため、事前にバケットを作成しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/c2b6920a-b2e9-6cc8-912f-009aa1d5058c.png)

# Docker
環境構築はDockerコンテナで行っていきます。

```bash:Dockerのインストール
curl -fsSL https://get.docker.com/ | sh
# sudoersに所属している必要があります
```

```bash:Dockerグループに追加
sudo usermod -aG docker $USER
# 非ルートユーザでdockerが実行できるようになります
```

```bash:DockerComposeのインストール
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
```



ここまできたら一度接続しなおしてください。


# コンテナの構築
マシンが作成されたら、本命のVaultを構築します。HTTPS対応[^1]するために、今回はCaddyを利用します。

[^1]: [Feature Request: Support Let's Encrypt secret engine #4950](https://github.com/hashicorp/vault/issues/4950) このissueがMergeされたらいらなくなるかもね！


## DNS登録
Caddyで適切にLet's Encryptによる証明書発行をするために、事前にGCEのパブリックIPアドレスを、自分が所有するドメインのA/AAAAレコードに登録する必要があります。

ここは省略します。適宜、Route53やお名前ドットコムなどで設定してください。

## VaultとCaddy
下記の定義で、起動しました。

```:ディレクトリ構成
.
├── caddy
│   └── Caddyfile
├── docker-compose.yml
└── vault
    └── config
        └── vault.json
```

```yml:docker-compose.yml
version: "3"
volumes:
  vault-data:
  caddy-data:
services:
  vault:
    image: vault:1.4.3
    container_name: vault
    restart: unless-stopped
    volumes:
      - ./vault/config:/vault/config
      - ./vault/policies:/vault/policies
      - vault-data:/vault/data
    expose:
      - 8200
    cap_add:
      - IPC_LOCK
    command: vault server -config=/vault/config/vault.json
  caddy:
    image: caddy:2.1.1-alpine
    container_name: caddy
    restart: unless-stopped
    volumes:
      - caddy-data:/data
      - ./caddy:/etc/caddy
    ports:
      - 80:80
      - 443:443
    links:
      - vault
```

```sh:Caddyfile
# 下記を自身のドメイン名を記載してください。
# vault.example.com

# Set this path to your site's directory.
root * /usr/share/caddy

# Enable the static file server.
file_server

# Another common task is to set up a reverse proxy:
# reverse_proxy localhost:8080
reverse_proxy vault:8200
```

```json:vault.json
{
  "ui": true,
  "listener": {
    "tcp": {
      "address": "0.0.0.0:8200",
      "tls_disable": "true"
    }
  },
  "backend": {
    "gcs": {
      "bucket": "ここにGCSのバケット名を記載"
    }
  },
  "default_lease_ttl": "168h",
  "max_lease_ttl": "0h",
  "api_addr": "http://0.0.0.0:8200"
}
```

ではコンテナを起動します。

```sh:コンテナ起動
docker-compose up -d
```

ブラウザからアクセスすると無事に画面が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/d2110989-5ab7-52b7-953d-85620b363f14.png)

マスターキーを生成してダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/d0362996-7380-3dfb-b085-b02958e61407.png)

マスターキーで無事に初回ログインできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/ee62516d-b859-7571-d0a1-97d875517bac.png)