Локальная отладка лямбда-программы aws с помощью sam

задняя часть Командная строка Docker AWS

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

Самое интересное, что есть инструмент sam cli, который можно использовать для локальной отладки лямбда-программ.

Installation


помещение

Для локального запуска бессерверных программ с помощью sam cli необходимо установить и запустить docker. sam cli подключается к процессу docker с помощью переменной среды DOCKER_HSOT.

Установите sam-cli с помощью pip

Подсчитано, что документацию по aws никто не обновлял, или есть только инструкции по установке sam cli на npm.Старый sam cli устанавливается npm. Итак, здесь я рекомендую использовать последнюю версию sam cli, которая устанавливается вместе с pip.

требуется питон 2.7

pip install --user aws-sam-cli

Проверьте, прошла ли установка успешно

sam --version SAM CLI, version 0.3.0

Usage


Продолжайте использовать пример срабатывания события S3 из предыдущей статьи, если вы ее не читали, рекомендуем сначала прочитать.Разрабатывайте бессерверные программы с помощью aws lambda

1. Пример кода

from __future__ import print_function

import json
import urllib
import boto3

print('Loading function')

s3 = boto3.client('s3')

def lambda_handler(event, context):
    # Get the object from the event and show its content type
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'].encode('utf8'))
    try:
        response = s3.get_object(Bucket=bucket, Key=key)
        print("CONTENT TYPE: " + response['ContentType'])
        return response['ContentType']
    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e

2. Исходный каталог

3. Создайте тестовые случаи

sam local generate-event s3 --region us-east-1 --bucket test4lambda --key lambda-test.txt > event.json

Корзина S3 (test4lambda) и ключ (lambda-test.txt) должны быть созданы заранее.

Создайте следующий вариант использования

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

4. Напишите файл конфигурации yaml

Конечно, вам не нужно писать его вручную, вы можете экспортировать его в лямбда-фон.

4.1 Экспорт функций

4.2 Загрузите файл AWS SAM

4.3 Полученный файл конфигурации выглядит следующим образом

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: >-
  An Amazon S3 trigger that retrieves metadata for the object that has been
  updated.
Resources:
  myTest1:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: lambda_function.lambda_handler
      Runtime: python2.7
      CodeUri: .
      Description: >-
        An Amazon S3 trigger that retrieves metadata for the object that has
        been updated.
      MemorySize: 128
      Timeout: 3
      Role: 'arn:aws:iam::851829110870:role/service-role/lambdaTest'
      Events:
        BucketEvent1:
          Type: S3
          Properties:
            Bucket:
              Ref: Bucket1
            Events:
              - 's3:ObjectCreated:*'
      Tags:
        'lambda-console:blueprint': s3-get-object-python
  Bucket1:
    Type: 'AWS::S3::Bucket'

4.4 Последние три документа:

бегать


sam local invoke myTest1 -e event.json -t myTest1.yaml

Даже предложил "тайм-аут через 3 секунды"

Решение: найдите поле Timeout в myTest1.yaml и измените его на 30.

Запустите его снова и успешно выведите «text/plain», что является результатом оператора печати в коде Python.

Эпилог


Локальная лямбда-среда отладки завершена. У sam есть еще много функций, больше обучения, вы можете выполнить следующие две команды

➜ sam --help
Usage: sam [OPTIONS] COMMAND [ARGS]...

  AWS Serverless Application Model (SAM) CLI

  The AWS Serverless Application Model extends AWS CloudFormation to provide
  a simplified way of defining the Amazon API Gateway APIs, AWS Lambda
  functions, and Amazon DynamoDB tables needed by your serverless
  application. You can find more in-depth guide about the SAM specification
  here: https://github.com/awslabs/serverless-application-model.

Options:
  --debug    Turn on debug logging
  --version  Show the version and exit.
  --help     Show this message and exit.

Commands:
  init      Initialize a serverless application with a...
  package   Package an AWS SAM application. This is an alias for 'aws
            cloudformation package'.
  local     Run your Serverless application locally for...
  validate  Validate an AWS SAM template.
  deploy    Deploy an AWS SAM application. This is an alias for 'aws
            cloudformation deploy'.
➜ sam local generate-event --help
Usage: sam local generate-event [OPTIONS] COMMAND [ARGS]...

  Generate an event

Options:
  --help  Show this message and exit.

Commands:
  api       Generates a sample Amazon API Gateway event
  dynamodb  Generates a sample Amazon DynamoDB event
  kinesis   Generates a sample Amazon Kinesis event
  s3        Generates a sample Amazon S3 event
  schedule  Generates a sample scheduled event
  sns       Generates a sample Amazon SNS event