関数を呼び出すためのすべての権限を付与した後。私の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);
}
})
};
参照元: このリンク
2番目のlambda
を実行するlambda
をexecutorで示します。
executorはVPC
の後ろに「ロック」されているため、すべてのインターネット通信がブロックされます。
その結果、http(s)
呼び出しは、パケットが宛先に到達しないことを要求するため、タイムアウトになります。
_aws-sdk
_によって実行されるすべてのアクションがタイムアウトになる理由です。
executorがhaveをVPC
にしない場合-それを置くだけその中で、lambda
はVPC
なしでも機能します。
lambda
がVPC
内のリソースを呼び出す場合、lambda
でVPC
を見つける必要があります。
上記のことから、VPC
内にあるリソースはインターネットにアクセスできません-それは正しくありません-わずかな構成作る必要があります。
VPC
を作成します。VPC
をインターネットに接続する仮想ルーターです。elastic IP
_を作成します(このIPはVPC
に対してローカルです)-このコンポーネントは、通信を_internet-gateway
_にパイプします。2つルーティングテーブルを作成します-1つは名前付きpublic、2つ目はprivateです。
宛先:0.0.0.0/0
ターゲット:_
internet-gateway
_のID
宛先:0.0.0.0/0
ターゲット:_
nat-gateway
_のID
privateサブネットは、そのルーティングテーブル内にあるサブネットです。noが_internet-gateway
_。
publicサブネットは、そのルーティングテーブルに存在するサブネットです-そこにexists_internet-gateway
_
次のようなものを作成しました。
これにより、privateサブネット内のリソースがインターネットを呼び出すことができます。より多くのドキュメントを見つけることができます こちら 。
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リソースとの対話を含むより詳細な作業を明確に分離するという素晴らしい機能があります。