【AWS】Amazon EC2にNetBoxコンテナを構築したい

## はじめに

最近、他部署で、Excelを使ったIPアドレスやホスト情報の管理に課題を感じている様子があり、
管理の属人化や更新ミスといったリスクを減らすため、NetBoxの導入が検討されるようになりました。
せっかくなので、自分でもNetBoxの動作確認を兼ねて、簡単に触ってみることにしました。
今回は、AWS上にNetBoxのコンテナ環境を構築し、ログインできるまでの流れをまとめます。

## TL;DR

- NetBoxのコンテナ構築は、専用のGitHubリポジトリを使うことでお手軽に実行可能
- セキュリティグループでTCP22とTCP8000を許可するのを忘れずに

## 実行環境

- OS: Amazon Linux 2023

## 詳細

### 1. EC2インスタンスの構築

1. 最低限、以下の要件でEC2インスタンスを構築する
    - インスタンスタイプ: t2.small
    - セキュリティグループ（インバウンド）: TCP22とTCP8000を許可

### 2. Dockerのインストール

1. EC2インスタンスにログイン
    - ユーザー: ec2-user
    - ポート: 22
2. Dockerのインストール

    ```console
    sudo yum update -y
    sudo yum -y install docker
    ```

3. サービス起動

    ```console
    sudo systemctl start docker
    sudo systemctl enable docker
    ```

4. dockerグループに追加

    ```console
    sudo usermod -aG docker $USER
    ```

5. 設定を反映させるため、一度ログアウトしてから再ログインする
    - VSCodeの場合は`Remote-SSH: Kill VS Code Server on Host`
6. sudoなしでdockerコマンドが実行可能であることを確認

    ```console
    docker run hello-world
    ```

### 3. Docker Composeのインストール

1. `root`ユーザーに切り替える

    ```console
    sudo su -
    ```

2. Docker Composeをインストール

    ```console
    curl -L https://github.com/docker/compose/releases/download/v2.35.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    ```

3. バイナリに実行権限を追加

    ```console
    chmod +x /usr/local/bin/docker-compose
    ```

4. `ec2-user`ユーザーにもどる

    ```console
    exit
    ```

5. docker-composeが利用可能であることを確認
    - バージョンが表示されれば、正常にインストールされています

    ```console
    docker-compose --version
    ```

### 4. NetBoxの構築

1. gitをインストール

    ```console
    sudo yum -y install git
    ```

2. NetBox用のDocker構成ファイルをクローン
    - 2025年4月時点で最新のタグ`3.2.0`をクローンします
    - また新しいバージョンが出ていた場合は手順が変更になっている可能性があるので注意してください

    ```console
    git clone -b 3.2.0 https://github.com/netbox-community/netbox-docker.git
    ```

3. クローンしたリポジトリに移動

    ```console
    cd netbox-docker
    ```

4. 構築用のファイルを作成

    ```console
    tee docker-compose.override.yml <<EOF
    version: "3.9"
    services:
      netbox:
        ports:
          - 8000:8080
    EOF
    ```

5. コンテナイメージのpull

    ```console
    docker-compose pull
    ```

6. コンテナを起動
    - コマンド

      ```console
      docker-compose up -d
      ```

    - 失敗例
      - 以下のようなログが出たら、`docker-compose up -d --force-recreate`コマンドでやり直し（連続で2-3回失敗することがある）

      ```console
      dependency failed to start: container netbox-docker-netbox-1 is unhealthy
      ```

7. StateがUpであることを確認
    - コマンド

      ```console
      docker-compose ps
      ```

    - 結果

      ```console
      NAME                                  IMAGE                                         COMMAND                  SERVICE               CREATED              STATUS                        PORTS
      netbox-docker-netbox-1                docker.io/netboxcommunity/netbox:v4.2-3.2.0   "/usr/bin/tini -- /o…"   netbox                About a minute ago   Up About a minute (healthy)   0.0.0.0:8000->8080/tcp, [::]:8000->8080/tcp
      netbox-docker-netbox-housekeeping-1   docker.io/netboxcommunity/netbox:v4.2-3.2.0   "/usr/bin/tini -- /o…"   netbox-housekeeping   About a minute ago   Up About a minute (healthy)   
      netbox-docker-netbox-worker-1         docker.io/netboxcommunity/netbox:v4.2-3.2.0   "/usr/bin/tini -- /o…"   netbox-worker         About a minute ago   Up About a minute (healthy)   
      netbox-docker-postgres-1              docker.io/postgres:17-alpine                  "docker-entrypoint.s…"   postgres              About a minute ago   Up About a minute (healthy)   5432/tcp
      netbox-docker-redis-1                 docker.io/valkey/valkey:8.0-alpine            "docker-entrypoint.s…"   redis                 About a minute ago   Up About a minute (healthy)   6379/tcp
      netbox-docker-redis-cache-1           docker.io/valkey/valkey:8.0-alpine            "docker-entrypoint.s…"   redis-cache           About a minute ago   Up About a minute (healthy)   6379/tcp
      ```

8. 管理者ユーザーを作成する

    ```console
    docker-compose exec netbox /opt/netbox/netbox/manage.py createsuperuser
    ```

### 5. NetBoxへのログイン

1. NetBoxにアクセスする

    ```console
    http://<global_ip>:8000
    ```

2. ログイン画面が表示され、作成した管理者ユーザーでログインできれば構築完了

## さいごに

NetBoxのコンテナを簡単に構築可能なのは大変ありがたいです。次回以降の記事では、
実際のNetBox操作や、Ansibleを使った自動化も今後試していきたいと思います。

## 参考URL

- VS Code関連
  - [VS CodeのRemote Development SSHのサーバー側のプロセスを再起動する](https://zaki-hmkc.hatenablog.com/entry/2021/01/26/225513)
- Docker Compose関連
  - [GitHub > compose](https://github.com/docker/compose)
  - [Docker Compose のインストール](https://docs.docker.jp/v1.12/compose/install.html)
- Netbox関連
  - [GitHub > netbox-docker](https://github.com/netbox-community/netbox-docker)
  - [Docker版NetBoxを導入してIPアドレス管理台帳.xlsxに別れを告げる](https://zaki-hmkc.hatenablog.com/entry/2021/01/11/171626)