标签: aws-lambda

有没有办法使用 cloudformation 创建 aws lambda 执行角色?

我正在尝试使用 cloudformation 创建一个 lambda 函数,但它需要 lambda 执行角色 - 有没有一种方法可以使用 cloudformation 生成一个函数?

roles amazon-web-services aws-cloudformation aws-lambda

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

我可以创建 AWS SNS 主题的 Slack 订阅吗?

我正在尝试在 AWS 中创建一个 SNS 主题并订阅一个 lambda 函数,该函数将向 Slack 应用程序/用户发送通知。

我确实读过这篇文章 - https://aws.amazon.com/premiumsupport/knowledge-center/sns-lambda-webhooks-chime-slack-teams/

描述了如何使用此 lambda 代码执行此操作:

#!/usr/bin/python3.6
import urllib3
import json
http = urllib3.PoolManager()
def lambda_handler(event, context):
    url = "https://hooks.slack.com/services/xxxxxxx"
    msg = {
        "channel": "#CHANNEL_NAME",
        "username": "WEBHOOK_USERNAME",
        "text": event['Records'][0]['Sns']['Message'],
        "icon_emoji": ""
    }
    
    encoded_msg = json.dumps(msg).encode('utf-8')
    resp = http.request('POST',url, body=encoded_msg)
    print({
        "message": event['Records'][0]['Sns']['Message'], 
        "status_code": resp.status, 
        "response": resp.data
    })
Run Code Online (Sandbox Code Playgroud)

但问题是,在该实现中我必须为每个用户创建一个 lambda 函数。

我想要将多个 Slack 应用程序/用户订阅一个 SNS 主题。有没有一种方法可以做到这一点,而无需为每个函数创建 lambda 函数?

amazon-web-services aws-lambda slack

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

如何获取所有日志组名称

我有一个将所有日志组导出到 s3 的 lambda,目前正在使用它cloudwatchlogs.describeLogGroups来列出所有日志组。

const logGroupsResponse = await cloudwatchlogs.describeLogGroups({ limit: 50 })
Run Code Online (Sandbox Code Playgroud)

问题是我们有 69 个日志组,有什么方法可以列出 aws 账户中的所有日志组(ID 和名称)。我发现可以有 1000 个日志组。这是我们控制台的屏幕截图: 在此输入图像描述

为什么cloudwatchlogs.describeLogGroups只允许 50 个这个很小的限制?

amazon-web-services aws-lambda amazon-cloudwatchlogs

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

如何有效管理消息可见性超时?

我们的流程需要 30 秒到 5 分钟不等,具体取决于事件。我们的基本架构如下(python 3.9,boto3将send_message发送到sqs):

  • lambda 函数 A 查找数据库并决定事件
  • 事件被推送到标准 SQS 队列中(VisibilityTimeout:600)
  • lambda 函数 B 由 SQS 队列从点 (2) 触发 - 因为我们希望一次处理一条消息,所以触发器的 BatchSize 设置为 1,函数的 ReserveConcurentExecutions 也设置为 1。函数超时为 600。

VPC和NAT网关已配置。

我们发现,尽管函数调用已提前成功完成,但后续消息始终以 10 分钟为间隔进行处理。我们打算更有效地管理时间,并尝试将消息可见性超时默认缩短为 1 分钟,并在函数 B 执行期间每 30 秒延长 1 分钟(我们使用 boto3 client.change_message_visibility)。看起来它不起作用 - 几乎所有消息最终都会进入我们的死信队列(CloudWatch 日志没有表明任何错误)。

  • 成功执行 lambda 后是否不应该删除消息,导致立即处理下一条消息(我们的基本场景)?
  • 我们在尝试主动管理消息可见性超时时做错了什么?

我们的代码:

  1. 基本代码(在我们尝试优化整个过程的时间之前;至少它的工作方式是所有消息都已成功处理;但是它花费了太多时间,因为消息以 10 分钟的间隔处理,即使有些消息已处理)例如 2 分钟内):有关 SQS 和 lambda 函数 B 的 Template.yaml 摘录:
