Учебники

Выполнение и вызов лямбда-функции

В этой главе будет подробно рассказано о процессе выполнения и вызова лямбда-функции и о шагах, связанных с ней.

Модель исполнения AWS Lambda

Выполнение AWS зависит от деталей конфигурации, добавленных для лямбда-функции AWS. При создании функции выделяется память и время , которые используются для выполнения лямбда-функции AWS.

С помощью деталей конфигурации AWS Lambda создает контекст выполнения. Контекст выполнения — это временная среда выполнения, которая готова к любым внешним зависимостям, таким как подключение к базе данных, конечные точки http, сторонние библиотеки и т. Д., Если таковые имеются.

Когда лямбда-функция AWS вызывается в первый раз или если лямбда-функция обновляется, добавляется небольшая задержка из-за настройки контекста выполнения. Однако последующие звонки быстрее по сравнению с первым. AWS Lambda пытается снова использовать контекст выполнения, если функция Lambda вызывается с меньшим временем.

Повторное использование контекста выполнения имеет следующие последствия:

  • Если для выполнения Lambda установлено соединение с базой данных, соединение сохраняется для повторного использования. Поэтому лямбда-код должен быть таким, чтобы сначала проверялась связь — если она существует и используется повторно; в противном случае нам придется установить новое новое соединение.

  • Контекст выполнения поддерживает дисковое пространство 500 МБ в каталоге / tmp . Требуемые данные кэшируются в этом каталоге. Вы можете дополнительно проверить код, чтобы увидеть, существуют ли данные.

  • Если обратные вызовы или некоторые фоновые процессы, если они не завершены, когда была вызвана лямбда-функция, выполнение начнется, когда лямбда-функция будет вызвана снова. Если вам не нужно, чтобы это происходило, убедитесь, что все ваши процессы завершены правильно, когда выполнение функции завершено.

Если для выполнения Lambda установлено соединение с базой данных, соединение сохраняется для повторного использования. Поэтому лямбда-код должен быть таким, чтобы сначала проверялась связь — если она существует и используется повторно; в противном случае нам придется установить новое новое соединение.

Контекст выполнения поддерживает дисковое пространство 500 МБ в каталоге / tmp . Требуемые данные кэшируются в этом каталоге. Вы можете дополнительно проверить код, чтобы увидеть, существуют ли данные.

Если обратные вызовы или некоторые фоновые процессы, если они не завершены, когда была вызвана лямбда-функция, выполнение начнется, когда лямбда-функция будет вызвана снова. Если вам не нужно, чтобы это происходило, убедитесь, что все ваши процессы завершены правильно, когда выполнение функции завершено.

Вы должны использовать контекст выполнения и данные, хранящиеся в каталоге tmp. Вам нужно будет добавить необходимые проверки в код, чтобы увидеть, существуют ли необходимые данные, прежде чем создавать новые новые. Это сэкономит время во время выполнения и сделает его более быстрым.

Вызов функции AWS Lambda

Мы можем вызвать AWS вручную, используя aws cli . Мы уже видели, как создавать и развертывать AWS Lambda с помощью cli . Здесь мы сначала создадим функцию, используя aws cli, и вызовем ее.

Создание лямбда-функции AWS с помощью интерфейса командной строки AWS

Для создания функции AWS Lambda с помощью aws cli вы можете использовать следующие команды:

команды

create-function 
--function-name <value>
--runtime <value>
--role <value>
--handler <value>
[--code <value>] 
[--description <value>] 
[--timeout <value>] 
[--memory-size <value>] 
[--environment <value>] 
[--kms-key-arn <value>] 
[--tags <value>] 
[--zip-file <value>] 
[--cli-input-json <value>]

Команда со значениями

aws lambda create-function 
--function-name "lambdainvoke" 
--runtime "nodejs8.10" 
--role "arn:aws:iam::625297745038:role/lambdaapipolicy" 
--handler "index.handler" 
--timeout 5 
--memory-size 256 
--zip-file "fileb://C:\nodeproject\index.zip"

Вывод как показано ниже —

Команда со значениями

Функция, созданная в консоли AWS, показана ниже:

Функция создана

Тип ввода кодаСуществующая роль

