Невозможно настроить шлюз HTTP API, созданный с помощью NET Lambda Annotations Framework.C#

Место общения программистов C#
Anonymous
Невозможно настроить шлюз HTTP API, созданный с помощью NET Lambda Annotations Framework.

Сообщение Anonymous »

Предположим, у меня есть конечная точка GET.
[LambdaFunction]
[HttpApi(LambdaHttpMethod.Get, "/info")]
public string FunctionHandler(ILambdaContext context)
{
return "OK";
}

serverless.template генерируется, и CloudFormation за кулисами генерирует HTTP API-шлюз, интеграцию и маршруты, и все работает как шарм:
"TestFunctionFunctionHandlerGenerated": {
"Type": "AWS::Serverless::Function",
"Metadata": {
"Tool": "Amazon.Lambda.Annotations",
"SyncedEvents": [
"RootGet"
],
"SyncedEventProperties": {
"RootGet": [
"Path",
"Method"
]
}
},
"Properties": {
"Runtime": "dotnet8",
"CodeUri": ".",
"MemorySize": 512,
"Timeout": 30,
"Policies": [
"AWSLambdaBasicExecutionRole"
],
"PackageType": "Zip",
"Handler": "Test::Test.Function_FunctionHandler_Generated::FunctionHandler",
"FunctionName": "TestGetInfo",
"Events": {
"RootGet": {
"Type": "HttpApi",
"Properties": {
"Path": "/info",
"Method": "GET"
}
}
}
}
}


Однако при попытке настроить шлюз HTTP API, например, простой CorsConfiguration или прикрепить авторизатор JWT, мне не удалось этого сделать.
Я пытался "добавить" шлюз HTTP API, который будет соответствовать существующему
"TestApi": {
"Type": "AWS::ApiGatewayV2::Api",
"Properties": {
"Name": "test-api",
"ProtocolType": "HTTP",
"CorsConfiguration": {
"AllowOrigins": [
"*"
],
"AllowMethods": [
"GET",
"POST",
"DELETE",
"OPTIONS",
"PUT",
"PATCH"
],
"AllowHeaders": [
"Content-Type",
"Authorization"
],
"MaxAge": 600
}
}
}

А затем сослаться на него в моей «конечной точке», но это не работает.

"Events": {
"RootGet": {
"Type": "HttpApi",
"Properties": {
"Path": "/info",
"Method": "GET",
"ApiId": {
"Ref": "TestApi"
}
}
}
}


Единственный способ добиться того, чего я хочу, — позволить Annotations Framework генерировать функциональную часть, а затем вручную создавать API-шлюз, маршрут, интеграцию и привязки, что, на мой взгляд, является накладными расходами, поскольку вы теряете все преимущества, которые предоставляют аннотации.
Следующая конфигурация работает, но, на мой взгляд, это просто смешно:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Transform": "AWS::Serverless-2016-10-31",
"Description": "This template is partially managed by Amazon.Lambda.Annotations (v1.5.0.0).",
"Resources": {
"TestApi": {
"Type": "AWS::ApiGatewayV2::Api",
"Properties": {
"Name": "Test-api",
"ProtocolType": "HTTP",
"CorsConfiguration": {
"AllowOrigins": [
"*"
],
"AllowMethods": [
"GET",
"POST",
"DELETE",
"OPTIONS",
"PUT",
"PATCH"
],
"AllowHeaders": [
"Content-Type",
"Authorization"
],
"MaxAge": 600
}
}
},
"TestApiIntegration": {
"Type": "AWS::ApiGatewayV2::Integration",
"Properties": {
"ApiId": {
"Ref": "TestApi"
},
"IntegrationType": "AWS_PROXY",
"IntegrationUri": {
"Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${TestFunctionFunctionHandlerGenerated.Arn}/invocations"
},
"PayloadFormatVersion": "2.0"
}
},
"TestApiRoute": {
"Type": "AWS::ApiGatewayV2::Route",
"Properties": {
"ApiId": {
"Ref": "TestApi"
},
"RouteKey": "GET /info",
"Target": {
"Fn::Sub": "integrations/${TestApiIntegration}"
}
}
},
"TestApiDeployment": {
"Type": "AWS::ApiGatewayV2::Deployment",
"Properties": {
"ApiId": {
"Ref": "TestApi"
}
},
"DependsOn": [
"TestApiRoute"
]
},
"TestApiStage": {
"Type": "AWS::ApiGatewayV2::Stage",
"Properties": {
"ApiId": {
"Ref": "TestApi"
},
"StageName": "prod",
"DeploymentId": {
"Ref": "TestApiDeployment"
},
"AutoDeploy": true
}
},
"TestFunctionFunctionHandlerGenerated": {
"Type": "AWS::Serverless::Function",
"Metadata": {
"Tool": "Amazon.Lambda.Annotations",
"SyncedEvents": [
"RootGet"
],
"SyncedEventProperties": {
"RootGet": [
"Path",
"Method"
]
}
},
"Properties": {
"Runtime": "dotnet8",
"CodeUri": ".",
"MemorySize": 512,
"Timeout": 30,
"Policies": [
"AWSLambdaBasicExecutionRole"
],
"PackageType": "Zip",
"Handler": "Test::Test.Function_FunctionHandler_Generated::FunctionHandler",
"FunctionName": "TestGetInfo"
"Events": {
"RootGet": {
"Type": "HttpApi",
"Properties": {
"Path": "/info",
"Method": "GET",
"ApiId": {
"Ref": "TestApi"
}
}
}
}
}
}
},
"Outputs": {
"TestApi": {
"Value": {
"Fn::Sub": "${TestApi}"
},
"Export": {
"Name": "TestApi"
}
},
"HttpApiGatewayUrl": {
"Value": {
"Fn::Sub": "https://${TestApi}.execute-api.${AWS::Region}.amazonaws.com"
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... s-framewor

Вернуться в «C#»