簡體   English   中英

無法將 Node.js AWS Lambda 函數部署到 Docker

[英]Unable to deploy the Node.js AWS Lambda function to Docker

我正在使用 Node.Js 開發 REST API。 我的技術棧是 AWS Lambda、API Gateway 和 RDS (MySQL)。 下面是我的代碼

角色.js

const mysql = require('mysql');
const con = mysql.createConnection({
  host     : "*****.rds.amazonaws.com",
  user     : "*****",
  password : "*****",
  port     : 3306,
  database : "******"
});

exports.lambdaHandler = (event, context, callback) => {
  // allows for using callbacks as finish/error-handlers
  context.callbackWaitsForEmptyEventLoop = false;
  const sql = "select * from role";
  con.query(sql, function (err, result) {
    if (err) throw err;

    var response = {
        "statusCode": 200,
        "headers": {
            "Content-Type": "application/json"
        },
        "body": JSON.stringify(result),
        "isBase64Encoded": false
    };
    callback(null, response)
  });
};

exports.selectRoleByIDHandler = (event, context, callback) => {

    const { id } = event.queryStringParameters;
    console.log("id", id); 

    // allows for using callbacks as finish/error-handlers
    context.callbackWaitsForEmptyEventLoop = false;
    const sql = "select * from role where idRole = "+id;
    con.query(sql, function (err, result) {
      if (err) throw err;
  
      var response = {
          "statusCode": 200,
          "headers": {
              "Content-Type": "application/json"
          },
          "body": JSON.stringify(result),
          "isBase64Encoded": false
      };
      callback(null, response)
    });
  };

下面是我的template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  node2

  Sample SAM Template for node2
  
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 100
    VpcConfig:
        SecurityGroupIds:
          - sg-sdsdsdsd
        SubnetIds:
          - subnet-ssdsds

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs14.x
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get
      Role: !GetAtt LambdaRole.Arn
      
  RoleFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello-world/
      Handler: roles.lambdaHandler
      Runtime: nodejs14.x
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /roles
            Method: get
      Role: !GetAtt LambdaRole.Arn

  SelectRolesByIDFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello-world/
      Handler: roles.selectRoleByIDHandler
      Runtime: nodejs14.x
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /selectRoleByIDHandler
            Method: get
      Role: !GetAtt LambdaRole.Arn
 
  LambdaRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - ec2:DescribeNetworkInterfaces
                  - ec2:CreateNetworkInterface
                  - ec2:DeleteNetworkInterface
                  - ec2:DescribeInstances
                  - ec2:AttachNetworkInterface
                Resource: '*'

當我嘗試執行sam local invoke ,出現以下錯誤

Error: You must provide a function logical ID when there are more than one functions in your template. Possible options in your template: ['HelloWorldFunction', 'RoleFunction', 'SelectRolesByIDFunction']

現在,我有兩個問題。

  1. 如何解決這個問題?
  2. 在 AWS Lambda 的單個文件中擁有多個函數是一種不好的做法嗎?

看起來您正在嘗試通過適用於 Javascipt 的 AWS 開發工具包構建 Lambda 函數。 您是否看過AWS SDK for JavaScript V3 DEV Guide中的 AWS 示例。 關於如何使用 JS API 構建 Lambda 函數的端到端說明可以為您提供幫助。

請參閱此主題和 TOC 中的子主題:

適用於 JavaScript 的 AWS 開發工具包的跨服務示例

我發現了這個問題,我不得不像sam local invoke HelloWorldFunction一樣sam local invoke HelloWorldFunction HelloWorldFunction是我需要部署的函數名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM