簡體   English   中英

從在本地系統而非 S3 上運行的 node.js 應用程序調用 AWS Lambda

[英]Invoke AWS Lambda from a node.js app running on local system not S3

我想從我系統上的 node.js 文件調用 AWS Lambda。 我按照在瀏覽器腳本中調用 Lambda 函數並為未經身份驗證的用戶創建了一個 Congnito 身份池,並將 IdentityPoolId 嵌入到節點 js 文件中,如下所示:

 let AWS = require('aws-sdk'); AWS.config.region = '<my-region>'; let lambda = new AWS.Lambda(); AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: '<my-identity-pool-id>' }); let params = { FunctionName: '<my-lambda-function>', InvocationType: 'RequestResponse', LogType: 'Tail', Payload: '{ "name": "my-name" }' } lambda.invoke(params, (err, data) => { if (err) { console.log(err); } else { if (data.Payload) { console.log('my-lambda-function said: ' + data.Payload); } } });

我的 Lambda 函數:

 exports.handler = function(event, context) { context.succeed('Hello ' + event.name); };

我創建了一個附加了 AWSLambdaExecute、AWSLambdaBasicExecutionRole 和 AmazonCognitoReadOnly 策略的 IAM 角色,我在創建 Lambda 時使用相同的角色,並且我在 Cognito 中為未經授權的訪問創建的身份池中更新了相同的角色。

當我運行 node app.js 時,我得到的只是錯誤:UnrecognizedClientException:請求中包含的安全令牌無效。

有人可以通過在我的本地系統上編寫一個簡單的 NodeJS 文件而不在 S3 存儲桶中上傳任何 HTML/CSS/JS 文件並且不使用 AccessKeyID、SecretKeyId,僅使用與 Lambda 關聯的角色來指出我調用 AWS lambda 的正確方向。

提前致謝。

調用 Lambda 函數的方法有很多種。

  • AWS 服務事件(例如:SNS 觸發)
  • 通過 AWS API Gateway 創建的 API。
  • Amazon CloudWatch cron 作業
  • 利用 AWS Lambda API 的 API 調用。

如果您的目標是將您的功能用作可以發送和接收請求和響應的 API,您可能應該選擇 API 網關集成。

API Gateway 上手非常簡單。

  • 准備好您的 Lambda 函數。
  • 為 API 設置 IAM 角色和策略以調用 Lambda 函數

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "*" } ] }
  • 為 Lambda 函數創建 API 資源

    1. 在 API 網關控制台中,創建一個 API。

    2. 在 API 的根目錄下創建/ResourceName資源。

    3. 根據您的要求創建 GET 或 POST 方法。

    4. 為集成類型選擇 AWS 服務,然后選擇您在相應區域創建的 Lambda 函數。

  • 現在,您可以根據您的要求使用身體映射模板自定義集成請求。

  • 您可以查看API Gateway Integration with Lambda的詳細文檔:

    在本節中,我們將引導您完成使用 AWS 服務和 Lambda 函數集成類型將 API 與 Lambda 函數集成的步驟。

  • 一旦您的測試調用成功,您就可以使用API_NAME/Dashboard中的 API 調用 URL,它類似於:

      https:// ###****.execute-api.us-west-2.amazonaws.com/{APIStageName}/

它可以用作 REST 端點,並且可以從本地的 Node js 函數調用。 不要忘記使用 API 密鑰為您的 API 啟用身份驗證。

此外,如果您要在此類環境中使用它,請查看生產清單。

我有同樣的問題,我能夠使用 Kinesis Stream 解決它。 Lambda 函數充當消費者。 您必須為 Lambda 函數創建一個觸發器,如下所示:

 function createTrigger (kinesisArn, lambdaName) { // Create params const for trigger const params = { EventSourceArn: kinesisArn, FunctionName: lambdaName, StartingPosition: 'LATEST', BatchSize: 100 } return new Promise((resolve, reject) => { lambda.createEventSourceMapping(params, (err, data) => { if (err) reject(err) else resolve(data) }) }) }

每次將新數據推送到 Kinesis 流時,都會調用您的 Lambda 函數。

以下是如何在 AWS Kinesis 流上發送數據的示例:

 function send(streamName, partition, msg) { const params = { Data: JSON.stringify(msg), // data you want to send to your Lambda function PartitionKey: partition, // an id for each shard StreamName: streamName } return new Promise((resolve, reject) => { kinesis.putRecord(params, (err, data) => { if(err) reject(err) else resolve(data); }) }); }

暫無
暫無

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

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