#SORACOM Canalのピア接続を追加してカスタムDNSをホストしてみた

2016.04.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。 このブログはSORACOMのSoftware Design誌 巻頭特集記念リレーブログの3日目です。

SORACOM Canalは、SORACOMの3G/LTEモバイル閉域網をAmazon VPCに直結する、新しいセキュア接続サービスです。最近、初期費用の大幅な値下げとユーザーで設定出来るAPIが公開され、一気に利用しやすくなった注目サービスと言えます。Canalではモバイル網とVPCの接続点としてVirtual Private Gateway(VPG)が提供され、VPGとVPCをVPCピア接続で相互接続します。図で示すと以下の通りです。

canal-dns01

裏技というわけではないのですが、このピア接続は実は複数設定することができるのでそれを試してみた様子と、そのユースケースとしてSORACOM AirのカスタムDNSとの組み合わせをご紹介します。

Canalのピア接続を追加する

Canalのピア接続は、SORACOM APIを直接コールするか、最近公開された新しいsoracom-cli(Go版)で作成します。soracom-cliの初期設定は、GitHubのREADMEを参照してください。

まずは、Canal VPGを作成するsoracom vpg createコマンドを実行します。VPGはSORACOM Canalのほか、SORACOM Directでも利用するため--primary-service-nameオプションでcanalを指定します。

$ soracom vpg create --primary-service-name canal
{
	"createdTime": 1461244065377,
	"lastModifiedTime": 1461244066452,
	"operatorId": "OP00XXXXXXXX",
	"primaryServiceName": "Canal",
	"status": "creating",
	"tags": {},
	"type": 12,
	"useInternetGateway": true,
	"virtualInterfaces": null,
	"vpcPeeringConnections": null,
	"vpgId": "12345678-abcd-efgh-ijkl-1234567890ab"
}
$

VPGが作成できました。続いて、ピア接続を作成するsoracom vpg create-vpc-peering-connectionを実行します。ピア接続のために、以下のオプションを指定します。

  • --peer-owner-id : 接続するVPCのAWSアカウントID
  • --peer-vpc-id : 接続するVPC ID
  • --destination-cidr-block : 接続するVPCのCIDRブロック
  • --vpg-id : 先ほど作成したVPGのID(実行結果のvpgId)

今回は1つ目のVPCにセキュア接続したいアプリケーションサーバーとなるインスタンス、2つ目のVPCにDNSサーバーを配置してみます。以下のようなイメージです。

canal-dns02

ピア接続は複数接続だからといって特別な設定はありません。1本目、2本目のピア接続作成を順に実行します。

$ soracom vpg create-vpc-peering-connection \
> --peer-owner-id XXXXXXXXXXXX \
> --peer-vpc-id vpc-XXXXXXXX \
> --destination-cidr-block 172.21.0.0/16 \
> --vpg-id 12345678-abcd-efgh-ijkl-1234567890ab
{
	"destinationCidrBlock": "172.21.0.0/16",
	"id": "pcx-XXXXXXXX",
	"peerOwnerId": "XXXXXXXXXXXX",
	"peerVpcId": "vpc-XXXXXXXX"
}
$ soracom vpg create-vpc-peering-connection \
> --peer-owner-id XXXXXXXXXXXX \
> --peer-vpc-id vpc-YYYYYYYY \
> --destination-cidr-block 10.0.0.0/16 \
> --vpg-id 12345678-abcd-efgh-ijkl-1234567890ab
{
	"destinationCidrBlock": "10.0.0.0/166",
	"id": "pcx-YYYYYYYY",
	"peerOwnerId": "XXXXXXXXXXXX",
	"peerVpcId": "vpc-YYYYYYYY"
}
$

これでOKです。soracom vpg listコマンドで作成した内容を確認しましょう。

$ soracom vpg list
[
	{
		"createdTime": 1461244065377,
		"lastModifiedTime": 1461244354568,
		"operatorId": "OP00XXXXXXXX",
		"primaryServiceName": "Canal",
		"status": "running",
		"tags": {},
		"type": 12,
		"useInternetGateway": true,
		"virtualInterfaces": null,
		"vpcPeeringConnections": {
			"pcx-XXXXXXXX": {
				"destinationCidrBlock": "172.21.0.0/16",
				"id": "pcx-XXXXXXXX",
				"peerOwnerId": "XXXXXXXXXXXX",
				"peerVpcId": "vpc-XXXXXXXX"
			},
			"pcx-YYYYYYYY": {
				"destinationCidrBlock": "10.0.0.0/16",
				"id": "pcx-YYYYYYYY",
				"peerOwnerId": "XXXXXXXXXXXX",
				"peerVpcId": "vpc-YYYYYYYY"
			}
		},
		"vpgId": "12345678-abcd-efgh-ijkl-1234567890ab"
	}
]
$

