Amazon AWS C # Лямбда-кодекс конвейер - PullRequest
0 голосов
/ 04 июня 2018

Написал приложение .NET core 2 web api, используя шаблон функции Amazon Lambda.Написал несколько тестовых звонков с помощью почтальона.Все отлично работает с кодом ядра .NET, работающим локально.Загружен основной код .NET в функцию Lambda, изменен почтальон для вызова этого URL.Все отлично работает с кодом .NET, работающим внутри функции Lambda - локальный вызов с использованием Postman.

Теперь требуется вызывать основной код .NET внутри лямбда-функции - из кодовой линии aws.Невозможно заставить это работать

Когда Почтальон вызывает функцию лямбды - я вижу это в логах cloudwatch:

Lambda Deserialize Amazon.Lambda.APIGatewayEvents.APIGatewayProxyRequest:
{
    "resource": "/{proxy+}",
    "path": "/api/Rds/InstanceStatus",
    "httpMethod": "GET",

, и этот вызов работает!Мой основной код .NET регистрирует следующее

LOG_LEVEL_TRACE,Nexus.Rds.Restore.dll,1.0.0.0,Nexus.Rds.Restore.LambdaEntryPoint,FunctionHandlerAsync,APIGatewayProxyRequest.Body = null

LOG_LEVEL_TRACE,Nexus.Rds.Restore.dll,1.0.0.0,Nexus.Rds.Restore.LambdaEntryPoint,FunctionHandlerAsync,APIGatewayProxyRequest.HttpMethod = GET

LOG_LEVEL_TRACE,Nexus.Rds.Restore.dll,1.0.0.0,Nexus.Rds.Restore.LambdaEntryPoint,FunctionHandlerAsync,APIGatewayProxyRequest.Path = /api/Rds/InstanceStatus

LOG_LEVEL_TRACE,Nexus.Rds.Restore.dll,1.0.0.0,Nexus.Rds.Restore.LambdaEntryPoint,FunctionHandlerAsync,APIGatewayProxyRequest.Resource = /{proxy+}

Примечание. Вы можете видеть, что объект LambdaEntryPoint заполняется перед вызовом моего основного кода .NET

Когда я пытаюсь дублировать этот же вызовиз codepipeline - я вижу это в логах cloudwatch:

Lambda Deserialize Amazon.Lambda.APIGatewayEvents.APIGatewayProxyRequest:
{
    "CodePipeline.job": {
        "id": "379d05fe-ec03-4ec9-8bce-59f31901aeb8",
        "accountId": "109319094079",
        "data": {
            "actionConfiguration": {
                "configuration": {
                    "FunctionName": "NexuIntRestServerless2-AspNetCoreFunction-T8Q5XCCN0FIC",
                    "UserParameters": "{\"resource\":\"/{proxy+}\",\"path\":\"/api/Rds/InstanceStatus\",\"httpMethod\":\"GET\"}"
                }
            },

Я попытался воспроизвести параметры в пользовательских параметрах codepipeline.Тем не менее, запись в журнале кода ядра .NET выглядит следующим образом:

LOG_LEVEL_TRACE,Nexus.Rds.Restore.dll,1.0.0.0,Nexus.Rds.Restore.LambdaEntryPoint,FunctionHandlerAsync,APIGatewayProxyRequest.Body = null

LOG_LEVEL_TRACE,Nexus.Rds.Restore.dll,1.0.0.0,Nexus.Rds.Restore.LambdaEntryPoint,FunctionHandlerAsync,APIGatewayProxyRequest.HttpMethod = null

LOG_LEVEL_TRACE,Nexus.Rds.Restore.dll,1.0.0.0,Nexus.Rds.Restore.LambdaEntryPoint,FunctionHandlerAsync,APIGatewayProxyRequest.Path = null

LOG_LEVEL_TRACE,Nexus.Rds.Restore.dll,1.0.0.0,Nexus.Rds.Restore.LambdaEntryPoint,FunctionHandlerAsync,APIGatewayProxyRequest.Resource = null

LOG_LEVEL_TRACE,Nexus.Rds.Restore.dll,1.0.0.0,Nexus.Rds.Restore.LambdaEntryPoint,FunctionHandlerAsync,APIGatewayProxyRequest.RequestContext = null

ПРИМЕЧАНИЕ: LambdaEntryPoint теперь имеет значение null, и выдается исключение - я предполагаю, потому что ядро ​​.NET не знает, как маршрутизировать вызов:

One or more errors occurred. (Object reference not set to an instance of an object.): AggregateException
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at lambda_method(Closure , Stream , Stream , LambdaContextInternal )

at Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction.MarshallRequest(InvokeFeatures features, APIGatewayProxyRequest apiGatewayRequest, ILambdaContext lambdaContext)
at Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction.<FunctionHandlerAsync>d__13.MoveNext()

Есть идеи о том, как вызвать лямбда-функцию из Codepipeline?

Спасибо

1 Ответ

0 голосов
/ 04 июня 2018

Похоже, что вы используете API-шлюз, когда вызываете функцию через почтальона.

При вызове из API-шлюза входные данные функции будут отличаться от значений при вызове из CodePipeline, поскольку входные данные из API-шлюза представляютHTTP-запрос против задания CodePipeline.

Ваша лямбда-функция должна быть разработана для обработки ввода задания CodePipeline.

Есть документация о формате этого задания и о том, как его использовать., а затем сообщите результат обратно CodePipeline здесь: https://docs.aws.amazon.com/codepipeline/latest/userguide/actions-invoke-lambda-function.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...