web-dev-qa-db-ja.com

AWS lambda invokeが別のラムダ関数を呼び出さない-Node.js

関数を呼び出すためのすべての権限を付与した後。私のLambda関数は別の関数を呼び出すことができません。 30 seconds timeoutの問題によりタイムアウトが発生するたびに。ラムダは別のラムダ関数を取得できないようです

私のラムダは同じリージョン、同じポリシー、同じセキュリティグループにあります。また、VPCは両方のラムダで同じです。唯一の違いは、ラムダ関数です

ここに役割の権利があります

1)AWSLambdaExecuteおよびAWSLambdaBasicExecutionRoleを作成しました

2)呼び出される1つのラムダ関数を作成しましたLambda_TEST

exports.handler = function(event, context) {
  console.log('Lambda TEST Received event:', JSON.stringify(event, null, 2));
  context.succeed(event);
};

3)以下に、別の関数を呼び出します。

var AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
var lambda = new AWS.Lambda();

exports.handler = function(event, context) {
 var params = {
   FunctionName: 'Lambda_TEST', // the lambda function we are going to invoke
   InvocationType: 'RequestResponse',
   LogType: 'Tail',
   Payload: '{ "name" : "Arpit" }'
 };

  lambda.invoke(params, function(err, data) {
   if (err) {
    context.fail(err);
   } else {
   context.succeed('Lambda_TEST said '+ data.Payload);
  }
 })
};

参照元: このリンク

36
Arpit Vaishnav

注意

2番目のlambdaを実行するlambdaexecutorで示します。


タイムアウトする理由

executorVPCの後ろに「ロック」されているため、すべてのインターネット通信がブロックされます。

その結果、http(s)呼び出しは、パケットが宛先に到達しないことを要求するため、タイムアウトになります。

_aws-sdk_によって実行されるすべてのアクションがタイムアウトになる理由です。


シンプルなソリューション

executorhaveVPCにしない場合-それを置くだけその中で、lambdaVPCなしでも機能します。

lambdaVPC内のリソースを呼び出す場合、lambdaVPCを見つける必要があります。

実際のソリューション

上記のことから、VPC内にあるリソースはインターネットにアクセスできません-それは正しくありません-わずかな構成作る必要があります。

  1. VPCを作成します。
  2. 2つのSubnetsを作成し、1つをprivateと、2番目のpublicと表示します(これらの用語は先に説明されているので、読み続けてください)。
  3. インターネットゲートウェイを作成します-これは、VPCをインターネットに接続する仮想ルーターです。
  4. NATゲートウェイを作成します-publicサブネットを選択し、新しい_elastic IP_を作成します(このIPはVPCに対してローカルです)-このコンポーネントは、通信を_internet-gateway_にパイプします。
  5. 2つルーティングテーブルを作成します-1つは名前付きpublic、2つ目はprivateです。

    1. publicルーティングテーブルで、Routesに移動し、新しいルートを追加します。

    宛先:0.0.0.0/0

    ターゲット:_internet-gateway_のID

    1. privateルーティングテーブルで、Routesに移動し、新しいルートを追加します。

    宛先:0.0.0.0/0

    ターゲット:_nat-gateway_のID

    • privateサブネットは、そのルーティングテーブル内にあるサブネットです。noが_internet-gateway_。

    • publicサブネットは、そのルーティングテーブルに存在するサブネットです-そこにexists_internet-gateway_


ここにあったものは?

次のようなものを作成しました。

VPC with NAT and IGW

これにより、privateサブネット内のリソースがインターネットを呼び出すことができます。より多くのドキュメントを見つけることができます こちら

62
johni

VPCに「固定」されているLambdaが他のLambdaを呼び出すことができないという同じ問題を経験しました。私はソリューションの構造をリファクタリングすることで、NATを使用せずにこの問題に取り組んできました。

いくつかのラムダ、A、B、C、D、...があり、これらのラムダがそれぞ​​れRDSデータベースにクエリアクセスできるようにしたいとします。このDBにアクセスするには、データベースと同じVPCにラムダを配置する必要があります。しかし、A、B、C、Dなどのさまざまなラムダが相互に呼び出すようにしたいと思います。だから、私はArpitが説明する問題に出くわします。

私は各Lambdaを2つのLambdaに分割することでこの問題に対処しています。もう1つは、データベースのクエリなど、「実際の」作業に焦点を当てています。それで、関数A_flow、B_flow、C_flow、D_flow、...ができました。関数A_worker、B_worker、C_worker、D_worker、...さまざまなフローラムダは特定のVPCに「固定」されていないため、他のラムダを呼び出すことができます。さまざまなワーカーLambdaはデータベースと同じVPCにあり、DBにクエリを実行できます。

各フローラムダは、DBと対話する作業を対応するワーカーラムダに「委任」します。ワーカーラムダの同期呼び出しを実行することにより、この委任を行います。ワーカーラムダは、他のラムダを呼び出しません。 (プロセスフローグラフの観点では、ワーカーラムダはターミナルノードです。)私自身のシステムでは、他のフローラムダによるフローラムダの呼び出しは一般に非同期です。ただし、必要に応じて同期することもできます。

回避策としてこのアプローチを考案しましたが、高レベルの機能設計を(a)プロセスフローと(b)DBリソースとの対話を含むより詳細な作業を明確に分離するという素晴らしい機能があります。

8
Jim Robertson