vpcPeeringConnectionsに、作成したピア接続2本が確認できますね。AWSのManagement Consoleでは、作成したピア接続が承認待ちになっているので、それぞれのVPCで承認を実行しましょう。

canal-dns05

また、VPCからピア接続に通信するためにルートテーブルにルーティングエントリーを追加します。現時点で、SORACOM CanalのIPアドレス帯域は100.64.0.0/16です。実際にSORACOM Air SIMに割り当てられるIPアドレスはまた異なるものですが、Canal内でNATされるようなので、このルーティングエントリーで必要十分です。

canal-dns06

こちらもそれぞれのVPCで設定しましょう。これで準備OKです。それぞれのVPCにインスタンスを配置して利用できます。DNSサーバーには、アプリケーションサーバーのインスタンスのホスト名とPrivate IPなどを登録しておきましょう。

SORACOM Airの設定

SORACOM側では、作成したVPGをSIMの所属するグループの[SORACOM Air設定]に設定します。今回はカスタムDNSで2つ目のVPCのDNSサーバーのPrivate IPも設定しておきます。

canal-dns07

canal-dns08

設定後はモバイル接続を再確立する必要があるため、ユーザーコンソールからSIMを休止→使用開始するか、SIMを差したデバイスを再起動しましょう。

これで、Air SIMを差したデバイスからアプリケーションサーバーのインスタンスのホスト名宛てに、Canal経由でアクセスできるようになります。

付録 : マルチテナントDNSの設計

異なるユーザーにそれぞれCanalを用いた閉域網サービスを提供するケースもあると思います。ベストな構成としては、カスタムDNSを提供するDNSサーバーおよびVPCをVPG毎に1セットずつ用意する形でしょう。

canal-dns03

しかし、小規模なケースではユーザー毎にDNSサーバーのインスタンスを用意するのは、コスト面や個々のインスタンスのメンテナンス面で折り合いがつかない場合もあるでしょう。そんなときには1台のインスタンスで複数のユーザーにDNSサーバーを提供するマルチテナント構成とするのも良いでしょう。ピア接続がリリースされた当時に書いた以下ブログ記事の「EC2 as a Service」のようなイメージです。

ただし、EC2インスタンスはVPCをまたぐことができないため、1つのVPCに複数のピア接続を設定します。CanalのCIDRは全て100.64.0.0/16ですので、単一のルーティングテーブルに複数のピア接続を混在させることはできません。そこで、ピア接続ごとにルーティングテーブルを作成、ピア接続のルーティングエントリーを設定し、それぞれ異なるVPCサブネットを用意して紐付けます。

DNSサーバーのインスタンスにはENI(Elastic Network Interface)を追加、それぞれのVPCサブネットに紐付けてマルチホーム構成によってマルチテナント対応とします。

canal-dns04

1インスタンスに追加できるENI数はインスタンスタイプ毎に上限があることに注意しましょう。また、セキュリティ性、メンテナンス性からEC2の1枚目のENIはメンテナンス用としてまた別のVPCサブネットに用意するのがお奨めです。BINDの設定例を以下に示します。

  • 1枚目のENI : 172.21.0.102
  • 2枚目のENI : 172.21.1.100
  • 3枚目のENI : 172.21.2.100

named.conf(抜粋)

options {
        listen-on port 53 {
                127.0.0.1;
                172.21.1.100;
                172.21.2.100;
        };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { localhost; 100.64.0.0/16; };
        recursion yes;
        forwarders { 172.21.0.2; };
};
  :(略)
zone "app.local" IN {
        type master;
        file "app.zone";
};
  :(略)

まとめ

SORACOM Canalのピア接続が複数設定できることを利用して、アプリケーションサーバーとは異なるVPCにあるカスタムDNSサーバーを参照する方法をご紹介しました。

アプリケーションサーバーと同じVPCにカスタムDNSサーバーを配置する構成ももちろん可能ですので、ちょっと変わった構成例として参考になれば幸いです。

今回は付録のマルチテナントをやりたかったために異VPCとしました。VPCとピアリングはAWSの利用料金はかからないのですが、Canalはピア接続あたり1時間10円かかるので、その点に注意して利用ください。