Теперь вы можете вызвать функцию с помощью команды: invoke

--function-name <value>
[--invocation-type <value>]
[--log-type <value>]
[--client-context <value>]
[--payload <value>]
[--qualifier <value>]
outfile <value>

Опции

—function-name — Укажите имя функции, которую вы хотите вызвать.

—invocation-type (string) — по умолчанию типом вызова является requestresponse . Доступные значения для invokation-type: RequestResponse, Event и DryRun .

  • Тип вызова события должен использоваться для асинхронного ответа.

  • DryRun должен использоваться, когда вы хотите проверить функцию Lambda без необходимости ее выполнения.

Тип вызова события должен использоваться для асинхронного ответа.

DryRun должен использоваться, когда вы хотите проверить функцию Lambda без необходимости ее выполнения.

—log-type — Это будет Tail, если типом вызова является RequestResponse. Это дает последние 4KB base64-закодированные данные журнала. Возможные значения: Tail и None .

—client-context — Вы можете передать специфические детали клиента в функцию Lambda. Клиентский текст должен быть в формате json и кодироваться в base64. Максимальный размер файла составляет 3583 байта.

—payload — ввод в формате json лямбда-функции.

—qualifier — Вы можете указать версию лямбда-функции или псевдоним. Если вы передадите версию функции, то API будет использовать квалифицированную функцию arn для вызова функции Lambda. Если вы указываете псевдоним, API-интерфейс использует псевдоним ARN для вызова функции Lambda.

outfile — это имя файла, в котором будет сохранен контент.

Команда со значениями

aws lambda invoke --function-name "lambdainvoke" --log-type 
Tail C:\nodeproject\outputfile.txt

Значения команд

Вы можете использовать опцию полезной нагрузки для отправки фиктивного события лямбда-функции в формате json, как показано ниже.

Соответствующий лямбда-код AWS выглядит следующим образом:

exports.handler = async (event, callback) => {
   console.log("Hello => "+ event.name);
   console.log("Address =>"+ event.addr);
   callback(null, 'Hello '+event.name +" and address is "+ event.addr);
};

Обратите внимание, что в коде у нас есть консоль event.name и event.addr . Теперь давайте используем опцию полезной нагрузки в aws cli, чтобы отправить событие с именем и адресом следующим образом:

aws lambda invoke --function-name "lambdainvoke" --log-type 
Tail --payload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt

Thenpayload принимает ввод как путь к файлу, который имеет вход json, как показано

{"name":"Roy Singh", "addr":"Mumbai"}

Соответствующий вывод как показано ниже —

Соответствующий вывод

Вывод сохраняется в файле C: \ clioutput \ outputfile.txt следующим образом:

"Hello Roy Singh and address is Mumbai"

Образцы событий

Вы можете проверить функцию AWS Lambda, передав пример события. В этом разделе приведены примеры событий для Сервисов AWS. Вы можете использовать команду invoke для проверки вывода при запуске с любой из служб. Соблюдайте коды, указанные для соответствующих примеров событий ниже —

Amazon S3 Put Пример события

{
  "Records": [{
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
         "SourceIPAddress": "127.0.0.1"
      },
      "s3": {
         "configurationId": "testConfigRule",
         "object": {
            "eTag": "0123456789abcdef0123456789abcdef",
            "sequencer": "0A1B2C3D4E5F678901",
            "key": "HappyFace.jpg",
            "size": 1024
         },
         "bucket": { 
            "arn": bucketarn,
            "name": "Sourcebucket",
            "ownerIdentity": {
               "principalId": "EXAMPLE"
            }
         },
         "s3SchemaVersion": "1.0"
      },
      "responseElements": {
         "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
         "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
         "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
   }]
}

Чтобы получить подробную информацию о файле из события s3 put , вы можете использовать следующую команду —

event.Records[0].s3.object.key   //will display the name of the file

Чтобы получить имя сегмента , вы можете использовать следующую команду —

event.Records[0].s3.bucket.name  //will give the name of the bucket.

Чтобы увидеть EventName , вы можете использовать следующую команду —

event.Records[0].eventName    // will display the eventname

Amazon S3 Удалить пример события