Globals:
  Function:
    Timeout: 30
    Environment:
      Variables:
        SQS_QUEUE_URL: !Ref SqsQueue
Resources:
  SqsQueue:
    Type: AWS::SQS::Queue
    Properties:
      VisibilityTimeout: …
Run Code Online (Sandbox Code Playgroud)

timeout amazon-sqs amazon-web-services aws-lambda

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

AWS Lambda - [错误](快速)无法保留:AlreadyReserved

我的 AWS Lambda 有时无法接收来自 Monday.com 的事件消息。我正在使用容器化 Lambda 部署(通过 Docker)。流程是:

  1. 有一个 Monday.com 板(就像 Excel 电子表格一样),正在其中输入一些数据。
  2. 每次创建新行时,Monday.com 都会将“ItemCreated”事件推送到我的 Lambda(使用 webhook)
  3. 每次更新列时,Monday.com 都会将“ItemUpdated”事件推送到我的 Lambda(使用 webhook)
  4. 当我几乎立即创建+更新记录时,“ItemCreated”事件会到达我的 Lambda,但第二个事件失败并显示以下消息
31 Mar 2022 20:51:03,614 [ERROR] (rapid) Failed to reserve: AlreadyReserved
Run Code Online (Sandbox Code Playgroud)

这是更大的日志:

2022-03-31 20:51:01.587 | Info | Functions.Post:: MONDAY 'item created' REQUEST
-
2022-03-31 20:51:01 | Info | Functions.SendCreateCommandAsync()
-
2022-03-31 20:51:01 | Info | Functions.SendCreateCommandAsync() Sending command :: {"PulseId":2452591832,"AssetName":null,"AssetType":"Webinar","CreatedDate":"2022-03-31T20:51:01.427Z"}
START RequestId: 8a5fa4f7-dacb-49ba-a9ac-4aa4f0797643 Version: $LATEST
31 Mar 2022 20:51:03,614 [ERROR] (rapid) Failed to reserve: AlreadyReserved
END RequestId: …
Run Code Online (Sandbox Code Playgroud)

webhooks aws-lambda monday.com

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

AWS Lambda函数总是触发两次

我有一个用 Python 编写的非常简单的 lambda 函数,我将其部署为弹性容器注册表 (ECR) 中的 Docker 映像。

它执行一个非常简单的任务,处理程序如下所示:

def handler(event, context):
...
    __send_email(msg)

handler(None, None)
Run Code Online (Sandbox Code Playgroud)

我对结果很满意,代码中没有错误,每次运行时我都会收到成功的电子邮件。

但是,当我单击“测试”时,它总是触发两次。

我尝试了两件事来解决它。首先我将超时设置为 5 分钟(大多数情况下运行大约需要 2.5 秒)。接下来,我将异步调用重试尝试次数设置为零。这些都不能解决问题。

但真正让我困惑的是我在日志中没有看到任何重复的调用。这就是我运行它时得到的全部:

START RequestId: 892f1091-92be-4360-be9e-0707c268d127 Version: $LATEST
END RequestId: 892f1091-92be-4360-be9e-0707c268d127
REPORT RequestId: 892f1091-92be-4360-be9e-0707c268d127  Duration: 1180.98 ms    Billed Duration: 2416 ms    Memory Size: 128 MB Max Memory Used: 46 MB  Init Duration: 1234.33 ms
Run Code Online (Sandbox Code Playgroud)

显然没有超过五分钟的超时时间。我读过有关幂等性的内容,但我没有看到这会成为问题,因为我所做的只是手动单击测试,而且我也没有看到任何重复运行的日志。

我错过了什么以及我做错了什么?

python amazon-web-services aws-lambda

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

设置 GatewayResponse 时指定的映射表达式无效

默认 API 网关响应采用以下形式:{"message":$context.error.messageString}。通过控制台更改此模板,"error"例如将其包装在对象中,效果很好。但是,当我在 CDK 中尝试时,在部署过程中出现错误Invalid mapping expression specified

代码(注意这实际上是默认模板):

webServiceApi.addGatewayResponse('4XX', {
   type: apigw.ResponseType.DEFAULT_4XX,
   responseHeaders: COMMON_HEADERS,
   templates: {
      'application/json': '{"message":$context.error.messageString}',
   },
});
Run Code Online (Sandbox Code Playgroud)

任何更改都会发生这种情况,包括我能找到的所有 AWS 编写的示例。AWS 中的各个地方都没有充分记录:CDK、SDK、API Gateway 和 CloudFormation,因此我很难找出那里出了什么问题?

云形成错误

Resource handler returned message: "Invalid mapping expression specified: Validation Result: warnings : [], errors : [Invalid mapping expression specified: *] (Service: ApiGateway, Status Code: 400, Request ID: [TRUNCATED], Extended Request ID: null)" (RequestToken: [TRUNCATED], HandlerErrorCode: InvalidRequest)
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-cloudformation aws-lambda aws-api-gateway aws-cdk

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

aws lambda节点js未启动ec2实例

我正在编写一个 ec2 调度程序逻辑来启动和停止 ec2 实例。lambda 用于停止实例。但是,启动函数并未启动 ec2 start。逻辑是根据 ec2 的标签和状态进行过滤,并根据当前状态启动或停止。

以下是启动 EC2 实例的代码片段。但这并没有启动实例。过滤正确发生并将实例推送到“stopParams”对象。

如果我通过过滤运行状态实例将逻辑更改为 ec2.stopInsatnces,则相同的代码将起作用。该角色具有启动和停止的权限。

有什么想法为什么它不触发启动吗?

 if (instances.length > 0){
                var stopParams = { InstanceIds: instances };
                ec2.startInstances(stopParams, function(err,data) {
                    if (err) {
                       console.log(err, err.stack);
                    } else {
                       console.log(data);
                    }
                    context.done(err,data);
                }); 
Run Code Online (Sandbox Code Playgroud)

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

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

修改 Lambda 函数配置时出错:Lambda 和 VPC 的 ValidationException

我正在使用 AWS 模块在 terraform 中构建 lambda,我的代码如下:

\n
module "lambda_function" {\n\n# * Lambda module configs\n  source  = "terraform-aws-modules/lambda/aws"\n  version = "3.0.0"\n\n  # * Lambda Configs\n  function_name = "${var.function_name}-${var.env}"\n  description   = "My Project"\n  handler       = local.constants.lambda.HANDLER\n  runtime       = local.constants.lambda.VERSION\n  memory_size                       = 128\n  cloudwatch_logs_retention_in_days = 14\n  source_path               = "./function/"\n  timeout                   = local.constants.lambda.TIMEOUT\n  create_async_event_config = true\n  maximum_retry_attempts    = local.constants.lambda.RETRIES_ATTEMPT\n    \n  layers = [\n    data.aws_lambda_layer_version.layer_requests.arn\n  ]\n\n  environment_variables = {\n    AWS_ACCOUNT        = var.env\n    SLACK_HOOK_CHANNEL = var.SLACK_HOOK_CHANNEL\n  }\n\n  tags = {\n    Name = "${var.function_name}-${var.env}"\n  }\n\n  trusted_entities = …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-vpc aws-lambda terraform terraform-provider-aws

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

连接 Mongoose 和 AWS Lambda 函数

我想将 lambda 函数与 Netlify 和 Mongoose 一起使用。基本上触发前端的函数并更新数据库。

const mongoose = require('mongoose')

let uri = 'mongodb+srv://...flashcard?retryWrites=true&w=majority'

let client = mongoose.connect(`${uri}`, {
  useNewUrlParser: true
}
);

const clientPromise = client.connect()

exports.handler = async (event, context, callback) => {
 
  context.callbackWaitsForEmptyEventLoop = false;
  
  try {    
 
    client = await clientPromise;
    client.db('flashcards').createCollection('hello')

    return {
      statusCode: 200,
    };
  } catch (err) {
    return {
      statusCode: 500,
      body: JSON.stringify({ msg: err.message }) 
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用并返回

500 Internal Server Error Cannot read properties of undefined (reading 'connect')
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用 …

mongoose aws-lambda

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