OktaのバックアップにTerraformerが使えるかもしれない

# Okta登録内容のバックアップ
Oktaは標準でバックアップやエクスポートの機能がありません。OktaのHelp Centerにも問い合わせがいくつか上がっていますが、対応されていません。
[User Data Backup](https://support.okta.com/help/s/question/0D54z00009XccakCAB/user-data-backup)
今後も作られない可能性は大きいのではないかと個人的には思っています。

サポートにはAPIで作成するように言われましたが、かなり時間が掛かりそうです。
そんな中TerrafromがOktaに対応していることを知りました。Terraformで初期から作っていればそれがバックアップとしても働きます。今から導入する組織はTerraformをお勧めします。ですが、既に導入済みで、ある程度使っている組織はTerraformにリバースするのは結構大変です。
さらに調べていくとTerraformerもOktaに対応しているということがわかり、これならバックアップに使えないかと考えました。余裕があればTerraform管理下にすることもできそうです。

# 実装
## 環境
- Ubuntu 22.0 (WSL)
- Terraform 0.13.0
- oktaプロバイダー 3.45.0
- Terraformer 0.8.24
- docker Engine 23.0.1
- dockerイメージ hashicorp/terraform 0.13.0

terraformerはterraform 0.13しかサポートしていません。その為、今（2023/11）のterraformの最新版よりはかなり古いバージョンになります。今の最新バージョンは以下になります。Oktaプロバイダーは最新バージョンだと動くには動きますが、エラーが出てしまうのでエラーが出ないようバージョンを下げています。
- terraform v1.6.4
- oktaプロバイダー 4.6.1

また、hashicorpからterraformのDockerイメージがリリースされているのでそれを使用します。

## ディレクトリ構成
```
├── docker
│   ├── Dockerfile
│   ├── init.sh
│   └── provider.tf
├── docker-compose.yml
└── outputs
```
## ソース
hashicorp社のTerraformのDockerイメージを使用します。Terraformerのインストールは[公式のドキュメント](https://github.com/GoogleCloudPlatform/terraformer/tree/master#installation)の通りです。Oktaプロバイダーをインストールするため、provider.tfをコピーし、`terraform init`を実行しています。
```dockerfile:docker/Dockerfile
FROM hashicorp/terraform:0.13.0

USER root

RUN apk update --no-cache && \
    apk add curl

ARG PROVIDER

RUN curl -LO "https://github.com/GoogleCloudPlatform/terraformer/releases/download/$(curl -s https://api.github.com/repos/GoogleCloudPlatform/terraformer/releases/latest | grep tag_name | cut -d '"' -f 4)/terraformer-${PROVIDER}-linux-amd64"
RUN chmod +x terraformer-${PROVIDER}-linux-amd64
RUN mv terraformer-${PROVIDER}-linux-amd64 /usr/local/bin/terraformer

WORKDIR /opt/terraformer
COPY ./init.sh .
RUN chmod +x ./init.sh
COPY ./provider.tf .
RUN terraform init

ENTRYPOINT [ "/bin/sh", "/opt/terraformer/init.sh" ]
```
OktaプロバイダーをインストールするためのHCLです。特に変わったことは書いていません。
```hcl:docker/provider.tf
terraform {
    required_providers {
    okta = {
      source  = "okta/okta"
      version = "3.45.0"
    }
  }
}
```
インポートを行うシェルスクリプトです。これも特に変わったことは書いていません。
```bash:docker/init.sh
#!/bin/sh

cd /opt/terraformer
/usr/local/bin/terraformer import okta --path-output /tmp/outputs/ $1
```
commandに出力したいリソースを記述します。複数出力したい場合はカンマ区切り、全て出力したい場合はアスタリスクを指定できます。terraformerの出力ファイルは`/tmp/outputs`に出力されるので`volumes`に出力したいローカルパスを記述します。
```yaml:docker-compose.yml
version: "3"

services:
  terraformer:
    build:
      context: ./docker
      dockerfile: Dockerfile
      args:
        PROVIDER: "okta"
    container_name: "okta-backup"
    # ["--resources=okta_user"]
    # ["--resources=okta_user,okta_app_saml"]
    command: ["--resources=*"]
    environment:
      # 公式ドキュメントを参照（https://github.com/GoogleCloudPlatform/terraformer/blob/master/docs/okta.md）
      OKTA_ORG_NAME: dev-99999999
      OKTA_BASE_URL: okta.com
      OKTA_API_TOKEN: 00di2-Me2hrqAuoNkpA7tyzoUKH5E7LDSAzaqPPCKg
    volumes:
      - ./outputs:/tmp/outputs
```
## 実行
プロジェクトのルートパスで実行します。
```bash
$ docker compose up
[+] Running 1/1
 ⠿ Container okta-backup  Recreated                                                                                0.8s
Attaching to okta-backup
okta-backup  | 2023/11/19 09:20:30 Attempting an import of ALL resources in okta
okta-backup  | 2023/11/19 09:20:32 okta importing... okta_app_auto_login
...
okta-backup  | 2023/11/19 09:23:58 okta save okta_policy_rule_password
okta-backup  | 2023/11/19 09:23:58 okta save tfstate for okta_policy_rule_password
okta-backup exited with code 0
```
実行後`outputs`以下にhclファイルが出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/7759591c-f0b7-b387-8444-624979232128.png)

# まとめ
これを定期実行すればバックアップとして使えそうではあります。ただTerraformとOktaプロバイダーのバージョンが古く、Terraformerもまだバージョン1になっていないのが実務で使うには少し懸念されます。バックアップがないよりはましくらいの考えでよいと思います。

## 追記
カタログのアプリはTerraformは対応していないようです。
また、バックアップ・リストアを行ってくれるSaaSで以下の２つが見つかりました。

https://www.backupta.com/

https://www.hycu.com/ja/platforms/okta