理由目的
自宅サーバの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アドレスを更新する
Lambdaでコマンドやシェルスクリプトを実行してみる(Node.js)
経緯
初めはEC2サーバを立てて更新しようと考えてましたが、
お金掛かるんで、なにかいい方法をと、Lambdaでシェルが実行できることを知り実行、
IDとパスワード、IPを対話形式で実行しようとしましたが、
expectがなく断念。
以下の方法で一応成功したので、記録。
なお、SynologyのNASで実行しましたが、戻り値が悪いのかこちらはまだエラーが出ています
IPの更新は出来ている・・・
構成-本文
CURLにGETで投げます。
Lambda内部にはID-PASSをベタ打ちしてます。
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);
};
#!/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を使ったほうが良いのかも・・・・