Обновление записи Route53 с использованием lambda nodejs не работает - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь обновить запись в Route53, используя лямбда-функцию и время выполнения nodejs.

Проблема в том, что я не получаю ни ошибок, ни журналов, ни чего-либо из маршрута 53, чтобы даже понять, почему он не работает.

Я настроил следующее:

  • Лямбда-функция
  • SNS для чтения сообщений от
  • Прикреплена политика для обновления / изменения наборов записей

Мой лямбда-код:

console.log('Running updateRecordSet');

/* global HOSTED_ZONE_ID*/
/* global DNS_RECORD_NAME*/

HOSTED_ZONE_ID = 'xxxx';
DNS_RECORD_NAME = 'dns-record.internal.example.com.';

var aws = require('aws-sdk');
var route53 = new aws.Route53();

exports.handler = async (event, context) => {

const message = event.Records[0].Sns.Message;
console.log('SNS message:', message);

try {
  const data = JSON.parse(message);

  if (data.ip) {
      console.log('New IP: ', data.ip);

      var newRecord = {
      HostedZoneId: HOSTED_ZONE_ID,
      ChangeBatch: {
        Changes: [{
          Action: 'UPSERT',
          ResourceRecordSet: {
            Name: DNS_RECORD_NAME,
            Type: 'A',
            ResourceRecords: [{Value: data.ip}],
            TTL: 30,
          }
        }]
      }
    };

    updateRecordSet(route53, DNS_RECORD_NAME, HOSTED_ZONE_ID, newRecord, function(err) {
              if (err) {
                return context.fail(err);
              }
              return context.succeed('OK');
            });
  }
} catch(err) {
    console.error(err);
}

return message;
};

function updateRecordSet(route53, DNS_RECORD_NAME, HOSTED_ZONE_ID, newRecord, callback) {

console.log("Executing function updateRecordSet");

route53.changeResourceRecordSets(newRecord, function(err) {
  if (err) {
    console.log("Got an err");
    return callback(err);
  }

  return console.log('Updated A record for', DNS_RECORD_NAME);
});

}

Я получаю вывод:

Function Logs:
START RequestId: 4ef801ba-c03c-4582-33a8-c078c46f0b03 Version: $LATEST
2019-04-07T04:18:55.201Z    4ef801ba-c03c-4582-83a8-c078c46f0b03    SNS message: {"ip": "10.1.1.1"}
2019-04-07T04:18:55.201Z    4ef801ba-c03c-4582-83a8-c078c46f0b03    New IP:  10.1.1.1
2019-04-07T04:18:55.201Z    4ef801ba-c03c-4582-83a8-c078c46f0b03    Executing function updateRecordSet
END RequestId: 4ef801ba-c03c-4582-33a8-c078c46f0b03

Если политика IAM неверна, я, по крайней мере, получу какую-то ошибку аутентификации?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

По какой-то причине я не смог настроить асинхронную работу с лямбдой, но, наконец, получил рабочий код.

Эта лямбда обновит или вставит набор записей в Route53, считывающий из SNS, с сообщением JSON, например {"ip": "10.1.1.1"}

console.log('Running updateRecordSet');

var AWS = require('aws-sdk');

/* global HOSTED_ZONE_ID*/
/* global DNS_RECORD_NAME*/

HOSTED_ZONE_ID = 'xxxxxx';
DNS_RECORD_NAME = 'dns-record.example.com.';

exports.handler = function(event, context, callback) {

  var route53 = new AWS.Route53();

  // Get message from SNS
  var message = event.Records[0].Sns.Message;
  const data = JSON.parse(message);

  if (typeof data.ip !== "undefined") {
    route53.changeResourceRecordSets({
      HostedZoneId : HOSTED_ZONE_ID,
      ChangeBatch : {
          Changes : [{
              Action: 'UPSERT',
              ResourceRecordSet: {
                  Name: DNS_RECORD_NAME,
                  Type: 'A',
                  ResourceRecords: [
                      {
                          Value: data.ip
                      }
                  ],
                  TTL: 30
              }
          }]
      }
    }, function (err, data) {
        if (err)
            console.log(err, err.stack);
        else {
            console.log('Updated Route53 DNS record ' + DNS_RECORD_NAME);
        }
    });

  } else {
    console.log('No IP found in message. Discarding.');
  }
};
0 голосов
/ 07 апреля 2019

Вам нужно либо поставить async - await , либо просто callback () .И то, и другое - плохая практика.Я хотел бы сделать что-то вроде этого:

console.log('Running updateRecordSet');

/* global HOSTED_ZONE_ID*/
/* global DNS_RECORD_NAME*/

HOSTED_ZONE_ID = 'xxxx';
DNS_RECORD_NAME = 'dns-record.internal.example.com.';

var aws = require('aws-sdk');
var route53 = new aws.Route53();

exports.handler = async (event) => {

const message = event.Records[0].Sns.Message;
console.log('SNS message:', message);

try {
  const data = JSON.parse(message);

  if (data.ip) {
      console.log('New IP: ', data.ip);

      var newRecord = {
      HostedZoneId: HOSTED_ZONE_ID,
      ChangeBatch: {
        Changes: [{
          Action: 'UPSERT',
          ResourceRecordSet: {
            Name: DNS_RECORD_NAME,
            Type: 'A',
            ResourceRecords: [{Value: data.ip}],
            TTL: 30,
          }
        }]
      }
    };

   let result = await route53.changeResourceRecordSets(newRecord);
   console.log(result);

  }
} catch(err) {
    console.error(err);
}

return message;
};

Также вы правы в отношении роли iam, вы получите ошибку аутентификации, если ваш код выполняет все функции правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...