4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Serverless2Advent Calendar 2018

Day 16

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

Posted at

理由目的

自宅サーバの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をベタ打ちしてます。

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を使ったほうが良いのかも・・・・

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?