Tag: aws lambda

执行等待异步操作时的AWS Lambda行为?

假设APIGateway触发一个等待10秒的函数(处理程序) public async Task Get(APIGatewayProxyRequest request, ILambdaContext context){ var x = await Wait10Async(); return SomeAPIGatewayProxyResponse; } Q1:当await将控制流返回给函数处理程序本身时,这个容器(执行环境)会发生什么? 显然Lambda在返回到APIGateway之前等待Task完成,但在这10秒内容器(或其他)是否接受并执行更多Get函数? 问题背后的原因是AWS Lambda有1000个并发执行限制,它说每个执行都在不同的容器中运行,因此它让我对这个场景提出质疑: 1 – APIGateway接收1000个同时请求并启动1000个Lambda处理程序,在10秒后完成 在第一次请求之后(在完成之前) 2 – 3秒,另一个让100个请求来到APIGateway。 在这种情况下,所有lambda容器都已耗尽。 这是发生了什么或await有解决这个问题的魔力? 我知道await如何阻止经典视图应用程序中的循环。 但它在Lambda执行环境中的表现如何?

AWS Lambda和.NET Core – 使用Linux运行时?

我正在编写一个C#(.NET Core)的Alexa技能,可以从AWS Lambda函数(在Amazon Linux上运行)运行。 当我编译项目( dotnet发布 )时,我收到错误: 无法找到与其中一个目标运行时兼容的框架’.NETCoreApp,Version = v1.0’的运行时目标:’win10-x64,win81-x64,win8-x64,win7-x64’。 可能的原因: 项目尚未还原或还原失败 – 运行dotnet还原 该项目未在“运行时”部分列出“win10-x64,win81-x64,win8-x64,win7-x64”之一。 您可能正在尝试发布不受支持的库。 使用dotnet pack分发库。 如果我指定一个Windows运行时(例如win10-x64 ),它将编译正常,但是我的一个依赖项(Google表格API)在运行时由于基于Linux的Lambda而存在问题。 使用Linux运行时(例如debian.8-x64)将导致相同的编译错误。 当自己的平台是Linux时,为什么AWS SDK需要Windows运行时? 我觉得我错过了一些明显的东西,并且当有人将问题指出给我时,我会很高兴地面对掌心。 我的project.json文件(主应用程序和.NET Core类库项目): AlexaProj { “version”: “1.0.0-*”, “buildOptions”: { }, “dependencies”: { “Microsoft.NETCore.App”: “1.1.1”, “Amazon.Lambda.Core”: “1.0.0*”, “Amazon.Lambda.Serialization.Json”: “1.0.1”, “Amazon.Lambda.Tools”: { “type”: “build”, “version”: “1.3.0-preview1” }, “Slight.Alexa.Core”: “1.0.10-beta”, “AlexaProjLib”: “1.0.0-*” }, “tools”: { […]

AWS Lambda环境变量和dependency injection

在将AWS Lambda与.NET Core v1.0一起使用时,是否有可用于使用dependency injection或模拟环境变量的最佳实践或文档? 作为一个例子,下面是一个示例Lambda函数ProcessKinesisMessageById ,它接受KinesisEvent并进行某种处理。 此处理的一部分涉及访问需要访问环境变量以进行设置的某种外部服务(如AWS S3或数据库)。 public class AWSLambdaFileProcessingService { private IFileUploadService _fileUploadService; // No constructor in the Lambda Function [LambdaSerializer(typeof(JsonSerializer))] public void ProcessKinesisMessageById(KinesisEvent kinesisEvent, ILambdaContext context) { Console.WriteLine(“Processing Kinesis Request”); _fileUploadService = new AWSFileUploadService(); // Can this be injected? (Constructor shown below) // some sort of processing _fileUploadService.DoSomethingWithKinesisEvent(kinesisEvent); } } // […]

在AWS Lambda上使用System.Drawing.Common NuGet包时无法加载DLL“libdl”

我们有一个缩略图生成器lambda函数,我正在尝试更新到.NET Core 2.0,但是在使用Microsoft的System.Drawing.Common NuGet包时遇到以下错误: TypeInitializationException ‘Gdip’的类型初始化程序引发了exception。 在TestFailExample的System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromScan0(Int32宽度,Int32高度,Int32步长,Int32格式,HandleRef scan0,IntPtr和位图)处于System.Drawing.Bitmap..ctor(Int32宽度,Int32高度,PixelFormat格式) .Function.FunctionHandler(String输入,ILambdaContext上下文)在C:\ work \ graphics \ TestFailExample \ Function.cs中:第25行在lambda_method(Closure,Stream,Stream,LambdaContextInternal) 引起的 DllNotFoundException 无法加载DLL’libdl’:找不到指定的模块或其中一个依赖项。在System.Drawing.SafeNativeMethods的Interop.Libdl.dlopen(String fileName,Int32标志)处找不到指定的模块或其中一个依赖项。\ n(HRESULT的exception:0x8007007E)。 System.Drawing.SafeNativeMethods.Gdip..cctor()中的Gdip.LoadNativeLibrary() 我已经看到了这个问题,但没有解决方案。 重现问题的最小代码是: public string FunctionHandler(string input, ILambdaContext context) { using (var bmp = new Bitmap(100, 100)) { return bmp.Width.ToString(); } } 只需创建一个.NET Core 2.0 Lambda函数项目,添加对System.Drawing.Common NuGet包的引用,并用上面的代码替换函数处理程序。 将它放在AWS上并运行它以获取错误。 我已经注意到,在尝试实际使用它之前引用该包不会引起问题,但这可能归结为编译器优化。 我已经将MCVE打包成一个项目并将其上传到GitHub ,以简化人们重现问题所需的步骤。 我可以看到/lib64/libdl.so.2存在,但/lib64/libdl.so没有。 由于符号链接似乎不可能(只读文件系统),我不知道如何解决这个问题。 我已经尝试使用LD_LIBRARY_PATH环境变量,在/tmp创建一个文件夹,并将该文件符号化为该函数所做的第一件事。 […]

AWS Lambda C# – 访问自定义上下文

我有一个用.NET Core(C#)编写的简单Lambda函数,它使用APIGatewayProxyRequest对象来遍历所有请求属性。 如果我测试这个lambda函数(来自AWS Lambda),并传递一个包含基本信息的示例事件配置: 我可以这样得到这样的信息: public string FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) logger.Logger.Log($”Body: {request.Body} \n”); logger.Logger.Log($”Path: {request.Path} \n”); logger.Logger.Log($”Resource: {request.Resource} \n”); 我怎么能从相同的数据访问自定义上下文或授权者值: 我试过了: logger.Logger.Log($”RequestContext Authorizor: {request.RequestContext.Authorizer} \n”); 包括它的不同属性( StringKey , PrincipleId等) 从Node.js看来,这可以通过使用这个简单地实现: event.requestContext.authorizer.customKey 在C#中没有这样的东西?