将AWSconfiguration传递给导入的模块

我正在尝试通过在本地运行JS单元来testingJS AWS Lambda。 为了模拟Lambda环境,我假定Lambda与AWS.config.credentials具有相同的angular色,然后简单地调用我导入的Lambda函数。

这工作如果我复制和粘贴到testing文件的Lambda函数,但如果我导入它然后似乎函数运行一个干净的AWS.config没有我的configuration。 我可以更改Lambda模块导入AWS的方式(使其成为全局或执行其他操作),以便从testing中获取configuration,但是我更愿意将文件保存为应该上传到Lambda的文件。

在AWS Lambda中,AWS凭证以某种方式预先configuration,而模块不必执行任何操作,我想模拟该function。 这怎么能在Node中完成?

编辑:您可以在AWS Lambda中运行任何示例函数。 例如,只需在适当的AWS Lambda中运行下面的代码即可。

var AWS = require("aws-sdk"); var dynamo = new AWS.DynamoDB.DocumentClient(); dynamo.query(...) 

要在本地运行,必须在此代码之前加上以下内容:

 AWS.config.update({region: 'us-east-1'}); AWS.config.credentials = new AWS.SharedIniFileCredentials(); AWS.config.credentials = new AWS.TemporaryCredentials({ RoleArn: 'arn:aws:iam::1234567890:role/TemporaryCredentials', }); 

问题是,在unit testing文件中运行此configuration步骤不会使configuration可用于导入的lambda函数,因此不能正确模拟环境。

这是我的解决scheme使用笑话 。 当然,你可以适应其他testing框架。 我只是觉得jest更容易。

基本上,你创buildaws-sdk模块的模拟,返回实际的aws-sdk模块你自己的修改。

 // __mocks__/aws-sdk.js (Jest automocks this module if you follow this convention) 'use strict'; const AWS = require('AWS'); // Make your own modifications AWS.config.update({region: 'us-east-1'}); AWS.config.credentials = new AWS.SharedIniFileCredentials(); AWS.config.credentials = new AWS.TemporaryCredentials({ RoleArn: 'arn:aws:iam::1234567890:role/TemporaryCredentials', }); //export modified module module.exports = AWS 

有了这个,当你的lambda需要aws-sdk ,它会加载这个模块。 而它与实际的aws-sdk模块和你的额外的configuration。

参考: https : //facebook.github.io/jest/docs/en/manual-mocks.html#content

在运行testing之前,您需要调用STS.AssumeRole并获取临时凭证,并将其放入环境中。 Lambda似乎是这样做的。 该服务调用AssumeRole,获取临时凭证,并将其放在SDK期望的地方。

 AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN 

如果您在正在运行的Lambda函数中检查process.env ,则会看到这些variables已设置。

http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-environment.html

请注意,当我说“在运行testing之前”,我的意思是在你开始之前 – 而不是在代码的顶部。

还请注意,访问密钥和密码不是来自您的IAM凭证的密码和密码。 调用AssumeRole为您提供临时密钥,临时密钥和临时令牌。