こんにちは、インフラチームの加藤です。
この記事は Enigmo Advent Calendar 2020の23日目の記事となります。
本記事では、リモートワーク環境のため、擬似DNSを社内提供したお話をします。
エニグモでは、今年の2月頃から全社的にリモートワークを開始しました。
それに伴いインフラチームでは、リモートワークのネットワーク周りの対応を行いました。
エニグモが運用しているサーバ群
エニグモの運用するサーバは、データセンター内に構築したものとAWSのものがあります。
情シスの足立さんが、SaaS導入を進めて下さったためオフィス内にサーバはほぼありません。
サーバへの疎通経路
オフィス・リモート環境共にVPN経由(+ファイアウォール)で、サーバ群へアクセス可能です。
リモートワーク開始後のサーバアクセスの問題
リモートワーク開始直後から、ネットワーク設定に関するお問い合わせと、インフラチームの対応が発生しました。VPNやWifiの設定など、個々人のネットワーク設定の問題は、一度解決すれば再発することは滅多にありませんでしたが、名前解決は、何度もお問い合わせが頻発する厄介な課題でした。
なぜ、名前解決がリモートワークの課題だったのか
コロナ禍以前
エニグモでは、オフィス環境からサーバへのアクセスを楽にするため、ファイアウォールでオフィスのグローバルIPを許可し、非エンジニアスタッフの使用するサーバへはサーバのグローバルIPを指定してアクセス可能にしていました。
名前解決がリモートワークの課題となった原因
リモート環境からサーバへは、VPN経由でサーバのローカルIPを指定してアクセスする形でした。そのためオフィスとリモート環境では、サーバのアクセス情報が異なりました。
整理すると、以下の形になります。
職場 | アクセス元のIP | アクセス先のIP |
---|---|---|
リモート環境 | スタッフのお家 | サーバのローカルIPを指定 |
オフィス | オフィスのGIP | サーバのグローバルIPを指定 |
リモートワーク開始直後は、採用や営業活動、検品作業のため出社が必要なスタッフも居て、シフトで出社日を回していました。出社したスタッフは、Hostsを社内用に修正せねばならず、名前解決関係のお問い合わせが継続していました。DNSを導入すべきでしたが、工数がかかり難しいところでした。
名前解決の課題を解決
Hostsを一元管理できないかと思案していたところ、SwitchHosts!を発見し利用することにしました。
SwitchHosts!とは
Hostsファイルのサーバ管理が可能になる、端末のアプリです。
開発者は、サーバからHostsファイルをダウンロードして端末で使用する形となります。
SwitchHosts!のよかったところ
- 無料公開されているアプリケーションだったこと。
- 配布元にリモートサーバが使えて、Hostsファイルを集中管理できたこと。
- Mac/Windowsでも、同じUIで使えてサポートし易かったこと。
- HostsのパーツごとのON/OFFができ、localでHostsを修正できて組み合わせられること。
- 端末のHostsのバックアップが取れること。
SwitchHosts!を使用した、擬似DNSの運用
ユースケースに合わせたHostsファイルを作成し、データセンターにNginxコンテナを立てて配布できるようにしました。 これにより、オフィスでもリモート環境でも、簡単にDNSの機能を提供できるようになりました。
SwitchHosts!導入後の課題と解決方法
SwitchHosts!の導入後、名前解決が原因となる問題はさっぱりとなくなりました。
しかし「AWS環境における開発に伴い、Hostsの修正が都度必要になる」という課題が残りました。
一時は、ダウンロード元のHostsファイルを手動で修正していましたが、無駄な作業でした。
そこで、Hosts情報の更新スクリプトを作成し、Hostsファイルの自動更新を実現しました。
- 以下が、スクリプトです。
#AWSのマシンには、${Prefix}タグと${Name}タグに、 #マシンのAZやサイト環境を命名規則として持たせています。 #!/usr/bin/env ruby require 'aws-sdk-ec2' ec2_client = Aws::EC2::Client.new() #ARGVに、${Prefix}タグの値(マシンのAZやサイト環境を命名規則としたもの)を持たせています。 Prefix_list = ARGV f = { filters:[{ name: "tag:Prefix", values: Prefix_list }]} reservations = ec2_client.describe_instances(f).inject([]) do |s,list| s += list.reservations end instances = reservations.each.inject([]) do |s,list| s += list.instances end instance_list = [] instances.each do |e| instance_list << { :instance_id => e.instance_id, :vpc_id => e.vpc_id, :public_ip => e.public_ip_address, :private_ip => e.private_ip_address, :name_tag => e.tags.find{|t| t.key == "Name"}.value, :prefix_tag => e.tags.find{|t| t.key == "Prefix"}.value.downcase, } end instance_list.each do |e| hostname = e[:name_tag].downcase #あとは、環境に合わせてよしなに加工してHostsファイルに出力します。 end
まとめ
DNSの機能を低コストで提供できてよかったです❗️
VPNへの依存度も減らしたいので、Google IAPを検証中です。
同じインフラチームの先輩社員 山口さんが、記事にされていました。
old schoolerなネットワークエンジニアがIAP Connectorを試してみた - エニグモ開発者ブログ
最後に
明日の記事の担当は、情シスの足立さんです。お楽しみに。
株式会社エニグモ 正社員の求人一覧