デザインワン・ジャパン Tech Blog

DesignOne Japan | Activate the World.

オンプレサーバーにAmazon Linux 2のVMを構築しよう

はじめに

こんにちは!株式会社デザインワン・ジャパンでインフラ業務を担当している情報戦略部の冨田(@komitta)です。

本日よりデザインワン・ジャパンのテックブログを開設いたしました。 業務で培った内容をアウトプットし、世の中の発展につながることを目的としてゆるく続けていければと思っております。

概要説明

弊社にて運営している口コミサービス エキテンを始めとしたサービスの大半はAWS環境で動かしております。 AWSは使った分だけ課金される従量課金制のため、AWSにサーバーを構築した場合起動した分だけコストが発生いたします。

そのため数は少ないですが以下要望が社内であがっておりました。

  • 検証用サーバーがほしいけどなるべくコストはかけたくない
  • 使用頻度の少ない社内からしか接続されないAWS上のサーバーコストを削減したい

そんな(ニッチな)需要に応えるため社内のオンプレのサーバーにAmazon Linux 2のVMを構築しました。という記事になります。

Proxmoxについて

VMを動かすためのHypervisor環境としてオンプレサーバーにはProxmoxを導入しました。 Hypervisorの有名どころでいうとVMwareのESXiやMicrosoftHyper-Vとかが挙げられますが、あえて今回はマイナー(?)な製品を入れております。

前職でもESXi を使っていたのでESXiでも良かったのですが、どうせなら触ったことのないものを試したいという思いもありこちらを選びました。

触ってみてよかった点は

  • ベースのOSがLinuxDebian系)のKVMのため、トラブル時にLinuxの操作コマンドで対応がしやすい*1

です。(正直、KVMならなんでもよかった説) 基本GUI管理コンソール画面から操作は行うのですがOSにSSHログインして直接ファイル変更による操作も可能だったためすごく楽な印象でした。(ここについては当然メリデメあると思います)

Amazon Linux 2のVMを構築する

本題です。Proxmoxの構築についてはここでは触れません。 VMの構築は先人の方がまとめてくださった下記記事に沿って作成*2しました。

qiita.com

Cloud-Initで作成するユーザーにSSHの公開鍵を設定することでSSHログインが可能になります。 弊社ではAnsibleを使ったOSのプロビジョニングを行っているため、Ansibleが実行できるようSSH公開鍵を設定およびIPアドレスを設定しました。

f:id:doj_tomi:20210930120216p:plain
Cloud-Init設定画面

Ansible によるプロビジョニング

ローカル環境からプロビジョニングを行うためのディレクトリ構成を以下に記載します。 dockerコンテナよりAnsibleのplaybookを流すことができるように、Ansibleの構成ファイルとdocker-compose.ymlファイルを同じディレクトリに設置しました。

ディレクトリ構成

.
├── ansible
│   ├── dev(インベントリファイル)
│   ├── group_vars
│   ├── roles(ロールの中身は省略)
│   │   ├── common-systemd(OSの共通設定用Role)
│   │   └── mysql(mysqlインストール用Role)
│   └── site.yml(実行するplaybook。roleを記載)
├── docker-compose.yml
└── images
    ├── Dockerfile
    ├── config
    └── id_rsa

./ansible/dev

インベントリファイルにホスト名を記載しています。

[dev:children]
pve

[pve]
dev-pve-01-a

./images/DockerFile

Ansibleを実行するためのDocker Imageを作成します。 sshクライアントとAnsibleをインストールし、ここではVMに設定した公開鍵のペアである秘密鍵*3の格納を行います。

FROM debian:10-slim

WORKDIR /usr/local/src

# ssh client & Ansible install
RUN apt update && apt install openssh-server ansible -y && mkdir "/root/.ssh/"
COPY config "/root/.ssh/"
COPY id_rsa "/root/.ssh/"
RUN chown 600 /root/.ssh/id_rsa

CMD ["/bin/bash"]

./docker-compose.yml

Ansibleディレクトリをコンテナ上でbind マウントさせることで、ローカル上でAnsibleのplaybookを更新してすぐに反映できるようにしております。

またextra_hostsにインベントリファイルに記載した名前(OSのホスト名)とVMに設定したIPアドレスを記載します。 こうすることでコンテナの/etc/hostsにOSのホスト名とIPアドレスが記載されるため、インベントリファイルに記載したホスト名に対してplaybookを流すことができるようにしました。

version: '3'

services:
  ansible:
    build: ./images/
    tty: true
    working_dir: /usr/local/src
    volumes:
         - ./ansible:/usr/local/src
    extra_hosts:
         - "dev-pve-01-a:192.168.1.103"

あとはdocker compose コマンドよりAnsibleクライアントコンテナを起動させ、docker compose execよりansible-playbook コマンドを使用することでVMのプロビジョニングが実行されます。

$ docker compose up -d

$ docker compose exec ansible ansible-playbook -i dev site.yml
PLAY [all] *************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [dev-pve-01-a]

TASK [common-systemd : ホスト名を dev-pve-01-a に設定] *************************************************************************
ok: [dev-pve-01-a]

TASK [common-systemd : 言語が日本語設定か確認] ************************************************************************************

~~~~略~~~~~


TASK [mysql : rootの.my.cnfの編集] *****************************************************************************************
ok: [dev-pve-01-a]

PLAY RECAP *************************************************************************************************************
dev-pve-01-a               : ok=35   changed=0    unreachable=0    failed=0

おわりに

Dockerコンテナによる開発環境が充実してきた昨今ではオンプレでのサーバー構築を行うことは少なくなってきてると思いますが、 オンプレサーバー機器を所有している場合、このようにEC2に構築したAmazon Linux 2環境と同様の環境を用意することができます。

正直一発目の投稿内容にしては需要が少ないであろうニッチな話題になってしまいましたが、オンプレ好きにとっては作っててすごく楽しかったです。

仲間を募集しております

募集中の職種については以下を御覧ください。 www.wantedly.com

参考URL

*1:ESXiの場合、独自UNIXのコマンド体系だったため調査がしづらかった印象がありました。(あくまでも主観です)

*2:AWSからオンプレサーバーでのAmazon Linux 2 の構築手順についてマニュアルがあり、マニュアルに記載しているseed.isoを使った起動を行うこともできますが、Proxmoxには管理画面からCloud-Initが使用できるためこちらの記事を参考に作成させていただきました。

*3:Git等でコード管理している場合は、秘密鍵等の機密情報を直接アップロードしないよう注意が必要です。