[英]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 函數的方法有很多種。
如果您的目標是將您的功能用作可以發送和接收請求和響應的 API,您可能應該選擇 API 網關集成。
API Gateway 上手非常簡單。
為 API 設置 IAM 角色和策略以調用 Lambda 函數
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "*" } ] }
為 Lambda 函數創建 API 資源
在 API 網關控制台中,創建一個 API。
在 API 的根目錄下創建/ResourceName資源。
根據您的要求創建 GET 或 POST 方法。
為集成類型選擇 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.