C# 访问部署到aws API网关的aws无服务器API时返回内部服务器错误
我正在尝试部署一个API来操纵AWS DynamoDB数据库。我使用了AWS.NETSDK提供的无服务器API模板。Net核心API在本地运行良好,但在将其发布到AWS Lambda后,每当我尝试访问API时,都会返回“内部服务器错误” 在CloudWatch Logs Insights中,日志消息返回如下内容 当类型的构造函数 已调用“ProjectAPI.Controllers.MyController”。有关详细信息,请检查内部异常。:LambdaException 在System.RuntimeTypeHandle.CreateInstance(RuntimeType类型、Boolean publicOnly、Boolean WrapeExceptions、Boolean&canBeCached、RuntimeMethodHandleInternal&ctor) 位于System.RuntimeType.CreateInstanceSlow(布尔publicOnly、布尔WrapeExceptions、布尔skipCheckThis、布尔fillCache) 在MyController的构造函数中,我实例化了一个服务,该服务将获取凭据并设置DynamoDBContext 在MyController中:C# 访问部署到aws API网关的aws无服务器API时返回内部服务器错误,c#,api,asp.net-core,amazon-dynamodb,aws-serverless,C#,Api,Asp.net Core,Amazon Dynamodb,Aws Serverless,我正在尝试部署一个API来操纵AWS DynamoDB数据库。我使用了AWS.NETSDK提供的无服务器API模板。Net核心API在本地运行良好,但在将其发布到AWS Lambda后,每当我尝试访问API时,都会返回“内部服务器错误” 在CloudWatch Logs Insights中,日志消息返回如下内容 当类型的构造函数 已调用“ProjectAPI.Controllers.MyController”。有关详细信息,请检查内部异常。:LambdaException 在System.Run
private readonly IMyService _myService;
public CoffeeController(IMyService myService){
_myService = myService;
}
在MyService中:IMyService
private readonly DynamoDBContext _context;
public CoffeeService()
{
var chain = new CredentialProfileStoreChain();
AWSCredentials awsCredentials;
if (chain.TryGetAWSCredentials("Hackathon-coffee", out awsCredentials)){
AmazonDynamoDBClient client = new AmazonDynamoDBClient(awsCredentials, RegionEndpoint.APSoutheast2);
_context = new DynamoDBContext(client, new DynamoDBContextConfig { ConsistentRead = true, SkipVersionCheck = true });
}else
LambdaLogger.Log("Cannot Fetch Credentials");
}
在Startup.cs中:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSingleton<IMyService, MyService>();
}
public void配置服务(IServiceCollection服务)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSingleton();
}
我假设在获取凭据时出错,但我不确定如何在.Net Core环境中正确地执行此操作。我假设“Hackathon coffee”
指的是存储在本地开发环境中的凭据配置文件。该配置文件在Lambda环境中不存在
在Lambda中,您很可能希望使用创建Lambda函数时分配给该函数的IAM角色的凭据
基本上,在Lambda中运行时,您希望构造AmazonDynamoDBClient
,而无需传入AWSCredentials
。SDK将自动解析分配角色的凭据。对于构造函数中的区域参数也是如此。如果使用空构造函数构造AmazonDynamoDBClient
,它将使用IAM角色和函数运行所在区域的凭据配置客户端
有时,我在代码中使用的一个方便的技巧是检查Lambda\u TASK\u ROOT
环境变量是否已设置
private只读DynamoDBContext\u上下文;
公共咖啡服务
{
if(string.IsNullOrEmpty(Environment.GetEnvironmentVariable(“LAMBDA\u TASK\u ROOT”))
{
var chain=新凭证profilestorechain();
AWSCredentials AWSCredentials;
if(连锁店TryGetAWSCredentials(“Hackathon咖啡”,out awsCredentials))
{
AmazonDynamoDBClient=新的AmazonDynamoDBClient(awsCredentials,RegionEndpoint.APSoutheast2);
_context=new DynamoDBContext(客户端,new DynamoDBContextConfig{consistentdread=true,SkipVersionCheck=true});
}
其他的
{
Log(“无法获取凭据”);
}
}
其他的
{
//使用来自IAM角色和运行函数的区域的凭据。
AmazonDynamoDBClient=新的AmazonDynamoDBClient();
_context=new DynamoDBContext(客户端,new DynamoDBContextConfig{consistentdread=true,SkipVersionCheck=true});
}
}
谢谢您的回答。我已经尝试了您的逻辑来测试无服务器应用程序。但是,它仍然返回内部服务器错误。我尝试使用LambdaLogger来查看发生了什么,但LambdaLogger似乎不适用于无服务器应用程序,因为CloudWatch日志中没有显示任何日志。我还尝试使用sam local start api--profile myprofile
(返回内部服务器错误)在本地运行api。在终端中,我获得了以下日志:运行程序中发生未处理的异常:AWSLambda.Internal.Bootstrap.LambdaValidationException:找不到文件名为'Culture=neutral,PublicKeyToken=null'的指定处理程序程序集。程序集应位于上载的.zip文件的根目录中。错误消息为“找不到指定的处理程序程序集…”,这意味着serverless.template文件中的处理程序属性不正确。属性的值应为::。我以前手动更改了项目的名称,并且使用serverless API模板自动生成serverless.template。通常,您是否需要更改处理程序以使API正常工作?