标签: aws-lambda

Sinon单元测试MySQL连接

我正在尝试对我的 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)

javascript mysql unit-testing sinon aws-lambda

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

策略包含具有一个或多个无效委托人的语句 - AWS Cloudformation 错误

我有一个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)

aws-cloudformation aws-lambda amazon-kms aws-serverless

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

创建 IAM 角色时出错:MalformedPolicyDocument:已禁止字段资源

我正在尝试创建 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)

amazon-iam aws-lambda terraform

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

AWS在VPC内调用Lambda到另一个VPC中的另一个Lambda

可以从另一个 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 终端节点策略为完全访问。

amazon-web-services amazon-vpc aws-lambda

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

在无服务器框架中使用路径参数

 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

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

让Lambda通过VPC访问EC2端口

我不太确定从哪里开始,因为我在这个主题上不是很有经验。我在 EC2 实例上有 Lambda API 和一些资源。我想以只能由 Lambda 访问的方式保护 EC2 上的这些资源。

为此,我将 Lamdba 添加到 VPC(我向 Lambda 添加了一个角色,以便它可以访问 VPC),将 lambda 添加到安全组,并将 VPC 子网地址设置为 lambda。

我现在有两个问题:

1-如何在 EC2 上打开此端口?我这样问是因为当我设置入站规则时,该端口就会向外部世界开放。默认情况下所有端口都是打开的吗?

2- 我应该使用什么地址从 Lambda 连接到 EC2?因为目前我正在使用公共地址(以 结尾的 DNS amazonws.com,但这肯定是错误的,首先是因为当我们将它们添加到 VPC 时 Lambda 会丢失互联网连接,并且因为我没有将此端口添加到入站规则中。

有人可以帮忙吗?

amazon-ec2 amazon-web-services amazon-vpc aws-lambda

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

为什么 sqlalchemy 会话保持打开状态,即使 lambda 超时

我正在 AWS Lambda 上测试 SQL Alchemy。引擎和会话位于单例中。根据观察到的行为,我的问题是为什么在 AWS Lambda 中,即使 Lambda 超时,SQL Alchemy 会话仍然存在。

为了测试该会话仍然存在,我使用了以下步骤:

使用 postgres 作为数据库,我启动了一个事务并运行了删除查询,但没有提交也没有回滚它。在workbenchJ中做了这个。

现在我调用了 lambda,并在 lambda 中对同一个表运行选择查询。

由于在 postgres 中 select 和 drop 不能同时运行,所以现在您可以检查 select 语句正在等待 drop 查询获取的锁。

python sqlalchemy aws-lambda

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

Lambda 函数与多个 SQS 队列集成

我想创建一个 lambda 函数触发器来使用 SQS 队列中的消息。AWS官方文档说You can be Associated only a queue with a or more Lambda function

单个 lambda 函数可以成为多个队列的使用者吗?

举个例子,我有一个名为 MyFunction 的 lambda 函数和 2 个队列queue1 和queue2。lambda MyFunction可以成为两个队列的共同使用者吗?

amazon-sqs amazon-web-services aws-lambda

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

使用从 S3 事件调用的 AWS Lambda 触发 Airflow DAG

我正在考虑构建如下工作流程:

我有一个应用程序,它将近 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。在这方面,如果有人请指点一下,那将非常有帮助。谢谢。

amazon-s3 aws-lambda airflow

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

AWS S3 的 put 对象的 getSignedUrl 返回 403

我正在尝试获取预签名 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 …

cloud amazon-s3 amazon-web-services aws-lambda

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