我正在通过 Visual Studio 使用 AWS Lambda 和 API Gateway 构建无服务器应用程序。我正在使用 C#,并使用无服务器应用程序模型 (SAM) 来部署我的 API。我在 Visual Studio 中构建代码,然后通过发布到 Lambda 进行部署。这是有效的,除了每次我进行新构建并尝试执行 API 调用时,我都会收到此错误:
由于配置错误,执行失败:Lambda 函数的权限无效
做了一些研究,我发现其他地方提到了这个修复(通过 AWS 控制台完成):
修复:转到 API 网关 > API 名称 > 资源 > 资源名称 > 方法 > 集成请求 > Lambda 函数并重新选择我现有的函数,然后用小复选标记“保存”它。
现在这对我有用,但它破坏了使用 serverless.template (JSON) 构建我的 API 的自动化。有谁知道如何在 serverless.template 文件中解决这个问题?这样我就不需要在控制台中采取行动来解决?这是 serverless.template 文件中我的一种方法的示例
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Transform" : "AWS::Serverless-2016-10-31",
"Description" : "An AWS Serverless Application.",
"Resources" : {
"Get" : {
"Type" : "AWS::Serverless::Function",
"Properties": {
"VpcConfig":{
"SecurityGroupIds" : …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取JSON文本结果,例如
[
{
"TABLE_NAME": "UpdatePlanning"
},
{
"TABLE_NAME": "StoreInfo"
},
{
"TABLE_NAME": "InSiteTxPerHourPerDay"
},
{
"TABLE_NAME": "inSiteTaskRecordsLocal"
},
{
"TABLE_NAME": "InSiteStoreInformation"
},
{
"TABLE_NAME": "InSiteLogExtractionTest"
},
{
"TABLE_NAME": "InSiteDailySalesPerDay"
},
{
"TABLE_NAME": "FredOfficeLogAlerts"
},
{
"TABLE_NAME": "DPTestAutoScaleTable"
},
{
"TABLE_NAME": "DPGenHoldTable"
},
{
"TABLE_NAME": "DPDailyTopSellerItems"
},
{
"TABLE_NAME": "DPDailyTierSales"
},
{
"TABLE_NAME": "DPDailySales"
},
{
"TABLE_NAME": "DPDailyAvgBasketSize"
},
{
"TABLE_NAME": "ASGInSiteStoreInformation"
}
]
Run Code Online (Sandbox Code Playgroud)
从Web API我已经包装在'自定义连接器'中以在PowerApps中使用.我的自定义连接器运行良好,我可以在自定义连接器屏幕中测试它,但我无法弄清楚如何在Power Apps中访问该JSON数据 - 例如 - 填充数据表,或填充列表,或者画廊,甚至只是一个标签?请记住,从某些GET方法返回的JSON模式不是固定的,例如,JSON结构可能会有所不同,具体取决于查询对象的类型等,但无论我无法使其工作.
示例:我在PowerSts应用程序中的第一个屏幕的OnStart方法中尝试过此操作
Set(myTable,InSiteConnector.gettables())
Run Code Online (Sandbox Code Playgroud)
假设我的JSON将存储在变量myTable中..但是如果我在标签或任何地方引用myTable,它就不会产生任何东西.对数据表或图表或列表使用相同的方法是相同的,没有结果.我在这里错过了什么?我在网上搜索过,但是我尝试语法方面似乎没有任何效果.
同样,如果我创建数据表并尝试选择我的自定义连接器作为数据源,例如它位于数据源列表中
但添加它只会导致它在此列表中一次又一次出现......
但我无法点击它,或者做任何与它有关的事情,从中获取数据似乎是显而易见的?(例如,能够从我的JSON中选择字段,甚至可以从GET方法中操作原始BODY)
我已经开始为某人提供赏金,请向我展示一个工作和可复制的示例,将JSON从此Web API获取到PowerApps应用程序中,以便在库或类似应用程序中使用.谢谢!
请在此处查看我原来的 SO 问题 - Entity Framework Core - effective way to update Entity that haschildren based on JSONrepresentation ofEntity being pass in via Web API
这个问题详细说明了我正在使用 .NET Core、Entity Framework Core 和 PostgreSQL 构建 API。我试图通过 API 引入一个对象,将其转换为一种Customer实体类型,然后使用它来更新现有Customer实体,因此基本上采用原始和更新之间已更改的所有修改属性,并生成更新语句。
由于以下错误,此操作失败:
System.InvalidOperationException:实体类型“Customer”上的属性“CustomerInternalId”是键的一部分,因此无法修改或标记为已修改。要更改具有标识外键的现有实体的主体,首先删除依赖项并调用“SaveChanges”,然后将依赖项与新主体关联。
CustomerInternalId但是我不清楚,如何在要求 .NET Core / EF Core 保留现有记录的主键的同时执行更新?
显然我不想更改主键,这可能是我不想更新的一件事。所有其他属性都可能被传入数据更改。
这是我的示例方法(测试已经进行了一半,所以当我试图弄清楚这一点时,其中有一些日志记录等)。
/// <summary>
/// Update customer record - still working on this
/// </summary>
/// <param name="customerPayload"></param>
public static void UpdateCustomerRecord(CustomerPayload customerPayload)
{
try
{
var updateCustomer = customerPayload.Convert(customerPayload); …Run Code Online (Sandbox Code Playgroud) 我有一个 AWS API 网关,它代理多个 AWS Lambda 函数。这些函数从 PostgreSQL 数据库 (AWS Aurora PostgreSQL) 读取和写入。我已经使用 Entity Framework Core Database First 连接了数据访问。我有一个问题,在几分钟后我第一次调用我的 API 并执行 Lambda 函数时,通过 EF Core 对数据库的第一次查询最多需要 29 秒(!)。下一个只在 1 秒后执行,只需要 200 毫秒。
我知道你在想什么,这是 Lambda 冷启动。好吧,我已经排除了这一点,因为如果我取出任何 EF Core 代码,并让我的函数返回一个虚拟响应,时间会下降到大约 4 秒响应,然后如果我再次调用 200 毫秒之后。
如果我检查我的函数的日志,我还可以看到延迟是在执行第一个 EF Core 查询时,在此之前的其他事件发生得非常快。请参阅下面的摘录。
“找到测试客户”是从查询中第一次从数据库返回数据。请参阅下面的摘录:
using (var loyalty = new loyaltyContext())
{
var testArray = new string[]
{Customer.CustomerStateReasonCodes.Deceased,
Customer.CustomerStateReasonCodes.Fraud};
var dupeEmailCustomers = (from c in loyalty.ContactInformation
where c.ContactType == "EMAIL"
join cu in loyalty.Customer on c.CustomerInternalId equals cu.CustomerInternalId …Run Code Online (Sandbox Code Playgroud) 有点难住这里。我有一个名为 request_to_print 的小表。这是表结构。
它有一个主键 request_internal_id。
该表中有 747 行。
当插入发生时,我注意到它需要 500ms+,这似乎过分了。大多数插入是在 1 毫秒内完成的,而且在更大的表上。
2020-10-06T10:38:29.284+11:00 Executed DbCommand (566ms) [Parameters=[@p0='', @p1='94ac21e6-bdd5-409c-90f6-4e014d1de763', @p2=NULL (DbType = DateTime), @p3='2020-10-05T23:38:28' (Nullable = true) (DbType = DateTime), @p4='E001'], CommandType='Text', CommandTimeout='30']
2020-10-06T10:38:29.284+11:00 INSERT INTO request_to_print (card_number, customer_internal_id, request_sent_date, requested_date, requesting_store)
2020-10-06T10:38:29.284+11:00 VALUES (@p0, @p1, @p2, @p3, @p4)
2020-10-06T10:38:29.284+11:00 RETURNING request_internal_id;
Run Code Online (Sandbox Code Playgroud)
我已经在类似条件下在我们的测试环境中运行了这个命令。因为它是一个插入,所以没有很多东西需要分析/解释。我的意思是,它只是放入一行数据。这是我从跟踪插入中得到的:
[
{
"Plan": {
"Node Type": "ModifyTable",
"Operation": "Insert",
"Parallel Aware": false,
"Relation Name": "request_to_print",
"Schema": "public",
"Alias": "request_to_print",
"Startup Cost": 0,
"Total Cost": 0.02,
"Plan Rows": 1, …Run Code Online (Sandbox Code Playgroud) 我正在为我自己的目的,为Bot Framework V4(使用LUIS)破解GitHub'CoreBot'示例代码,并且在响应和瀑布对话框步骤的执行方式上遇到了麻烦。
我有一个顶级对话框。我的期望是,该对话框基于输入对LUIS进行初始调用,并基于该输入路由到其他对话框。目前,只能问候机器人并报告危险。我的对话框设置如下(忽略BookingDialog,它是示例的一部分)。
public MainDialog(IConfiguration configuration, ILogger<MainDialog> logger)
: base(nameof(MainDialog))
{
Configuration = configuration;
Logger = logger;
AddDialog(new TextPrompt(nameof(TextPrompt)));
AddDialog(new BookingDialog());
AddDialog(new HazardDialog());
AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
{
MainStepAsync,
EndOfMainDialogAsync
}));
// The initial child Dialog to run.
InitialDialogId = nameof(WaterfallDialog);
}
Run Code Online (Sandbox Code Playgroud)
我的期望是MainStepAsync被执行,并运行以下命令:
private async Task<DialogTurnResult> MainStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
CoreBot.StorageLogging.LogToTableAsync($"Main step entered. I am contacting LUIS to determine the intent");
string what_i_got = await LuisHelper.ExecuteMyLuisQuery(Configuration, Logger, stepContext.Context, cancellationToken);
CoreBot.StorageLogging.LogToTableAsync($"LUIS intent matched: {what_i_got}");
//await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { …Run Code Online (Sandbox Code Playgroud) c# botframework azure-language-understanding azure-bot-service
我有一个运行 .NET Core 的 API 网关,它代理 AWS Lambda 函数。这些 Lambda 函数使用 Entity Framework Core 与 AWS Aurora PostgreSQL RDS 集群进行通信。集群包含1个读/写节点和1个只读节点。
在设置 EF Core 期间,我首先使用数据库来搭建脚手架,效果很好。脚手架是通过集群的读/写实例完成的,读写实例是生成的 DatabaseContext 类中的上下文连接字符串中引用的实例。
但是,我有一些读取密集型 API 方法(以及生成的 Lambda 函数),我想专门指出我的只读节点(它具有来自 AWS 自动管理的读/写节点的亚秒级复制)。但是我不知道如何在我的 EF Core 实现中进行设置。我是 EF Core 的初学者,所以我很高兴能将它与一个节点一起使用。如何在 .NET Core 应用程序中进行设置,以便可以指定一些查询以转到只读节点?只读节点具有完全相同的架构和对象。
如果我尝试通过 EF Core CLI 使用数据库上下文脚手架执行数据库优先脚手架,但将其指向只读节点,这会起作用吗?还是惨败?我应该有某种特定的方式来设置它吗?或者我应该避免使用 EF Core 作为只读节点,而只使用 Dapper 或 SqlKata 之类的东西来执行只读查询并维护自己的连接等?
我有一个使用 Aurora PostgreSQL 集群的应用程序 (AWS API Gateway)。
集群有 1 个读/写(主要)和一个读取器端点。
目前,我的应用程序连接到所有操作的特定编写器实例:rds-instance-1.xxx.ap-southeast-2.rds.amazonaws.com
但我有以下端点可用:
rds.cluster-xxx.ap-southeast-2.rds.amazonaws.com
rds.cluster-ro-xxx.ap-southeast-2.rds.amazonaws.com
rds-instance-1.xxx.ap-southeast-2.rds.amazonaws.com
rds-instance-1-ap-southeast-2c.xxx.ap-southeast-2.rds.amazonaws.com
Run Code Online (Sandbox Code Playgroud)
如果我正在执行读写操作,我应该连接到我正在使用的实例端点吗?或者我应该使用 rds.cluster-xxx.ap-southeast-2.rds.amazonaws.com 吗?使用不同端点有什么好处?我知道如果我连接到只读端点,我只能进行读取,但对于读/写,连接到以下内容有什么区别:
rds.cluster-xxx.ap-southeast-2.rds.amazonaws.com
Run Code Online (Sandbox Code Playgroud)
或者
rds-instance-1.xxx.ap-southeast-2.rds.amazonaws.com
Run Code Online (Sandbox Code Playgroud)
?
用于一般工作负载的正确/最佳端点是什么,为什么?
我有下面的 CloudFormation 模板,它创建了我的 API 网关(由 Lambda 支持)。我想启用 API 密钥作为其中一种或多种方法的要求。我已经成功创建了 API 密钥、使用计划以及两者之间的关联,但无法弄清楚如何实际启用某些方法的“需要 API 密钥”属性。AWS 的文档指定“ ApiKeyRequired ”属性作为AWS::ApiGateway::Method组件的一部分,但我的 CF 模板没有或不使用此组件?考虑到我以前从未需要过它,我不确定如何使用它?
我的模板如下:
"ServerlessRestApi": {
"Type": "AWS::ApiGateway::RestApi",
"Properties": {
"Description":"This is a placeholder for the description of this web api",
"ApiKeySourceType":"HEADER",
"Body": {
"info": {
"version": "1.0",
"title": {
"Ref": "AWS::StackName"
}
},
"paths": {
"/list/tables": {
"get": {
"x-amazon-apigateway-integration": {
"httpMethod": "POST",
"type": "aws_proxy",
"uri": {
"Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetTableList.Arn}/invocations"
}
},
"security": [
{
"api_key": []
}
],
"responses": {}
}
}, …Run Code Online (Sandbox Code Playgroud) 我有一个 .NET 解决方案,它使用 SAM 模板生成 cloudformation 来部署堆栈。我期望部署 - 一旦完成 - 至少在其中一种方法上需要 API Key = true。但是部署后,创建了密钥和使用计划,但在控制台中所需的 api 密钥仍然设置为 false?
见下文:
我的 SAM 模板:
"ServerlessRestApi": {
"Type": "AWS::ApiGateway::RestApi",
"Properties": {
"Description":"This is a placeholder for the description of this web api",
"Body": {
"info": {
"version": "1.0",
"title": {
"Ref": "AWS::StackName"
}
},
"x-amazon-apigateway-api-key-source": "HEADER",
"paths": {
"datagw/general/table/get/{tableid}": {
"get": {
"x-amazon-apigateway-integration": {
"httpMethod": "POST",
"type": "aws_proxy",
"uri": {
"Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${GetTableResponse.Arn}/invocations"
}
},
"responses": {}
},
"security":[
{
"api_key":[]
}
]},
"securityDefinitions":{ …Run Code Online (Sandbox Code Playgroud) aws-cloudformation swagger aws-api-gateway serverless-application-model
c# ×4
postgresql ×4
aws-lambda ×2
serverless-application-model ×2
.net-core ×1
amazon-rds ×1
azure-language-understanding ×1
botframework ×1
database ×1
powerapps ×1
sql ×1
swagger ×1