将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已设置。
请注意,当我说“在运行testing之前”,我的意思是在你开始之前 – 而不是在代码的顶部。
还请注意,访问密钥和密码不是来自您的IAM凭证的密码和密码。 调用AssumeRole为您提供临时密钥,临时密钥和临时令牌。