我需要使用 Go 对通过 AWS Lambda 上传的上传文件的内容进行一些简单的操作,但不确定如何解析接收内容,因为我是 Go 新手。到目前为止我找到的解决方案与http包和MultiPart表单函数有关。
type Request events.APIGatewayProxyRequest
func Handler(ctx context.Context, req Request) (Response, error) {
fmt.Println(req.Body)
....
}
Run Code Online (Sandbox Code Playgroud)
这就是我的请求正文的样子
------WebKitFormBoundaryx0SVDelfa90Fi5Uo
Content-Disposition: form-data; name="file"; filename="upload.txt"
Content-Type: text/plain
this is content
------WebKitFormBoundaryx0SVDelfa90Fi5Uo--
Run Code Online (Sandbox Code Playgroud)
我的请求是 的实例APIGatewayProxyRequest。
我想知道是否可以获得一个自定义结构,我可以从中访问 fe 等数据
customStruct.content => "this is content"
customStruct.fileName => upload.txt
customStruct.fileExtension => txt
Run Code Online (Sandbox Code Playgroud) 我找不到如何根据 Go 处理程序返回的错误在 Step 函数中定义错误条件匹配器的详细说明。
这handler是一个标准的 Go 函数,error如果从上游服务获取 503 则返回:
func HandleHotelBookingRequest(ctx context.Context, booking HotelBookingRequest) (
confirmation HotelBookingResponse, err error) {
...
if statusCode == http.StatusServiceUnavailable {
err = errors.New("TransientError")
} else {
Run Code Online (Sandbox Code Playgroud)
我可以控制函数返回的内容以及它如何格式化字符串;我找不到任何关于在这里使用什么的真实信息(或者在一个Catch子句中),所以这与上面的内容相匹配:
"Retry": [
{
"ErrorEquals": [
"TransientError"
],
"BackoffRate": 1,
"IntervalSeconds": 1,
"MaxAttempts": 3,
"Comment": "Retry for Transient Errors (503)"
}
]
Run Code Online (Sandbox Code Playgroud)
当我在控制台中测试 Lambda 时,当上游返回 503 时,我得到的结果(如预期):
{
"errorMessage": "TransientError",
"errorType": "errorString"
}
Run Code Online (Sandbox Code Playgroud)
我有一个明显的印象(但不太确定如何验证这一点),如果我更改为:
"ErrorEquals": [
"errorString"
],
Run Code Online (Sandbox Code Playgroud)
有效Retry(至少,查看 …
我正在尝试使用标准 SQS 调用 lambda 函数。我已经使用 try-catch 块处理了错误,每当捕获到错误时,就会返回该错误。否则,将返回 200 OK 响应消息。
我想重新处理返回错误的消息。但 lambda 不会重新处理这些消息。即使保留时间段(5 分钟)> 可见性超时(1 分钟) 为什么会发生这种情况?
const { spawnSync, execSync } = require('child_process');
const fs = require('fs');
const { S3Client, GetObjectCommand, PutObjectCommand } = require("@aws-sdk/client-s3");
const { DynamoDBClient, UpdateItemCommand } = require("@aws-sdk/client-dynamodb");
const { marshall } = require('@aws-sdk/util-dynamodb');
exports.lambdaHandler = async (event) => {
try {
const body = JSON.parse(event["Records"][0]['body']);
try {
// Code base 1
// All the above imported dependencies will be used here
const response = …Run Code Online (Sandbox Code Playgroud) 我的目标是使用存储 python 依赖项的 python 3.7 运行时为 aws lambda 函数上传一个小层,但我似乎无法让它识别模块。
我创建了一个Makefile来生成 zip 文件
create-lambda-layer:
docker run -dit --name AL amazonlinux:latest
docker cp requirements.in AL:/root/requirements.in
docker exec -it AL bash -c "yum update -y \
&& yum install -y python3.7 zip \
&& python3 -m pip install --upgrade pip \
&& pip install wheel \
&& mkdir -p /root/lambda/ \
&& pip install -r /root/requirements.in -t /root/lambda/ \
&& cd /root/lambda/ \
&& zip -r python.zip ."
docker cp AL:/root/lambda/python.zip …Run Code Online (Sandbox Code Playgroud) 我从 AWS lambda 容器中收到此错误Error: Runtime exited without providing a reason
当我在本地运行此容器时,我得到了exit code 0
但是当我在 Lambda 中运行它时,我收到了上面提到的错误exit code 0。
在这两种情况下,备份都会正确创建S3
我的容器运行此命令:
FROM alpine:3.14.2
ARG BUILD_ID
ARG BUILD_DATE
ARG VERSION=0.0.9
LABEL maintainer="Rostyslav Malenko"
LABEL version="$VERSION"
LABEL description="This is custom Alpine Docker Image for the create SQL dump from RDS to S3 directly."
LABEL org.label-schema.build-date=$BUILD_DATE
ENV BUILD_ID=${BUILD_ID} \
APPLICATION_VERSION=${VERSION} \
SERVICE_ROLE=backup \
NUMPROCS_WORKER=1 \
INSTALL_PACKAGES="gzip mysql-client aws-cli" \
WORKSD="/tmp"
RUN apk -v --update add --no-cache ${INSTALL_PACKAGES} && \ …Run Code Online (Sandbox Code Playgroud) 在我的账户 A 中,我有 S3 存储桶,其中对象是加密的默认 AWS 托管密钥 aws/s3。
我想从帐户 B lambda 读取这些对象。但与帐户 A 中的对象一样,对象是使用 AWS 托管密钥 aws/s3 加密的,我无法在此处修改 KMS 密钥策略。
我尝试在帐户 A 中创建一个角色,该角色拥有所有 KMS 和 S3 权限,并信任帐户 B 中的角色。然后从帐户 B 我在 A 中承担此角色。但仍然得到
Access denied error in GetObject
我可以在这里做什么来从帐户 A 读取对象。请指导。
账户 A 中的角色
statement
{
Action: kms:*
Resource : "*"
Effect: allow
}
{
Action: S3:*
Resource :
arn:aws:s3:::my-s3
arn:aws:s3:::my-s3/*
Effect: allow
}
Run Code Online (Sandbox Code Playgroud) amazon-s3 amazon-web-services amazon-iam aws-lambda amazon-kms
本页介绍如何使用“python:buster”创建与 Lambda 一起使用的 Docker 映像
https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-create-from-alt
我想对“python:alpine”做同样的事情
但在尝试安装“libcurl4-openssl-dev”时遇到问题
有人成功构建了用于 lambda 的“python:alpine”图像吗?
我有引用一个层的 lambda,该层由其他人维护,当发布新版本时,我必须更新我的 terraform 代码以将最新版本放入 arn(此处为 19)。
有没有办法在 terraform 脚本中获取最新版本并使用它?
module "lambda_function" {
source = "terraform-aws-modules/lambda/aws"
function_name = "my-lambda1"
description = "My awesome lambda function"
handler = "index.lambda_handler"
runtime = "python3.8"
source_path = "../src/lambda-function1"
tags = {
Name = "my-lambda1"
}
layers = [
"arn:aws:lambda:eu-central-1:587522145896:layer:my-layer-name:19"
]
}
Run Code Online (Sandbox Code Playgroud)
谢谢。
ps:这意味着该图层的 terraform 脚本不在我的脚本中,它是我无权访问的其他脚本。
我在本地主机上进行了测试,然后在 s3 上进行了检查,发现创建了一个新文件。但是在Lambda上测试时,虽然没有报错,但是S3上却没有文件。s3.upload(params).promise()的日志也不会显示。
var fs = require('fs');
var AWS = require('aws-sdk');
exports.handler = async (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false
try {
AWS.config.update({
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey
});
var s3 = new AWS.S3();
var path = 'myfile.txt';
var file_buffer = fs.readFileSync(path);
console.log(file_buffer);
var params = {
Bucket: 'bucket-dev',
Key: '2222.txt',
Body: file_buffer
};
console.log("1111");
s3.upload(params).promise()
.then(function(data) {
console.log("Successfully uploaded to");
callback(null, "All Good");
})
.catch(function(err) {
console.error(err, err.stack);
callback(err);
});
console.log("2222");
return context.logStreamName
} catch (err) {
console.log(err); …Run Code Online (Sandbox Code Playgroud) 我有一个使用 JavaScript 构建的 AWS CDK 堆栈。堆栈有多个 lambda。其中大部分是用 JavaScript 编写的。我想在 python 中添加一个 lambda 。当我不导入外部依赖项时,python lambda 工作正常,但在安装它们时不理解。我尝试将软件包安装在一个package文件夹或一个python文件夹中,并按照这些文章的建议进行压缩,但没有成功:
https://docs.aws.amazon.com/lambda/latest/dg/python-package.html https://aws.amazon.com/premiumsupport/knowledge-center/lambda-import-module-error-python/
我收到的错误是"Unable to import module 'py1': No module named 'x'"
(x 指我尝试导入的任何包名称)
我的javascript CDK库代码是这样的:
// javascript lambda
new lambda.Function(this, 'lambda-js1', {
functionName: `js1`,
code: lambda.Code.fromAsset('assets/lambdajs'),
handler: 'js1.handler',
runtime: lambda.Runtime.NODEJS_14_X,
})
// python lambda
new lambda.Function(this, 'lambda-py1', {
functionName: `py1`,
code: lambda.Code.fromAsset('assets/lambdapy'),
handler: 'py1.handler',
runtime: lambda.Runtime.PYTHON_3_8,
})
Run Code Online (Sandbox Code Playgroud)
assets/lambdapy我在使用中安装了依赖项
pip install x
pip install --target ./package x
pip install -t …Run Code Online (Sandbox Code Playgroud) aws-lambda ×10
amazon-s3 ×3
docker ×2
go ×2
python ×2
alpine-linux ×1
amazon-iam ×1
amazon-kms ×1
amazon-sqs ×1
aws-cdk ×1
containers ×1
dockerfile ×1
file-upload ×1
node.js ×1
retry-logic ×1
terraform ×1