さくらのクラウドに立ち上げたサーバをスクリプトでDNSに登録する

少し前にさくらのクラウドDNSができました。 これは何がいいかというとAPIがあることです。 早速、さくらのクラウドからサーバとIPアドレスを引っ張ってきて、 クラウドDNSに登録するというスクリプトを組んでみました。

まず、準備

  • 設定からAPIキー行ってAPIキーを登録しておきます。
  • そのキーを環境変数TOKENとSECRETに登録しておきます。
  • クラウドサーバあるゾーンを環境変数ZONEに登録しておきます。(石狩1だとis1aです)
  • クラウドDNSにゾーンを登録し、リソースIDを環境変数DNSIDに登録してきます。
  • ネームサーバはゾーンを登録した時に決定されるので、 変更しておいてください。

前提

require 'saklient/cloud/api'
require 'pp'

TOKEN = ENV['TOKEN']
SECRET = ENV['SECRET']
ZONE = ENV['ZONE']
DNSID = ENV['DNSID']

URLBase = "example.com"
URLPrefixGlobal = ""
URLPrefixLocal  = "lan"

# クラウドDNSに別枠で追加しておきたいレコード
AdditionalRecordA = {
  "db.mn": "192.168.1.1",
  "db.ln": "10.0.0.1",
  "www": "192.168.1.2",
  "@": "192.168.1.3"
}

api = Saklient::Cloud::API.authorize(TOKEN, SECRET, ZONE)

dns = api.common_service_item.get_by_id(DNSID)

new_record = []

# クラウドに登録されているレコード一覧(使っていない)
cloud_record = dns.raw_settings[:DNS][:ResourceRecordSets]

# クラウドのサーバ一覧からレコードを取り出す
cloud_servers = api.server.find
cloud_servers.each do |server|
  name=server.name.sub(URLBase,'').sub(/\.$/,'')
  server.ifaces.each do |iface|
    if iface.ip_address
      new_record << {Name: "#{name}.#{URLPrefixGlobal}".gsub(/\.\./, '.').sub(/\.$/, ''), RData: iface.ip_address, Type: "A"}
    elsif iface.user_ip_address
      new_record << {Name: "#{name}.#{URLPrefixLocal}".gsub(/\.\./, '.').sub(/\.$/, ''), RData: iface.user_ip_address, Type: "A"}
    end
  end
end

AdditionalRecordA.each do |key, val|
  if key==:'@'
    new_record << {Name: key, RData: val, Type: "A"}
  else
    new_record << {Name: "#{key}", RData: val, Type: "A"}
  end
end

pp new_record

dns.raw_settings[:DNS][:ResourceRecordSets] = new_record

dns.save # これをやらないと保存されない

SaklientのドキュメントをDash形式に変換したものをgithubに置いておいた

github.com

さくらクラウドのドキュメントもサンプルも少ないので、 ソースコードを直接見ざるを得ないのですが、 いちいち見るのも面倒なので、Dashで見るべく 変換しました。せっかくなのでgithubにあげておきます。

f:id:xibbar:20151214162243p:plain

楽ちんです。

プロバイダが障害を起こしたのでRTX810でモバイル回線バックアップを作った

社内的はInterlinkでIP16で契約しているのですが、昼寝してたらつながらなくなってしまっていました。 調査したところ、福島県だけつながらないらしい。

f:id:xibbar:20151208141536p:plain

1時間ほど待ってつながらないので、仕方なくバックアップ回線を作ったのでした。 まず、NTTドコモのL-02Cが余っていたので、これに 普段出張で使っているOCNのSIMを入れ、RTX810に接続。 設定は以下のとおり

ip route default gateway pp 2
pp select 2
 pp bind usb1
 pp auth accept pap chap
 pp auth myname xxxxxxxx@one.ocn.ne.jp xxxxxxxx
 ppp lcp mru off 1792
 ppp lcp accm on
 ppp lcp pfc on
 ppp lcp acfc on
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ppp ipv6cp use off
 ip pp nat descriptor 2000
 mobile auto connect on
 mobile disconnect time 60
 mobile access-point name lte-d.ocn.ne.jp cid=1
 mobile access limit length off
 mobile access limit time off
 pp enable 2
nat descriptor type 2000 masquerade
mobile use usb1 on
dns server pp 2

とりあえず繋げたかったので、こんな設定にしました。 自動で切り替わるとか入れてないです。

旅費comというサービスを作りました

f:id:xibbar:20151207125117j:plain

長い間自分のためだけのウェブアプリだったのですが、 社長仲間からチラホラ使いたいという声がでてきていましたので、 奮起して外部公開できるように作りなおしました。

http://ryohi.com/

このサービス何?

旅費精算書を簡単に印刷するためのサービスです。

www.youtube.com

旅費と交通費の登録をすると、綺麗に印刷されます。 交通費はテンプレート化できるので、いちいち調べ直す必要がありません。 日当と宿泊費を登録することができます。

なんで必要なの?

別にエクセルでやるからいいよって人には必要な気かもしれません。 私がエクセルで管理するのが嫌になったので作りました。

たったそれだけなの?

旅費精算書には秘密があって、絶大な節税効果があります。 そのための条件は、

  • 法人であること
  • オーナー社長であること

です。法人であることは絶対条件です。後者はやりやすさが影響します。

税法上問題ないの?

