如何在所有lambda函数中共享公共文件

时间:2018-04-21 19:43:16

标签: node.js amazon-web-services amazon-s3 aws-lambda

我在AWS中有一些lambda函数(node.js),它们将连接到postgresql并进行一些查询并返回结果,所以我试图为数据库创建一个配置文件,其中包含用户,密码,数据库name,port ...那么将共享配置文件共享给所有lambda函数的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

AWS为此提供了两种服务。

  1. AWS Secrets Manager
  2. AWS Systems Manager Parameter Store
  3. AWS Secrets Manager是最新的服务,它具有版本控制的机密并自动旋转密钥。

    您可以将其存储为单个键或组合所有键,将它们存储为一个键。

    Secrets Manager示例:

    https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SecretsManager.html#getSecretValue-property

    var params = {
      SecretId: "MyTestDatabaseSecret", 
      VersionStage: "AWSPREVIOUS"
     };
     secretsmanager.getSecretValue(params, function(err, data) {
       if (err) console.log(err, err.stack); // an error occurred
       else     console.log(data);           // successful response
       /*
       data = {
        ARN: "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3", 
        CreatedDate: <Date Representation>, 
        Name: "MyTestDatabaseSecret", 
        SecretString: "{\n  \"username\":\"david\",\n  \"password\":\"BnQw&XDWgaEeT9XGTT29\"\n}\n", 
        VersionId: "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1", 
        VersionStages: [
           "AWSPREVIOUS"
        ]
       }
       */
     });
    

    Systems Manager参数存储:

    https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SSM.html#getParameter-property

    var params = {
      Name: 'STRING_VALUE', /* required */
      WithDecryption: true || false
    };
    ssm.getParameter(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
    });
    

    <强> EDIT1:

    为了从公共存储共享公共文件,现在不可能。您可以将文件存储在s3中并从那里拉出来。这将是一个沉重的冷启动。

答案 1 :(得分:1)

可以使用Layers在不同的Lambda函数之间共享通用文件。您可以为图层创建zip文件,几乎与为功能创建zip文件的方法相同。

该图层包看起来或多或少是这样的:

your-lambda-layer.zip
└ nodejs/node_modules/shared-package

在代码中可以这样引用:

const shared = require('shared-package');

shared-package可以包含您的代码或配置。

答案 2 :(得分:0)

使用AWS::Lambda::LayerVersionAWS::Serverless::LayerVersionAWS Lambda Layer中定义共享代码,然后在lambda函数中对其进行引用。例如,使用AWS SAM

  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: function_code/
      Handler: app.lambda_handler
      Runtime: nodejs8.10
      Layers:
        - !Ref MySharedLayer
  MySharedLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: SharedLayerName
      Description: Some shared code
      ContentUri: layer_code/
      CompatibleRuntimes:
        - nodejs8.10
      LicenseInfo: 'My License'
      RetentionPolicy: Retain

图层代码将在/opt文件夹中提供,并且可以包含在您的lambda函数中。