AWS Lambda не может вызвать другую AWS Lambda без VPC - NodeJs - PullRequest
0 голосов
/ 06 мая 2019

У меня есть две лямбда-функции AWS, функция A и функция B,
Обе лямбда-функции отсутствуют в VPC, поскольку ни одна из них не требует ресурсов VPC.
Обе лямбда-функции имеют присоединенную роль доступа LambdaFull.

Я могу вызвать и выполнить лямбду B из локальной сети,
Но не могу ни вызвать, ни выполнить лямбду B из лямбды A.

Мне нужно синхронное поведение -

line 1 ..
line 2, invoke lambda, get a response,
line 3 to use the response from line 2

Ниже приведены местные и лямбда-коды -

1.Местный -

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

let client = new AWS.Lambda({
    region: "us-east-1"
});

let payload = {
    "param1": "ABC",
    "param2": 123
};
payload = JSON.stringify(payload);

let params = {
    FunctionName: 'arn:aws:lambda:us-east-1:awsAccoutNumber:function:test2',
    InvocationType: "RequestResponse", 
    Payload: payload
};

console.log('Invoking Lambda ...');

client.invoke(params, function(err, data) {
    console.log('Lambda invoked!');

    if (err){ 
        console.log('Fail Case');
        console.log(err, err.stack);
    }
    else{     
        console.log('Success Case');
        console.log(data.Payload);
    }
});

2.Лямбда А -

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

exports.handler = async (event) => {

  let client = new AWS.Lambda({
      region: "us-east-1"
  });

  let payload = {
      "param1": "ABC",
      "param2": 123
  };
  payload = JSON.stringify(payload);

  let params = {
      FunctionName: 'arn:aws:lambda:us-east-1:awsAccountNumber:function:test2',
      InvocationType: "RequestResponse", 
      Payload: payload
  };

  console.log('Payload => \n', payload);
  console.log('\nParams => \n', params);
  console.log('\nAWS => \n', AWS.Lambda);
  console.log('\nClient => \n', client);

  console.log('Invoking Lambda ...');

  client.invoke(params, function(err, data) {
      console.log('Lambda invoked!');

      if (err){ 
          console.log('Fail Case');
          console.log(err, err.stack);
          return err;
      }
      else{     
          console.log('Success Case');
          console.log(data.Payload);
          return data.Payload;
      }
  });

};

3.Лямбда B -

exports.handler = async (event) => {
    console.log("Event => ", event);

    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

IAM Lambda Политика полного доступа -

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:DescribeChangeSet",
                "cloudformation:DescribeStackResources",
                "cloudformation:DescribeStacks",
                "cloudformation:GetTemplate",
                "cloudformation:ListStackResources",
                "cloudwatch:*",
                "cognito-identity:ListIdentityPools",
                "cognito-sync:GetCognitoEvents",
                "cognito-sync:SetCognitoEvents",
                "dynamodb:*",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "events:*",
                "iam:GetPolicy",
                "iam:GetPolicyVersion",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:ListAttachedRolePolicies",
                "iam:ListRolePolicies",
                "iam:ListRoles",
                "iam:PassRole",
                "iot:AttachPrincipalPolicy",
                "iot:AttachThingPrincipal",
                "iot:CreateKeysAndCertificate",
                "iot:CreatePolicy",
                "iot:CreateThing",
                "iot:CreateTopicRule",
                "iot:DescribeEndpoint",
                "iot:GetTopicRule",
                "iot:ListPolicies",
                "iot:ListThings",
                "iot:ListTopicRules",
                "iot:ReplaceTopicRule",
                "kinesis:DescribeStream",
                "kinesis:ListStreams",
                "kinesis:PutRecord",
                "kms:ListAliases",
                "lambda:*",
                "logs:*",
                "s3:*",
                "sns:ListSubscriptions",
                "sns:ListSubscriptionsByTopic",
                "sns:ListTopics",
                "sns:Publish",
                "sns:Subscribe",
                "sns:Unsubscribe",
                "sqs:ListQueues",
                "sqs:SendMessage",
                "tag:GetResources",
                "xray:PutTelemetryRecords",
                "xray:PutTraceSegments"
            ],
            "Resource": "*"
        }
    ]
}

Журналы просто пустыепосле строки -

client.invoke(params, function(err, data) {

"Invoking Lambda ..." - последний журнал, который я получаю при выполнении функции

Я обнаружил некоторый подобный случай, но, все еще неспособный выяснить проблему -
1. лямбда-вызов AWS, не вызывающий другую лямбда-функцию - Node.js
2. Nodejs - вызов AWS.Lambdaфункция из другой лямбда-функции
3. асинхронно вызывает лямбда-сигнал aws из другой лямбды

1 Ответ

3 голосов
/ 06 мая 2019

Проблема в том, что у вас есть асинхронная лямбда, но вы возвращаете синхронную функцию с обратным вызовом.

Это означает, что когда AWS вызывает Lambda A, он ожидает вызова client.invoke(), который немедленно возвращается (ваш обратный вызов будет вызван как часть более позднего события). Это приводит к завершению Lambda A и прекращению работы AWS.

Когда вы запускаете локально, Node фактически продолжает выполняться, пока не завершит все свои обратные вызовы, поэтому это происходит локально.

Чтобы заставить его работать, вы должны вернуть ожидаемое, например, в Lambda A:

 try {
   const data = await client.invoke(params).promise();
   console.log('Lambda invoked!');
   console.log('Success Case');
   console.log(data.Payload);
   return data.Payload;
 } catch (err) {
   console.log('Fail Case');
   console.log(err, err.stack);
   throw err;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...