Infisicalを使ってみる

# Infisicalを使ってみる

Twitterで唐突に流れてきた記事にふと目が止まりました。
[記事](https://twitter.com/k1_c_/status/1683825202076213249)

AWSを封じられた環境下ではいつも『ParameterStoreを使えたらなぁ。。。』と思う機会が多いので、
OSSで似たようなことができるのは個人的にかなり興味ありありです。

# Infisicalってなに？

公式より引用

* .envをやめて環境依存値を一元管理しよう
* Dockerとかkubernetesとかの定義ファイルのパラメータ参照にも利用できるよ（まじ？）
* OSSで便利なUI付きのSecretManagerだよ
* ありとあらゆるCI/CDと連携できるよ
* 色んな言語向けにSDKを提供しているよ（Node/Python/Java/etc...）

[公式サイト](https://infisical.com/)

# 期待すること

* VSCodeとかIntelliJで各環境定義(env/application.properties/overlays/etc...)を全部別タブで開いて横並びチェックする苦行からおさらばしたい。
* 全環境一括修正とかいうドキドキする作業からオサラバしたい
* 環境変数いじるたびにJenkins回したりRollingUpdateする手間からオサラバしたい
* 『都度リリース不要です』っていう名目で環境変数値をRDBに突っ込むのやめたい

# とりあえず使ってみた

## Infisical環境を構築

どうやらクラウド版かローカル版が選択できる模様。
ザ・ジャパニーズ企業の『そのサービス、信頼できるの？』おじさんに毒されて育っているため、ローカルに構築してみる。

[環境やクラウド版のプランについて](https://infisical.com/pricing)
プランは企業向けであれば監査対応用のものがあったりするので、後ほどじっくり読んでみたい。

[ローカル環境の構築](https://infisical.com/docs/self-hosting/overview)

### dockerで組んでみる

公式イメージが有るようなので手っ取り早く。

[手順](https://infisical.com/docs/self-hosting/deployment-options/standalone-infisical)

コマンド（イメージ取得）
```bash
docker pull infisical/infisical:latest
```

結果
```
PS C:\Windows\system32> docker pull infisical/infisical:latest
latest: Pulling from infisical/infisical
31e352740f53: Pull complete
a1e50b3961de: Pull complete
fdc5b5e5fbfe: Pull complete
55fd4a41ee80: Pull complete
2ccac1737de7: Pull complete
e678525739de: Pull complete
2a1a21494266: Pull complete
828ed0fcfde6: Pull complete
8b4b0183d798: Pull complete
50362577df05: Pull complete
Digest: sha256:83075283f048a06f455eba633e6eed70b2e84a4c1affe9aff8d3e8f3eb3399a1
Status: Downloaded newer image for infisical/infisical:latest
docker.io/infisical/infisical:latest
```

一瞬で入りました。軽いですね。

コマンド（起動）
```bash
docker run -p 80:80  \
-e ENCRYPTION_KEY=f40c9178624764ad85a6830b37ce239a \
-e JWT_SIGNUP_SECRET=38ea90fb7998b92176080f457d890392 \
-e JWT_REFRESH_SECRET=7764c7bbf3928ad501591a3e005eb364 \
-e JWT_AUTH_SECRET=5239fea3a4720c0e524f814a540e14a2 \
-e JWT_SERVICE_SECRET=8509fb8b90c9b53e9e61d1e35826dcb5  \
-e MONGO_URL="<>" \
infisical/infisical:latest
```

結果
```
2023-07-26T15:27:46: PM2 log: Launching in no daemon mode
2023-07-26T15:27:46: PM2 log: App [frontend:0] starting in -fork mode-
2023-07-26T15:27:46: PM2 log: App [backend:1] starting in -fork mode-
2023-07-26T15:27:46: PM2 log: App [backend:1] online
2023-07-26T15:27:46: PM2 log: App [frontend:0] online
Environment variable replacement is the same, skipping..
Environment variable replacement is the same, skipping..
Telemetry is enabled
2023-07-26T15:27:46: PM2 log: App [nginx:2] starting in -fork mode-
2023-07-26T15:27:46: PM2 log: App [nginx:2] online
> infisical-api@1.0.0 start
> node build/index.js
Listening on port 3000
2023-07-26T15:27:48.674Z [IFSC:database] error: Unable to establish Database connection due to the error.
MongoParseError: Invalid scheme, expected connection string to start with "mongodb://" or "mongodb+srv://"
2023-07-26T15:27:48.676Z [IFSC:database] error: Unable to establish Database connection due to the error.
MongoParseError: Invalid scheme, expected connection string to start with "mongodb://" or "mongodb+srv://"
(node:257) [MONGOOSE] DeprecationWarning: Mongoose: the `strictQuery` option will be switched back to `false` by default in Mongoose 7.
Use `mongoose.set('strictQuery', false);` if you want to prepare for this change. Or use `mongoose.set('strictQuery', true);` to suppres
s this warning.
(Use `node --trace-deprecation ...` to show where the warning was created)
(node:257) NOTE: We are formalizing our plans to enter AWS SDK for JavaScript (v2) into maintenance mode in 2023.
Please migrate your code to use AWS SDK for JavaScript (v3).
For more information, check the migration guide at https://a.co/7PzMCcy
/backend/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:175
          const err = new MongooseError(message);
                      ^
MongooseError: Operation `secrets.updateMany()` buffering timed out after 10000ms
    at Timeout.<anonymous> (/backend/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:175:23)
    at listOnTimeout (node:internal/timers:559:17)
    at processTimers (node:internal/timers:502:7)
npm notice
npm
notice New major version of npm available! 8.19.4 -> 9.8.1
```

nodeで動いているようですね。（そこじゃない）
どうやらMongoDBに繋がらない模様。

Dockerfileを覗いてみると、そもそもMongoDBが同梱されているのか怪しい。。。
流石駆け出しのOSS、クソゲー感がにじみ出てきましたね。
[DockerHub(Infisical)](https://hub.docker.com/layers/infisical/infisical/latest/images/sha256-348c00f3037c51ea2718ec8c0ff942a91bffc7523fe2b64e5fc9364437bf7688?context=explore)

### 気を取り直してdocker-composeで組んでみる

コマンド2本で終わると淡い願望を持ってしまった自分に反省しつつ、別の構築手順を試してみます。

[手順](https://infisical.com/docs/self-hosting/deployment-options/docker-compose)

コマンド（ファイル準備）
```bash
# Download env file template
wget -O .env https://raw.githubusercontent.com/Infisical/infisical/main/.env.example

# Download docker compose template
wget -O docker-compose.yml https://raw.githubusercontent.com/Infisical/infisical/main/docker-compose.yml

# Download nginx config
mkdir nginx && wget -O ./nginx/default.conf https://raw.githubusercontent.com/Infisical/infisical/main/nginx/default.dev.conf
```

例のごとくGitBashは標準でwgetが入っていないため、手動でファイル取得。

行追加(.env)
```
# add
HTTPS_ENABLED =false
```

> Infisical assumes that you have configured HTTPS. If you didn’t configure HTTPS, set HTTPS_ENABLED to false in the .env file to avoid frequent logouts.

怠惰な私はこの忠告に従い、HTTPのオプションを追加。
このOSSは.envを撲滅する意志を感じたのだが、チュートリアルで.envを編集させるあたり、結構好きです。

コマンド（起動）
```bash
# Start up services in detached mode
docker-compose -f docker-compose.yml up -d
```

結果
```
time="2023-07-27T00:55:53+09:00" level=warning msg="The \"TELEMETRY_ENABLED\" variable is not set. Defaulting to a blank string."
[+] Running 37/37
 ✔ mongo 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                          
 ✔ nginx 7 layers [⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                             
 ✔ frontend 13 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                
 ✔ backend 4 layers [⣿⣿⣿⣿]      0B/0B      Pulled                                               
[+] Running 6/6
 ✔ Network infisical_infisical    Created                                                                                          0.1s
 ✔ Volume "infisical_mongo-data"  Created                                                                                          0.0s
 ✔ Container infisical-mongo      Started                                                                                          2.0s
 ✔ Container infisical-backend    Started                                                                                          2.3s
 ✔ Container infisical-frontend   Started                                                                                          2.9s
 ✔ Container infisical-nginx      Started                                                                                          3.1s
```

初回でイメージ取得からなので、目測で5分程度かかりました。
深夜帯に通信品質をしれっと落とす楽天ひかりなので、他の方はそこまでかからないかもですが。。。
落としてきた量が前回の手順と全く違うので、そりゃ起動しないよね！って感じです。

![起動後のDockerの状態](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264383/29e13b73-7846-0483-10f6-d18e750cae69.png)

4つのコンテナが必要なんですね。
Infisical/InfisicalのImageは一体何だったんでしょうか。

## いざInfisicalにアクセス

![ログイン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264383/158d0dc1-d0b7-c477-526f-20b7836e9540.png)

> インストールが完了したら、最初のアカウントを作成する必要があります。デフォルトのアカウントは提供されません。

いきなりログイン画面！？と度肝を抜かれたのですが、クラウド版をそのままローカル環境向けに提供している感じですかね。
いざ！アカウント作成！

![Googleログイン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264383/0eb9c46d-94ad-ab13-e8f9-ef5e01ce78eb.png)

Backend->Googleのポートフォワードが設定されていない感じかな？？
とはいえローカル環境なのにGoogleログインさせるイメージはなかったので、気を取り直して他の方法で。。。

![サインアップ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264383/a7c4dcc7-545d-8bec-9b80-4ae9a81d209c.png)

メールアドレスを入れると、アカウント作成画面に。
これは期待できる流れ。

![アカウント回復](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264383/ec616d5c-58ee-cc46-ba33-32fef7828fea.png)

ロックはアカウント管理者が対応とかじゃないんですね。
権限管理が気になるところです。

![PDF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264383/83c79c7e-4dae-8bb2-0d0d-dc52834c45f3.png)

ダウンロードしたアカウント回復のPDFはこんな感じ。
BitLockerみたいな感じで思っておけば良さそうですね。

![トップページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264383/49b81d40-39a9-ebf6-31f2-3e6da5673397.png)

ログイン後の画面はこんな感じ。
Chromeが勝手に翻訳していますが、あまり違和感ない翻訳なので日本人にも使いやすそうですね。

![色々画面遷移すると](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264383/da665589-6212-8e77-e23a-1630b3b40d9e.png)

色々画面遷移するとクラッシュします。
かなり不安定ですね。ブラウザバックで治ります。

## 鍵を登録してみる

![スクリーンショット 2023-07-27 012840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264383/68f200b6-d4af-bd7d-caed-a26ee81ef2ad.png)

サンプルでこの様なプロジェクトと鍵情報が登録されています。
UIの見た目的にはかなり期待できますね。

![スクリーンショット 2023-07-27 013104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264383/14d5f98c-a19d-b5e0-501e-8b4cb08bf83e.png)

トップページの右上から `+ Add New Project` を選択し、流れに沿って作成。

![スクリーンショット 2023-07-27 013300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264383/620ca12a-d9c5-650d-0a2b-052525eddff6.png)

意気揚々と意味不明なプロジェクトを作成したまではいいのですが。。。
鍵がUIから追加できない模様！
ここはだいぶがっかりなポイントですね。。。

# まとめ

まだまだ駆け出しで荒削り感のあるツールだな、という印象でした。
UIが見やすいので、横並びで環境変数を確認したいときにはかなり便利そうでした。
鍵の登録がCLIかSDK経由に限定されておりUIは閲覧のみなので、UIは確認用となると、
Vaultのほうが信頼度が高いのではないだろうかと思ってしまったのは正直なところあります。

[HashiCorp Vault 入門](https://zenn.dev/nameless_gyoza/articles/hashicorp-vault-hands-on)

Node.jsやSpringBootから繋げて使ってみるところまで記事にしたかったのですが、ここまでで結構お腹いっぱいになってしまったので、今回はここまで！

とはいえ登場から1年も立っていないようなので、今後に期待ですね！
コンセプトはとても魅力を感じたので、これからが楽しみです。