{
   "Records": [{
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
         "SourceIPAddress": "127.0.0.1"
      },
      "s3": {
         "configurationId": "testConfigRule",
         "object": {
            "sequencer": "0A1B2C3D4E5F678901",
            "key": "HappyFace.jpg"
         },
         "bucket": {
            "arn": bucketarn,
            "name": "Sourcebucket",
            "ownerIdentity": {
               "principalId": "EXAMPLE"
            }
         },
        "s3SchemaVersion": "1.0"
      },
      "responseElements": {
         "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
         "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectRemoved:Delete",
      "userIdentity": {
         "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
   }]
} 

Amazon DynamoDB

Amazon DynamoDB может быть событием в AWS Lambda, когда изменения вносятся в таблицу DynamoDB. Мы можем выполнять такие операции, как добавление записи, обновление и удаление записей из таблицы DynamodDB.

Пример события для добавления, вставки и удаления DynamoDB показан здесь —

{
  "Records": [{
      "eventID": "1",
      "eventVersion": "1.0",
      "dynamodb": {
         "Keys": {
            "Id": {
               "N": "101"
            }
         },
         "NewImage": {
            "Message": {
               "S": "New item!"
            },
            "Id": {
               "N": "101"
            }
         },
         "StreamViewType": "NEW_AND_OLD_IMAGES",
         "SequenceNumber": "111",
         "SizeBytes": 26
      },
      "awsRegion": "us-west-2",
      "eventName": "INSERT",
      "eventSourceARN": eventSourcearn,
      "eventSource": "aws:dynamodb"
   },
   {
      "eventID": "2",
      "eventVersion": "1.0",
      "dynamodb": {
         "OldImage": {
            "Message": {
               "S": "New item!"
            },
            "Id": {
               "N": "101"
            }
         },
        "SequenceNumber": "222",
        "Keys": {
            "Id": {
               "N": "101"
            }
         },
        "SizeBytes": 59,
        "NewImage": {
            "Message": {
               "S": "This item has changed"
            },
            "Id": {
				   "N": "101"
            }
         },
         "StreamViewType": "NEW_AND_OLD_IMAGES"
      },
      "awsRegion": "us-west-2",
      "eventName": "MODIFY",
      "eventSourceARN": Sourcearn,
      "eventSource": "aws:dynamodb"
   },
   {      
   "eventID": "3",
      "eventVersion": "1.0",
      "dynamodb": {
         "Keys": {
            "Id": {
               "N": "101"
            }
         },
         "SizeBytes": 38,
         "SequenceNumber": "333",
         "OldImage": {
            "Message": {
               "S": "This item has changed"
            },
            "Id": {
               "N": "101"
            }
         },
         "StreamViewType": "NEW_AND_OLD_IMAGES"
      },      "awsRegion": "us-west-2",
      "eventName": "REMOVE",
      "eventSourceARN": Sourcearn,
      "eventSource": "aws:dynamodb"    
   }]
}

Amazon Простая служба уведомлений

AWS Lambda может быть полезна для обработки уведомлений, созданных в Simple Notification Service (SNS) . Всякий раз, когда в SNS публикуется сообщение, лямбда-функция может запускаться с событием SNS, в котором есть подробности сообщений. Эти сообщения могут быть обработаны внутри лямбда-функции и могут быть отправлены в другие службы в соответствии с требованиями.

Как только сообщение введено, SNS запустит функцию Lambda. Если какая-либо ошибка пытается вызвать лямбда-функцию, SNS попытается вызвать лямбда-функцию до трех раз.

Образец события Amazon SNS

Пример события, в котором есть все подробности, доступные в функции AWS Lambda для выполнения дальнейшего процесса, показан ниже —

{
  "Records": [{
      "EventVersion": "1.0",
      "EventSubscriptionArn": eventsubscriptionarn,
      "EventSource": "aws:sns",
      "Sns": {
         "SignatureVersion": "1",
         "Timestamp": "1970-01-01T00:00:00.000Z",
         "Signature": "EXAMPLE",
         "SigningCertUrl": "EXAMPLE",
         "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
         "Message": "Hello from SNS!",
         "MessageAttributes": {
            "Test": {
               "Type": "String",
               "Value": "TestString"
            },
            "TestBinary": {
               "Type": "Binary",
               "Value": "TestBinary"
            }
         },
         "Type": "Notification",
         "UnsubscribeUrl": "EXAMPLE",
         "TopicArn": topicarn,
         "Subject": "TestInvoke"
      }
   }]
}

Amazon Simple Mail Service

Amazon Simple Mail Service можно использовать для отправки сообщений, а также для получения сообщений. Функция AWS Lambda может вызываться в Simple Mail Service при получении сообщения.

Образец события получения электронной почты Amazon SES

Подробности события SES при использовании внутри AWS Lambda показаны ниже —

{
  "Records": [{
      "eventVersion": "1.0",
      "ses": {
         "mail": {
            "commonHeaders": {
               "from": [
                  "Jane Doe <janedoe@example.com>"
               ],
            "to": [
               "johndoe@Source.com"
            ],
            "returnPath": "janedoe@example.com",
            "messageId": "<0123456789Source.com>",
            "date": "Wed, 7 Oct 2015 12:34:56 -0700",
            "subject": "Test Subject"
         },
         "example": "janedoe@example.com",
         "timestamp": "1970-01-01T00:00:00.000Z",
         "destination": [
            "johndoe@example.com"
         ],
         "headers": [{
            "name": "Return-Path",
            "value": "<janedoe@example.com>"
         },
         {
            "name": "Received",
            "value": "from mailer.example.com (mailer.example.com [203.0.113.1]) by inbound-smtp.us-west-2.amazonaws.com with SMTP id o3vrnil0e2ic for johndoe@example.com; Wed, 07 Oct 2015 12:34:56 +0000 (UTC)"
         },
         {
            "name": "DKIM-Signature",
            "value": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=example; h=mime-version:from:date:message-id:subject:to:content-type; bh=jX3F0bCAI7sIbkHyy3mLYO28ieDQz2R0P8HwQkklFj4=; b=sQwJ+LMe9RjkesGu+vqU56asvMhrLRRYrWCbV"
         },
         {
            "name": "MIME-Version",
            "value": "1.0"
         },
         {
            "name": "From",
            "value": "Jane Doe <janedoe@example.com>"
         },
         {
            "name": "Date",
            "value": "Wed, 7 Oct 2015 12:34:56 -0700"
         },
         {
            "name": "Message-ID",
            "value": "<0123456789example.com>"
         },
         {
            "name": "Subject",
            "value": "Test Subject"
         },
         {
            "name": "To",
            "value": "johndoe@example.com"
         },
         {
            "name": "Content-Type",
            "value": "text/plain; charset=UTF-8"
         }],
         "headersTruncated": false,
         "messageId": "o3vrnil0e2ic28tr"
      },
      "receipt": {
         "recipients": [
            "johndoe@example.com"
         ],
         "timestamp": "1970-01-01T00:00:00.000Z",
         "spamVerdict": {
            "status": "PASS"
         },
         "dkimVerdict": {
            "status": "PASS"
         },
         "processingTimeMillis": 574,
         "action": {
            "type": "Lambda",
            "invocationType": "Event",
            "functionArn": "arn:aws:lambda:us-west-2:012345678912:function:example"
         },
         "spfVerdict": {
            "status": "PASS"
         },
         "virusVerdict": {
            "status": "PASS"
         }
      }
   },
   "eventexample": "aws:ses"
   }]
}

Amazon Cloudwatch Logs

AWS Lambda можно запустить из Amazon CloudWatch Logs, используя подписку CloudWatch Logs . Подписки CloudWatch Logs содержат данные в реальном времени о журналах, которые можно обрабатывать и анализировать в AWS Lambda или использовать для загрузки в другие системы.

Образец события Amazon CloudWatch Logs

{
   "awslogs": {
      "data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwW
      QRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpL
      wivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQ
      DQiMdxRQEAAA=="
   }
}

Amazon API Gateway

Лямбда-функция AWS может быть вызвана по URL-адресу https . ЭТО можно сделать на GET, POST, PUT . Когда вызывается https url, также запускается функция AWS Lambda, и данные, передаваемые в https с помощью get / post, можно сделать доступными внутри AWS Lambda, чтобы использовать их для вставки в DynamoDB или для отправки почты и т. Д.