Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 在CloudWatch计划事件中将上一个结果传递给下一个Lambda调用_Amazon Web Services_Amazon S3_Aws Lambda_Amazon Cloudwatch_Amazon Efs - Fatal编程技术网

Amazon web services 在CloudWatch计划事件中将上一个结果传递给下一个Lambda调用

Amazon web services 在CloudWatch计划事件中将上一个结果传递给下一个Lambda调用,amazon-web-services,amazon-s3,aws-lambda,amazon-cloudwatch,amazon-efs,Amazon Web Services,Amazon S3,Aws Lambda,Amazon Cloudwatch,Amazon Efs,说明 我将AWS CloudWatch事件设置为每5分钟调用一个Lambda函数 我想实现的是监视API的响应是否已更改。因此,我希望将上一次调用的结果传递给下一次调用,以便进行比较 结果是

说明

我将AWS CloudWatch事件设置为每5分钟调用一个Lambda函数

我想实现的是监视API的响应是否已更改。因此,我希望将上一次调用的结果传递给下一次调用,以便进行比较

结果是<200个元素的数组,因此非常小

我的考虑是:

  • 我可以使用S3在这里获取和检索结果
  • 使用AWS弹性文件系统(EFS)在调用之间存储数据
两种选择似乎都有很多火药可以用来射杀几只鸽子,所以我的问题是:


是否有一种更简单的方法在Lambda函数调用之间传递结果?没错,EFS的开销可能太大了

然而,amazons3和DynamoDB都非常适合在Lambda函数的单独调用之间持久化数据


Lambda服务本身不提供开箱即用的长期持久性。最好以无状态方式构建函数,并使用无服务器持久性服务(如S3或DynamoDB)来存储状态。

没错,EFS的开销可能太大了

然而,amazons3和DynamoDB都非常适合在Lambda函数的单独调用之间持久化数据


Lambda服务本身不提供开箱即用的长期持久性。最好以无状态的方式构建函数,并使用无服务器持久性服务(如S3或DynamoDB)来存储状态。

我允许自己根据@Marcin关于使用的评论添加一个答案,因为它解决了我的问题并解决了轻量级解决方案的要求

下面是一个计数器示例,每次调用Lambda函数时计数器都会递增:

// 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)
};
结果

Lambda调用1:
{previousResult:{count:0}}

Lambda调用2:
{previousResult:{count:1}}

Lambda调用3:
{previousResult:{count:2}}

权限

必须为Lambda函数添加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"
IAM角色声明:
-效果:“允许”
行动:
-“ssm:GetParameter”
资源:
-“arn:aws:ssm:::参数/SSMData”
-效果:“允许”
行动:
-“ssm:PutParameter”
资源:
-“arn:aws:ssm:::参数/SSMData”

我还允许自己根据@Marcin关于使用的评论添加一个答案,因为它解决了我的问题并解决了轻量级解决方案的要求

下面是一个计数器示例,每次调用Lambda函数时计数器都会递增:

// 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)
};
结果

Lambda调用1:
{previousResult:{count:0}}

Lambda调用2:
{previousResult:{count:1}}

Lambda调用3:
{previousResult:{count:2}}

权限

必须为Lambda函数添加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"
IAM角色声明:
-效果:“允许”
行动:
-“ssm:GetParameter”
资源:
-“arn:aws:ssm:::参数/SSMData”
-效果:“允许”
行动:
-“ssm:PutParameter”
资源:
-“arn:aws:ssm:::参数/SSMData”

谢谢您的回答。是的,ddb也是一种选择,但对于只存储一个文档来说,似乎也有很多选择。如果没有更简单的方法,那么我会把它和一个S3 bucket配对。DynamoDB不在乎存储一个元素还是100亿个元素。它可以根据您的需要进行扩展,这使它成为一个轻量级商店。S3也一样。谢谢你的回答。是的,ddb也是一种选择,但对于只存储一个文档来说,似乎也有很多选择。如果没有更简单的方法,那么我会把它和一个S3 bucket配对。DynamoDB不在乎存储一个元素还是100亿个元素。它可以根据您的需要进行扩展,这使它成为一个轻量级商店。与S3相同。如果数据不太多,您也可以将其存储在ssm参数存储中。如果数据不太多,您也可以将其存储在ssm参数存储中。