Передача предыдущего результата в следующий вызов Lambda в запланированных событиях CloudWatch - PullRequest
0 голосов
/ 05 августа 2020

Описание

У меня есть AWS События CloudWatch, настроенные для вызова лямбда-функции каждые 5 минут.

Я хотел бы отслеживать, ответ API изменился. Поэтому я хотел бы передать результат предыдущего вызова следующему вызову для сравнения.

Результатом является массив из <200 элементов и, следовательно, довольно маленький. </p>

Мои соображения :

  • Я мог бы использовать S3 и получать и получать результаты здесь.
  • Используйте AWS Elasti c Файловую систему (EFS) для хранения данных между вызовами.

Оба варианта кажутся излишними для стрельбы по голубям, поэтому мой вопрос:

Есть ли более простой способ передавать результаты между вызовами лямбда-функций ?

Ответы [ 2 ]

1 голос
/ 05 августа 2020
• 1000 *

Вот пример счетчика, увеличивающегося каждый раз при вызове лямбда-функции:

// handler.js, Lambda entry point
const AWS = require('aws-sdk')
const ssm = new AWS.SSM();

const SSM_KEY = 'SSMData';

const getSSMData = async () => {

  var getParams = {
    Name: SSM_KEY,
  };

  try {
    const data = await new Promise((resolve, reject) => {
        ssm.getParameter(getParams, (error, data) => {
            if (error) reject(error)
            if (data) resolve(data)
        });
    });

    if (data.Parameter && data.Parameter.Value) {
        return JSON.parse(data.Parameter.Value)
    } else {
        return null
    }

  } catch (error) {

    return false
  }

}

const putSSMData = async (data) => {

  const jsonData = JSON.stringify(data)

  var putParams = {
    DataType: "text",
    Name: SSM_KEY, /* required */
    Type: 'String',
    Value: jsonData, /* Max 4kb */
    Overwrite: true
  };

  try {
    await new Promise((resolve, reject) => {
        ssm.putParameter(putParams, (error, data) => {
            if (error) reject(error)
            if (data) resolve(data)
        });
    });

    return true

  } catch (error) {

    console.log(error, error.stack);
    return false;
  }

};

module.exports.hello = async (event, context) => {

  let previousResult = await getSSMData()

  if (!previousResult) {
    previousResult = {
        count: 0
    }
  }

  console.log({ previousResult })

  const nextResult = { ...previousResult, count: previousResult.count + 1 }

  await putSSMData(nextResult)
};

Результат

Вызов лямбда-выражения 1: { previousResult: { count: 0 } }

Лямбда-вызов 2: { previousResult: { count: 1 } }

Лямбда-вызов 3: { previousResult: { count: 2 } }

...

Разрешения

Необходимо добавить роль IAM, чтобы лямбда-функция использовала SSM. Используя бессерверную структуру:

iamRoleStatements:
  - Effect: "Allow"
    Action:
      - "ssm:GetParameter"
    Resource:
      - "arn:aws:ssm:<REGION>:<ACCOUNT_ID>:parameter/SSMData"
  - Effect: "Allow"
    Action:
      - "ssm:PutParameter"
    Resource:
      - "arn:aws:ssm:<REGION>:<ACCOUNT_ID>:parameter/SSMData"
1 голос
/ 05 августа 2020

Вы правы, EFS, вероятно, будет слишком накладными.

Однако Amazon S3 и DynamoDB отлично подходят для сохранения данных между отдельными вызовами лямбда-функции.

Сама по себе служба Lambda не обеспечивает долговременное постоянство сразу после установки. Лучше проектировать функции без сохранения состояния и использовать бессерверные службы сохранения состояния, такие как S3 или DynamoDB, для хранения состояния.

...