Skip to content

setterlee/serverless-aws-python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Como iniciar desde cero una función Serverless

Para el desarrollo de las funciones serverless estaremos utilizando serverless framework por lo que para ello debemos tener los siguientes programas instalados:

tambien utilizaremos python como lenguaje principal, las funciones pueden ser probadas de forma local pero se recomienda hacer pruebas en ambiente de desarrollo AWS para verificar que las librerías python requeridas se instalen correctamente durante el despliegue gestionado por serverless.

Preparación de ambiente local:

Serverless framework (en adelante sls) ofrece herramientas de administración y monitoreo a funciones serverless.

En caso de se quiera tener acceso al dashboard de sls, se debe iniciar sesión a través del siguiente comando:

sls login

Para que sls tenga acceso a las herramientas de amazon se debe iniciar sesión en amazon a través de la línea de comandos de AWS-CLI

aws configure

Dato:

Para mayor detalle de como configurar la sesión de aws revisar la siguiente documentación: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html


Creación aplicación base:

Para iniciar debemos crear una carpeta nueva en donde queremos que quede todo nuestro código y las definiciones de las funciones lambda a desplegar.

Se pueden definir varias funciones lambda en un mismo proyecto sls

Dentro de la carpeta debemos ejecutar el siguiente comando:

npm init -f

Una vez inicializado el proyecto, ejecutamos el siguiente comando para instalar la librería sls que nos ayudará a gestionar los requerimientos python al desplegar:

npm install --save-dev serverless-python-requirements

Ahora debemos crear nuestro archivo de definición sls (serverless.yml) con el siguiente contenido:


service: example

plugins:
  - serverless-python-requirements

package:
  exclude:
    - node_modules/**
    - .idea/**
    - .requirements/**
    - env/**
    - README.md
    - package.json
    - package-lock.json
    - requirements.txt
    
custom:
  parameters:
    apiUrl: ${opt:apiUrl, self:custom.defaults-parameters-values.apiUrl}
  defaults-parameters-values:
    apiUrl: "https://jsonplaceholder.typicode.com/todos/1"


provider:
  name: aws
  runtime: python3.8

functions:
  main:
    handler: src/handler.main
    events:
      - http:
          path: /
          method: get
    environment:
      API_URL: ${self:custom.parameters.apiUrl}

Dato:

Para usar el dashboard de sls, se debe crear la aplicacion primero en el sitio serverless.com y agregar lo siguiente al inicio de serverless.yml:

org: setterlee
app: example

donde la organizacion y el nombre de la app deben coincidir con los datos de la cuenta que se desea usar previamente creada la app dentro de serverless


Una vez especificadas las configuraciones en serverless.yml, debemos desarrollar la función de entrada al método que queremos exponer, este código se almacenará en el archivo handler.py y para mantener organizado los archivos lo crearemos dentro de una carpeta llamada src



import json
import os
from aiohttp import request

import asyncio

loop = asyncio.get_event_loop()

async def get(url, headers):
    async with request('GET', url, headers=headers) as response:
        
        if response.status > 300:
            raise Exception(await response.text())
        
        return  await response.json()

async def main_async(event, context):
    body = {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "input": event,
        "request-response": await get(os.environ['API_URL'], {}) 
    }

    response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }

    return response

def main(event, context):   
    return loop.run_until_complete(main_async(event, context))

 

Terminado el desarrollo, debemos instalar las dependencias en un entorno privado virtual de python para poder desplegar la función:


virtualenv venv --python=python3
source venv/bin/activate

Dato:

En el siguiente enlace pueden conseguir mayor detalle de entornos virtuales en python: https://docs.python.org/3/tutorial/venv.html


Como nuestro código hace uso de la librería aiohttp, debemos instalarla y congelar la versión en nuestro archivo requirements.txt ejecutando los siguientes comando en la raíz del proyecto:

pip install aiohttp
pip freeze > requirements.txt

Adicionalmente nuestro código hace uso de la librería asyncio para poder ejecutar los métodos de forma asíncrona internamente, aun así no hace falta incluirlo en el comando anterior ya que es una librería de python al igual que json

Una vez instaladas las librerías, se despliega el servicio con el siguiente comando:

sls deploy

El resultado del comando exitoso debe mostrar lo siguiente:


Serverless: Stack update finished...
Service Information
service: example
stage: dev
region: us-east-1
stack: example-dev
resources: 17
api keys:
  None
endpoints:
  GET - https://XXXXXX.execute-api.us-east-1.amazonaws.com/dev/
functions:
  main: example-dev-main
layers:
  None
Serverless: Publishing service to the Serverless Dashboard...

Donde “https://XXXXXX.execute-api.us-east-1.amazonaws.com/dev/” es nuestro nuevo endpoint

En caso de querer probar la funcion de forma local, se puede invocar con el siguiente comando:

serverless invoke local --function main

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages