我正在尝试使用 cloudformation 创建一个 lambda 函数,但它需要 lambda 执行角色 - 有没有一种方法可以使用 cloudformation 生成一个函数?
我正在尝试在 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 函数?
我有一个将所有日志组导出到 s3 的 lambda,目前正在使用它cloudwatchlogs.describeLogGroups来列出所有日志组。
const logGroupsResponse = await cloudwatchlogs.describeLogGroups({ limit: 50 })
Run Code Online (Sandbox Code Playgroud)
问题是我们有 69 个日志组,有什么方法可以列出 aws 账户中的所有日志组(ID 和名称)。我发现可以有 1000 个日志组。这是我们控制台的屏幕截图:

为什么cloudwatchlogs.describeLogGroups只允许 50 个这个很小的限制?
我们的流程需要 30 秒到 5 分钟不等,具体取决于事件。我们的基本架构如下(python 3.9,boto3将send_message发送到sqs):
VPC和NAT网关已配置。
我们发现,尽管函数调用已提前成功完成,但后续消息始终以 10 分钟为间隔进行处理。我们打算更有效地管理时间,并尝试将消息可见性超时默认缩短为 1 分钟,并在函数 B 执行期间每 30 秒延长 1 分钟(我们使用 boto3 client.change_message_visibility)。看起来它不起作用 - 几乎所有消息最终都会进入我们的死信队列(CloudWatch 日志没有表明任何错误)。
我们的代码:
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) 我的 AWS Lambda 有时无法接收来自 Monday.com 的事件消息。我正在使用容器化 Lambda 部署(通过 Docker)。流程是:
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) 我有一个用 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)
显然没有超过五分钟的超时时间。我读过有关幂等性的内容,但我没有看到这会成为问题,因为我所做的只是手动单击测试,而且我也没有看到任何重复运行的日志。
我错过了什么以及我做错了什么?
默认 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
我正在编写一个 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) 我正在使用 AWS 模块在 terraform 中构建 lambda,我的代码如下:
\nmodule "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
我想将 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)
但是,如果我使用 …
aws-lambda ×10
amazon-ec2 ×1
amazon-sqs ×1
amazon-vpc ×1
aws-cdk ×1
monday.com ×1
mongoose ×1
node.js ×1
python ×1
roles ×1
slack ×1
terraform ×1
timeout ×1
webhooks ×1