サイトを運用していると、なんの前触れもなく表示できなくなること・・・ありますよね?
ダウンの原因は様々で、よくあるのは高負荷やハードウェアトラブルかと考えています。
これらが発生するタイミングはバラバラで基本的に規則性は無さそうです、 しかしダウン原因の中には土日祝日や連休のタイミングを狙ったように発生するものがあると思っています。
今年のGW中にもありましたが・・・それはDNS障害です。
目次
休日中に発生するDNS障害とは
通常DNSは冗長化されているので落ちること自体が少ないのですが、DNS専門のサービスやクラウドインフラを使えない場合は話が変わってきます。 プライマリとセカンダリに分かれていても同じネットワーク内に配置されていることはよくあり、
- DNSサーバーが配置されている建物のメンテナンス
- 平日にできないサーバーメンテナンス等の作業を休日におこなう
といったことが要因でDNSサーバーがダウンします。 それってサイトごとダウンするのでは?と思うかもしれませんが、WEBサイトはAWSでDNSは情シスのオンプレといったパターンがあったりします。
どうするか
事前にDNSサーバーが落ちることが通知されていれば問題ないのですが、 クライアントとDNSサーバーを管理しているところが別であり、残念ながら把握できないことが多いです。 ただこういった場合は基本的に計画されている作業が終わるのを待つしかないため、 サイトダウンの原因がDNSであることを突き止められれば問題ありません。 そしてDNSが原因なのかを確認する程度であれば自動化は簡単です。
自動化の構成要素
サービス | 補足 |
---|---|
サイト監視システム | uptimerobotなどのサイト監視サービス ※アラートメール内に監視先のURLが記載されている必要有り |
Gmail | 説明不要なぐらい有名なメールサービス |
Amazon SES | AWSのシステムメール送受信サービス |
Amazon S3 | AWSのオブジェクトストレージサービス |
Amazon Lambda | AWSのサーバー無しでコードを実行できるサービス |
Amazon SNS | AWSのメッセージ通知サービス |
処理の流れ
処理の流れの大枠は以下で、メール主体の方法になっています。
サイト監視システムがWebhookできるのであれば、今なら直接Lambdaを実行することも可能だと思います。
- サイト監視システムがサイトダウンを検知、アラートメールを送信
- Gmailで一旦受け取ってSESに転送
- アラートメールをSESで受け取りS3に保存、Lambdaをキックする
- LambdaからDNSの正引きをおこない、結果をSNSを使ってメール送信する
実際の設定例
それでは実際にどんな設定をしているのか紹介します! ここでは設定項目を以下としておきます、実際に設定するときは別途ご用意ください。
監視先URL: https://website.example.com
Gmailアドレス: dnshealthcheck.sample.hook@gmail.com
S3バケット名: dnshealthcheck.example.com
SESで使用するドメイン: dnshealthcheck.example.com
SESで使用するメールアドレス: error@dnshealthcheck.example.com
Lambdaから通知で使うSNS: arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:error
サイト監視システムの設定
ここでは uptimerobot を例にします。
https://uptimerobot.com/ にログインし以下をおこないます。
通知先の作成
以下のように通知先を作成します。
監視の作成
以下のように監視を作成します。
Gmailの設定
わざわざ監視システムからGmailにメールを送り、そこからSESに転送させています。なぜこんなことをしているのか。
それは監視システムからメールがちゃんと飛んでるのかすぐに判断できる方法があった方が良いのと、 SESとLambdaのテストをしやすくするためです。また、監視システムも障害をおこすことがあるため何かあったときの原因切り分けでも使用できます。
転送設定
Gmailにログインし以下のようにSESへの転送設定をおこないます。
S3の設定
AWSコンパネにログインし、 以下のようにメールを保存しておくS3バケットを作成します。オプション類はデフォルトで問題ありません。
メールが残り続けるとS3のコスト増えてしまうため、90日で削除するようにしておきます。以下のようになるようにライフサイクルを追加します。
SESの設定
メールの受信はバージニアリージョン以外では使用できないため注意ください。
ドメインの登録
「Verified identities」から以下のようにドメインの登録をおこないます。
DNSレコード追加
ドメイン承認用途のDKIMレコードが3点生成されるのでMXレコードと共に登録します。以下のようなものになります。
dnshealthcheck.example.com MX 10 inbound-smtp.us-east-1.amazonaws.com
1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx._domainkey.dnshealthcheck.example.com CNAME 1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.dkim.amazonses.com
2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx._domainkey.dnshealthcheck.example.com CNAME 2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.dkim.amazonses.com
3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx._domainkey.dnshealthcheck.example.com CNAME 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.dkim.amazonses.com
メール受信設定
「Email receiving」から「default-rule-set」に以下のようにアクションを追加します。
Lambdaの設定
コードの作成
「関数の作成」から以下のファイルを元に作成してください。
https://s3.ap-northeast-1.amazonaws.com/town.biz/public/dnshealthcheck/main.py
コードの仕様は以下になります。
- メール内のURLを「/」で文字列分割してドメイン名を取得する
- gethostbyname でIPが取れるかどうかチェックする
- 結果をSNSで通知する
イベントの作成
メールがS3に配置されたら上記コードを実行できるように、以下のように設定します。
動作テスト
実際にアラートを発生させたときに以下のようなメールがSNSで送信されていれば成功です。
おわりに
DNSが問題でサイトが落ちることは全体から見ると少ないのでDNSの確認は後になりがちで、余計な調査をしてしまうことが結構あります。しかし自動で通知されていればサッと目を通すので休日以外でも役に立ちます。 今後はリソース状態を自動で通知するようにしたり、エラーログを通知するようにしたり、サーバーやコンパネにログインしなくても原因をつかめるようにしていきたいですね。
一緒に働く仲間を募集しています。
新卒採用・中途採用を問わず、年間を通して、さまざまな職種を募集しています。「すぐに仕事がしたい」「話を聞いてみたい」「オフィスを訪問してみたい」など、ご応募をお待ちしています。共に未来をカタチにする仲間を待っています。