Posted at

お名前.COMのDDNSをLambdaを使って更新する


理由目的

自宅サーバのDDNS更新をAWSを使って行う。

普通に更新すれば良いじゃないと言われるが、以下の理由が。


  • お名前.COMの更新ソフトはWindowsのみ

  • 家で主に動いているサーバはNASのLinux(Synology DS216J)

  • 今まではMyDNSを使用していたが、練習がてらサーバレスに変更したい。

  • NASのLinuxは汚したくない(インストールしたくない)

  • NASからの更新はCURLのGETのみ

というわけでLambdaとAPI-Gateway使って、更新させます。


方法

APIに自宅に割当されたIPアドレスを放り投げてOpenSSLにて更新を行います。

参考にさせていただいたQiita記事


LinuxやMacで お名前.com ダイナミックDNS の IPアドレスを更新する

https://qiita.com/ats124/items/59ec0f444d00bbcea27d


Lambdaでコマンドやシェルスクリプトを実行してみる(Node.js)

https://qiita.com/toshihirock/items/7393121263ffcec0a395


経緯

初めはEC2サーバを立てて更新しようと考えてましたが、

お金掛かるんで、なにかいい方法をと、Lambdaでシェルが実行できることを知り実行、

IDとパスワード、IPを対話形式で実行しようとしましたが、

expectがなく断念。

以下の方法で一応成功したので、記録。

なお、SynologyのNASで実行しましたが、戻り値が悪いのかこちらはまだエラーが出ています

IPの更新は出来ている・・・


構成-本文

CURLにGETで投げます。

Lambda内部にはID-PASSをベタ打ちしてます。


index.js

var exec = require('child_process').exec;

var fs = require('fs');

exports.handler = function(event, context) {

var data;
var IP;

IP=event.key1;
// 受け取ったIPを変数に。
// IPの構文チェックは省略、ホントは入れてね。。

// USERIDとPASSはこちらに。
// HOSTNAMEが無いなら、空欄でもOK"HOSTNAME:"は必要
// ドメインは説明不要
// "IPV4:"のあとに更新したいIPアドレスを。
data="LOGIN\nUSERID:0000000\nPASSWORD:XXXXXXXXXXXXXX\n.\n";
data=data + "MODIP\nHOSTNAME:WWW\nDOMNAME:YOURDOMAIN.COM\nIPV4:";
data=data + IP;
data=data + "\n.\n";
data=data + "LOGOUT\n.\n";

// コマンド文を固めて、ファイルに保存。

fs.writeFile("/tmp/cmd.txt", data, function (err) {
if (err) {
throw err;
}
});

// exec.shに一気に入力
// これでキー入力を代用。

child = exec('/bin/bash ./exec.sh < /tmp/cmd.txt', function(error) {
// Resolve with result of process
context.done(error, 'Process complete!');
});

// Log process stdout and stderr
child.stdout.on('data', console.log);
child.stderr.on('data', console.error);
};



exec.sh

#!/bin/bash

openssl s_client -connect ddnsclient.onamae.com:65010 -quiet

exit


API-gatewayはひねりのないGET受信->Lambdaへの受け渡し。

誰でも触らせないために、APIキー・・・を入れたいが、SynologyのNASには設定がない(T_T)

URLを秘密にするしか無いのか???

あとはGETを受信するために・・・


  • 統合リクエスト内部 マッピングテンプレートへ

{

"key1" : "$input.params('key1')"
}

Curlの構文は、

curl https://XXXXXX.execute-api.AP-XXXXX.amazonaws.com/default/Lambda-exe?key1=IP-addr

この後、お名前.COMのコンソールを見れば、更新されているかわかります。


まとめ

難航したのは、APIの使い方。

デプロイ後のLambdaとの登録。

GETパラメータのマッピング

最大の難関は、expectが無いLambdaにてどうやってコマンドを送るか。。

ファイルで渡せてよかった。。。

練習には良かったけど、実用化は難しいかも。

SynologyのDDNS更新方法をもう少し調べましょうか。

良い方法を知っている人がいれば教えて下さい。。。。

というかここまでするなら、

余っているRaspberryPiを使ったほうが良いのかも・・・・