标签: aws-lambda

AWS Lambda Authorizer `event` 对象中缺少 `body` 参数

缺少事件对象body和isBase64Encoded属性。但是根据文档,它们应该在那里完整的结构如下:

{
    "type": "REQUEST",
    "methodArn": "arn:aws:execute-api:us-west-2:*******:*******/development/POST/auth/login",
    "resource": "/{proxy+}",
    "path": "/auth/login",
    "httpMethod": "ANY",
    "headers": {
       .....
    },
    "queryStringParameters": {
        "test": "123"
    },
    "pathParameters": {
        "proxy": "auth/login"
    },
    "stageVariables": {
        "lambdaVersion": "development"
    },
    "requestContext": {
        "path": "/development/auth/login",
        "accountId": "*****",
        "resourceId": "f8wvnk",
        "stage": "development",
        "requestId": "****",
        "identity": {
            ....
        },
        "resourcePath": "/{proxy+}",
        "httpMethod": "POST",
        "apiId": "********"
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有人有类似的问题?

aws-lambda

8
推荐指数
1
解决办法
2693
查看次数

Cognito、API Gateway 和 Lambda 假设 Cognito 用户的身份

我正在构建一个 React 应用程序,使用 API Gateway、lambda 和 cognito(基本上从https://serverless-stack.com教程开始)。我想为我的 DynamoDb 设置细粒度的访问控制(即通过基于登录用户限制对 DynamoDb 表的访问的 IAM 策略 - 如https://docs.aws.amazon.com/IAM/latest/UserGuide/ reference_policies_examples_dynamodb_rows.html )

AFAIK,一个 lambda 函数承担一个服务角色,如 serverless.yml 文件中定义的那样,它本身与附加到登录的 cognito 用户的 AIM 策略无关。我知道使用aim_authorizer,我可以获得登录用户的信息。

我的问题:是否可以让 lambda 代表给定的认知用户执行 AWS 调用,从而遵守附加到该用户的 IAM 策略?(有点类似于 serverless-stack 教程如何与 S3 交互)

欢迎所有建议。

aws-lambda serverless

8
推荐指数
1
解决办法
267
查看次数

如何在 AWS Lambda 函数中进行外部 api 调用

我遇到了Lambda 函数的问题,由于某种原因它超时了。

我尝试添加一些 console.log 以了解发生了什么,并且 一切正常,直到外部 http 请求。

我使用npm 模块请求

我可以在请求之前看到日志,但回调中的日志永远不会出现,就像端点没有响应一样。

我错过了什么吗?提前致谢!

var mysql = require('mysql'); 
var request = require('request');
var config = require('./config.json'); 

var pool = mysql.createPool({
  host: config.dbhost,
  user: config.dbuser,
  password: config.dbpassword,
  database: config.dbname
});

var openWeatherOptions = (device) => {
    let domain = 'https://api.openweathermap.org/data/2.5/';
    let apiEndpoint = 'weather?';
    let params = `lat=${device.lat}&lon=${device.lng}&APPID=${process.env.WEATHER_APP_ID}&units=metric`;
    let url = [domain, apiEndpoint, params].join('').toString();
    return {
      url: url,
      method: 'GET',
      headers: { 'Content-Type': 'application/json'},
    };
}; …
Run Code Online (Sandbox Code Playgroud)

node.js aws-lambda npm-request

8
推荐指数
1
解决办法
3万
查看次数

如何在 AWS Lambda 函数中拥有多个处理程序?

我有一个非常大的 python 文件,它由多个定义的函数组成。如果您熟悉 AWS Lambda,当您创建 lambda 函数时,您会指定一个处理程序,它是代码中的一个函数,AWS Lambda 在服务执行我的代码时可以调用它,在下面的 my_handler.py 文件中表示:

    def handler_name(event, context):
    ...
    return some_value
Run Code Online (Sandbox Code Playgroud)

链接来源:https : //docs.aws.amazon.com/lambda/latest/dg/python-programming-model-handler-types.html

然而,正如我上面提到的,我在 my_handler.py 中有多个定义的函数,它们有自己的事件和上下文。因此,这将导致错误。在python3.6中有什么方法可以解决这个问题吗?

amazon-web-services python-3.x aws-lambda python-3.6

8
推荐指数
2
解决办法
1万
查看次数

AWS Lambda 上的 Headless Chrome Python 3.8 - 意外退出。状态代码是:127

我正在尝试在 AWS Lambda 中安装/运行 Head-Less Chrome,但是当我通过 Lambda 对其进行测试时出现以下错误。

"errorMessage": "消息:服务 /tmp/bin/chromedriver 意外退出。状态代码为:127\n", "errorType": "WebDriverException"

我在 Linux 上使用 ChromeDriver 83.0.4103.39。

在 Python 中执行的步骤:

  1. 在 Lambda 中创建 /tmp/bin
  2. 将 Chrome 驱动程序复制到 /tmp/bin
  3. 将权限更改为 0777

蟒蛇代码:

在以下行上抛出错误 -

driver = webdriver.Chrome(chrome_options=chrome_options, executable_path = "/tmp/bin/" + chrome_linux_driver)

当我在具有相同 Windows Chrome 驱动程序的 Windows 下运行时,代码工作正常。

任何帮助都非常感谢。

python selenium selenium-chromedriver aws-lambda

8
推荐指数
1
解决办法
654
查看次数

Express.js 应用程序无服务器,使用 Lambda 或函数 - 一个好主意?

免责声明:我承认这更像是一个广泛的最佳实践问题,而不是一个特定的编程问题,但是,我相信 SO 群是它的最佳受众。我知道这个类似的问题(我应该在无服务器应用程序中使用 Express.js 吗?),但答案似乎没有回答我的问题。

出于典型原因,我想将 Express.js 从 AWS Lightsail/EC2 迁移到无服务器,而 Lambda 是我的首选武器。但是,将整个框架连同其上的应用程序一起视为函数可能有点笨重,因此可能不适合在 AWS Lambda 或 Google/Azure Functions 上运行。虽然我确信这是可行的,但这是个好主意吗?这种设置不会降低效率并使处理诸如会话状态之类的事情变得复杂,最终会破坏无服务器功能的目的吗?

express aws-lambda azure-functions serverless aws-serverless

8
推荐指数
1
解决办法
1365
查看次数

上传的文件必须是非空的 zip(服务:AWSLambdaInternal;状态代码:400;错误代码:InvalidParameterValueException;

我有一个简单的 Express/Node.js 应用程序,其中包含以下没有子目录的文件(除了 .serverless 和 node_modules)。

  • .serverless
  • 节点模块
  • 应用程序.js
  • 拉姆达.js
  • 包.json
  • 包-lock.json
  • 无服务器.yml

AWS 抛出此错误 -发生错误:ApiLambdaFunction - 上传的文件必须是非空 zip(服务:AWSLambdaInternal;状态代码:400;错误代码:InvalidParameterValueException;请求 ID:5779d4c3-beaa-4bc2-b525-c1e89a82635a;空值)。

当我访问代码上传到的 S3 存储桶时,.zip 文件不是空的。我能够看到 .zip 文件夹及其所有内容,但是,serverless deployAWS CLI的操作失败,引发上述异常。任何帮助将问题归零将不胜感激。谢谢!

以下是代码。

  • 应用程序.js
const express = require("express")
const app = express();

app.use(express.json());
app.use(express.urlencoded({extended: false}));

app.get("/", (req, res) => {
    res.status(200).send("Root endpoint")
})

app.post("/postReq", (req, res) => {
    res.status(200).send(req.body);
})

app.listen(8080, () => console.log("App started."))

Run Code Online (Sandbox Code Playgroud)
  • 拉姆达.js
'use strict'
const awsServerlessExpress = require('aws-serverless-express')
const app = require('./app')
const server = awsServerlessExpress.createServer(app)

exports.handler …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services node.js aws-lambda aws-serverless

8
推荐指数
2
解决办法
4748
查看次数

如何验证 getOpenIdTokenForDeveloperIdentity 认知令牌

我正在使用 aws lambdas、dynamodb 和 cognito 构建身份验证系统。

坚持比较 getOpenIdTokenForDeveloperIdentity() 提供的令牌;调用来自服务器的特定身份。

我正在通过以下方式获取令牌和身份:

function getToken(email, fn) {
    var param = {
        IdentityPoolId: cognitoIdentityPoolId,
        Logins: {} // To have provider name in a variable
    };
    param.Logins[cognitoDeveloperProvidedName] = email;
    cognitoidentity.getOpenIdTokenForDeveloperIdentity(param,
        function(err, data) {
            if (err) return fn(err); // an error occurred
            else fn(null, data.IdentityId, data.Token); // successful response
        });
}
Run Code Online (Sandbox Code Playgroud)

然后据我所知,我可以从 cognito 中获取已经生成的令牌(而不是创建一个新令牌),如下所示:

function checkToken(IdentityId, email, fn){
    var param = {
        IdentityPoolId: cognitoIdentityPoolId,
        IdentityId: IdentityId,
        Logins: {}
    };
    param.Logins[cognitoDeveloperProvidedName] = email;
    cognitoidentity.getCredentialsForIdentity(param, 
        function(err, data) { …
Run Code Online (Sandbox Code Playgroud)

javascript amazon-web-services amazon-cognito aws-lambda

7
推荐指数
1
解决办法
2715
查看次数

如何跟踪 AWS Lambda 错误重试次数

如果出现错误或异常,Java AWS Lambda 最多会尝试重新调用该函数 3 次。有没有办法跟踪当前的调用计数,即知道它是第一次、第二次还是第三次调用?谢谢

aws-lambda

7
推荐指数
1
解决办法
1092
查看次数

Cloudfront 和 Lambda@Edge:删除响应标头

我正在尝试在 ViewerResponse 事件上使用 Lambda@Edge 从 Cloudfront 响应中删除一些标头。源是一个 S3 存储桶。

我已经成功地改变了这样的标题:

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;
    response.headers.server = [{'key': 'server', 'value': 'bunny'}];
    callback(null, response);
};
Run Code Online (Sandbox Code Playgroud)

但是,将所有标题一起删除似乎不起作用,例如像这样。

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;
    delete response.headers.server;
    // or response.header.server = null;
    // or response.headers.server = [{'key': 'server', 'value': null}];
    callback(null, response);
};
Run Code Online (Sandbox Code Playgroud)

此代码段不会删除但将服务器标头从 更改server: AmazonS3为server: CloudFront。所以我假设服务器标头可能是强制性的并且会自动填充。但我也无法删除 CloudFront 生成的其他标头。在 lambda 测试窗格中,该函数按预期工作。所以在 Lambda 函数完成后会发生一些事情。

作为背景,我想更改标题,因为该站点在重要客户的网络中被阻止,并显示它是在线存储或备份位置的消息。

我错过了什么?

javascript amazon-s3 amazon-cloudfront aws-lambda

7
推荐指数
1
解决办法
4204
查看次数