我正在尝试对我的 AWS Node Lambda 进行单元测试。我正在使用MySQL。我有一个实用程序文件来获取 MySQL 连接池,它是我的处理程序中的依赖项。我正在尝试通过 Mocha 和 Sinon 对我的处理程序进行单元测试。我想存根或模拟数据库池和连接(没有实际创建数据库连接或访问数据库),但我没有任何运气。有谁知道如何实现这一目标?我创建了以下 2 个文件作为测试工具:
dbConn.js
const mysql = require('mysql2/promise');
async function getPool(options = {}) {
return await mysql.createPool(optionsClone);
}
module.exports = {
getPool
};
Run Code Online (Sandbox Code Playgroud)
getEmployees.js
const database = require('./dbConn');
exports.handler = async function(event, context, callback) {
// Connect to a database via connection pool
let pool = await database.getPool(dbOptions);
let conn = await pool.getConnection();
const dbResult = await conn.query('select * from employees');
conn.release();
return dbResult;
};
Run Code Online (Sandbox Code Playgroud) 我有一个CF模板,如下所示
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: gtm platform Lampda application deployment for ELasticCloud
Parameters:
SystemUserAccount:
Description: The syatem user account used to assume deployment role
Type: String
Default: usr-test1
DeploymentRoleName:
Description: The deployment role used to deploy cloudformation template
Type: String
Default: gtm-platform-deployment-role
GTMPlatformLambdaRoleName:
Description: The execution role for gtm platform
Type: String
Default: gtm-platform-lambda-role
GTMPlatformKMSKeyAliasName:
Description: The lambda function name for gtm platform
Type: String
Default: gtm-platform-kms-key
Resources:
GTMPlatformLambdaRole:
Type: AWS::IAM::Role
DependsOn:
- GTMPlatformKMSKey
Properties:
RoleName: !Ref GTMPlatformLambdaRoleName
AssumeRolePolicyDocument: …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建 Lambda 角色并为其附加一个策略以允许所有 ElasticSearch 集群操作。
下面是代码 -
resource "aws_iam_role" "lambda_iam" {
name = "lambda_iam"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [{
"Action": [
"es:*"
],
"Effect": "Allow",
"Resource": "*"
}]
}
EOF
}
resource "aws_lambda_function" "developmentlambda" {
filename = "lambda_function.zip"
function_name = "name"
role = "${aws_iam_role.lambda_iam.arn}"
handler = "exports.handler"
source_code_hash = "${filebase64sha256("lambda_function.zip")}"
runtime = "nodejs10.x"
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
Error creating IAM Role lambda_iam: MalformedPolicyDocument: Has prohibited field Resource
Run Code Online (Sandbox Code Playgroud)
关于资源的 Terraform 文档表示您可以为所有用户指定“*”。主要字段也不是强制性的,所以这不是问题。我还是改成了
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{ …Run Code Online (Sandbox Code Playgroud) 可以从另一个 VPC 中的另一个 lambda 调用位于一个 VPC 内的 lambda 函数。
我尝试使用 AWS VPC 终端节点执行此操作,但无法执行此操作。它标记错误 403。我正在执行以下步骤:https://aws.amazon.com/es/blogs/compute/introducing-amazon-api-gateway-private-endpoints/。
和https://cedrus.digital/aws-privatelink-with-api-gateway-and-lambda-functions/
我不确定是否应在将调用 lambda 或接收请求的 VPC 中创建 VPC 端点。
甚至,API网关资源政策是这样规定的:
{
"Statement": [
{
"Principal": "*",
"Action": [
"execute-api:Invoke"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
并且 VPC 终端节点策略为完全访问。
functions:
update:
handler: todos/update.update
events:
- http:
path: /update/{title}
method: put
Run Code Online (Sandbox Code Playgroud)
我必须如何定义路径参数才能使用无服务器框架将其传递给我的 AWS Lambda 函数?
我想用于 lambda 的语言是 Python3。
amazon-web-services python-3.x aws-lambda serverless-framework
我不太确定从哪里开始,因为我在这个主题上不是很有经验。我在 EC2 实例上有 Lambda API 和一些资源。我想以只能由 Lambda 访问的方式保护 EC2 上的这些资源。
为此,我将 Lamdba 添加到 VPC(我向 Lambda 添加了一个角色,以便它可以访问 VPC),将 lambda 添加到安全组,并将 VPC 子网地址设置为 lambda。
我现在有两个问题:
1-如何在 EC2 上打开此端口?我这样问是因为当我设置入站规则时,该端口就会向外部世界开放。默认情况下所有端口都是打开的吗?
2- 我应该使用什么地址从 Lambda 连接到 EC2?因为目前我正在使用公共地址(以 结尾的 DNS amazonws.com,但这肯定是错误的,首先是因为当我们将它们添加到 VPC 时 Lambda 会丢失互联网连接,并且因为我没有将此端口添加到入站规则中。
有人可以帮忙吗?
我正在 AWS Lambda 上测试 SQL Alchemy。引擎和会话位于单例中。根据观察到的行为,我的问题是为什么在 AWS Lambda 中,即使 Lambda 超时,SQL Alchemy 会话仍然存在。
为了测试该会话仍然存在,我使用了以下步骤:
使用 postgres 作为数据库,我启动了一个事务并运行了删除查询,但没有提交也没有回滚它。在workbenchJ中做了这个。
现在我调用了 lambda,并在 lambda 中对同一个表运行选择查询。
由于在 postgres 中 select 和 drop 不能同时运行,所以现在您可以检查 select 语句正在等待 drop 查询获取的锁。
我想创建一个 lambda 函数触发器来使用 SQS 队列中的消息。AWS官方文档说You can be Associated only a queue with a or more Lambda function
单个 lambda 函数可以成为多个队列的使用者吗?
举个例子,我有一个名为 MyFunction 的 lambda 函数和 2 个队列queue1 和queue2。lambda MyFunction可以成为两个队列的共同使用者吗?
我正在考虑构建如下工作流程:
我有一个应用程序,它将近 1000 个 csv 文件写入 s3 存储桶 MY_BUCKET 中的文件夹 MY_DIRECTORY。现在我想从 s3 存储桶解析这些文件并使用 Apache Airflow 加载到 MySQL 数据库中。
通过阅读此处的几篇文章:Airflow S3KeySensor - How to make it continue running and Airflow s3 connection using UI,我认为最好使用 AWS lambda 触发我的 Airflow DAG,一旦文件落在 s3 文件夹上,就会调用它。
作为 Airflow 和 Lambda 的新手,我不知道如何设置 lambda 来触发 Airflow DAG。在这方面,如果有人请指点一下,那将非常有帮助。谢谢。
我正在尝试获取预签名 URL以将文件上传到 S3 存储桶。这是我的工作流程:
1. 调用 Lambda -> 2. 获取预签名 URL -> 3. 使用文件点击 URL (PUT)
1. 调用Lambda
我确保 AWS 密钥具有正确的权限。事实上,它具有完全访问权限。这是源代码:
AWS.config.update({
accessKeyId: '*****************',
secretAccessKey: '*****************',
region: 'us-east-1',
signatureVersion: 'v4'
});
let requestObject = JSON.parse(event["body"]);
let fileName = requestObject.fileName;
let fileType = requestObject.fileType;
const myBucket = 'jobobo-resumes';
s3.getSignedUrl('putObject', {
"Bucket": myBucket,
"Key": fileName,
"ContentType": fileType
}, function (err, url) {
if (err) {
mainCallback(null, err);
} else {
mainCallback(null, url);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我从请求中获取文件名、文件类型(MIME)并使用它来创建签名。
2. 获取预签名 URL 当我点击 Lambda …
aws-lambda ×10
amazon-s3 ×2
amazon-vpc ×2
airflow ×1
amazon-ec2 ×1
amazon-iam ×1
amazon-kms ×1
amazon-sqs ×1
cloud ×1
javascript ×1
mysql ×1
python ×1
python-3.x ×1
sinon ×1
sqlalchemy ×1
terraform ×1
unit-testing ×1