もちろんきちんとやらないと税務調査でクロ判定されますので、 きちんとやってください。節税のノウハウはここでは書けません。

いくらかかるの?

広告を貼る予定なので、無料です。5名という上限がありますので、 それ以上使いたい場合はご連絡ください。

広告を外せないの?

1アカウントに付き500円(税抜)/月で広告を外すことができます。

節税ノウハウ教えてくれないの?

面識のある人にしか教えません。知り合いになってください。

スマホで使える?

スマホで使えるようにレスポンシブなデザインになっています。 ブラウザをキュッと小さくすると確認できます。

あんた誰?

xibbarこと藤岡と言います。Ruby界隈と不動産賃貸業界隈に出没します。 就職もせずにRubyの会社を立ち上げて14年、不動産賃貸事業をはじめて8年ぐらいです。 このサービスはxibbarの個人プロジェクト扱いです。

欲しい機能があるんだけど

@xibbarまで連絡ください。検討します。

バグを見つけたんだけど

@xibbarまで連絡ください。なおします。

サーバはどこにあるの?

herokuを使っています。今は日本リージョンが正式版にないので、アメリカにあります。 そのため、反応が若干遅いです。

ぜひ、お使いいただき、感想をいただけると嬉しいです。

改行コード一括変換

Railsプロジェクトをポイっと渡されたら、CRLFだったので、一括変換するメモ。

find * -type f|egrep -v '(.gif|.jpg|.png|.db|.doc|.graffle|.mo)$'|xargs -n 10 nkf -Lu --overwrite

.graffleとか.moが入っているのはそういうプロジェクトだったもので。

OSX El Capitanにrbenvで1.8.7-p375を入れる

もういい加減にしたいと思っている1.8.7なのですが、 残っているところがある以上、こちらでも開発環境を用意しなければならないのです。

rbenv install 2.2.3

とかは問題なくインストールできました。しかし、

rbenv install 1.8.7-p375

とやってみたのですが、エラーが出ます。

ERROR: This package must be compiled with GCC, but ruby-build couldn't
find a suitable `gcc` executable on your system. Please install GCC
and try again.

DETAILS: Apple no longer includes the official GCC compiler with Xcode
as of version 4.2. Instead, the `gcc` executable is a symlink to
`llvm-gcc`, a modified version of GCC which outputs LLVM bytecode.

For most programs the `llvm-gcc` compiler works fine. However,
versions of Ruby older than 1.9.3-p125 are incompatible with
`llvm-gcc`. To build older versions of Ruby you must have the official
GCC compiler installed on your system.

TO FIX THE PROBLEM: Install Homebrew's apple-gcc42 package with this
command: brew tap homebrew/dupes ; brew install apple-gcc42

You will need to install the official GCC compiler to build older
versions of Ruby even if you have installed Apple's Command Line Tools
for Xcode package. The Command Line Tools for Xcode package only
includes `llvm-gcc`.

BUILD FAILED (OS X 10.11 using ruby-build 20150818-4-g8d6ff29)

こんなエラーが出ます。エラーメッセージのとおりにやってみたのですが、 全然ダメでした。仕方ないのでビルドディレクトリに移動してみて、 ./configureをやったらあっさり通ります。 なんだ、ruby-buildの問題か。というわけで、デバッグをしはじめました。 ちょっとだけ追ってみたら、require_gccのあたりのようで、 gccのチェックをしている模様。

--- a/share/ruby-build/1.8.7-p375
+++ b/share/ruby-build/1.8.7-p375
@@ -1,3 +1,3 @@
-require_gcc
+# require_gcc

これであっさり通るようになりました。 ちゃんと直すのは面倒だなぁ。っというわけで誰かお願いします。 bashの動きを調べるのめんどい。

あなたならどうするこのルーター設定

とあるシステムと接続するにあたって、 サービス元のIPアドレス 192.168.10.1/24 持ち込みルータのIPアドレス 192.168.20.1/24 サービス先のIPアドレス 192.168.30.1/24 ポート番号10000 ってな感じで、全部サブネットと違っていて、ポートが指定されてしまっている。 NATで変換したいんだけど、間に192.168.30.0/24のネットワークを 構築する余地もない。

f:id:xibbar:20151005165356p:plain

さてどうする?

解1. がんばってLANを構築し直して、192.168.30.0/24のネットワークにしてしまう。

解2. 静的ルーティングで192.168.100.2のサーバに192.168.30.0/24のルートを向けて、ループバックに192.168.30.2を指定する。仕方ないのでポートはそのまま使う。

どちらの案もNAT使っていないんだけど、通過するだけのパケットのIPとかポートを 捻じ曲げる方法があるって人は教えて下さい。 もうわからん。

追記

lan1にサービス先のサブネットを振り、Static NATをすることで実現できました。 試していないのですが、ポートとIPを組み合わせてmasquaradeする方法でもいけるでしょう。

ip lan1 address 192.168.20.1/24
ip lan1 secondary address 192.168.30.2/24
ip lan1 nat descriptor 1
nat descriptor type 1 nat
nat descriptor address outer 1 192.168.30.1-192.168.30.254
nat descriptor address inner 1 192.168.20.1-192.168.20.254
nat descriptor static 1 1 192.168.30.1=192.168.100.1 254

f:id:xibbar:20151006151627p:plain