Skip to content

MVIEIRAB/aws-lambda-function

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Introdução

Recurso em nuvem que permite que nós criemos funções, ou trechos de códigos que executam ações especificas sem ter a necessidade de ter um servidor em pé (maquina), nem ter configurado um apache, ou um serviço HTTP.

Benefícios

É possível ter esse serviço consumido em algumas formas, as principais são:

  • Executado por eventos: Eventos táis como, dentro do escopo da AWS, caso um arquivo for upado em uma bucket, essa função escutará essa sinalização e executara uma ação em cima disso, além de executar com base no evento, da pra capturar os dados que foram recebidos, pra fazermos tratamentos especificos daquele determinado objeto.
  • Serviço HTTP: Temos também a opção de expor essa função como uma API, dai então será executado sempre que alguem enviar alguma chamada para a URL.

Aqui é cobrado somente o tempo de uso. Nesse caso, o serviço ficará em “stand by”, até que alguem o chame.

Adicionais

  • AWS API Gateways
  • LAMBDA Function Layer

Configuração + Caso de uso

Configuração inicial do package.json

{
  "name": "isodd-lambda",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "prebuild": "rm -rf dist",
    "build": "tsup index.ts",
    "postbuild": "cd dist && zip -r index.zip index.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "is-odd": "^3.0.1"
  },
  "devDependencies": {
    "aws-lambda": "^1.0.7",
    "aws-sdk": "^2.1562.0",
    "@types/aws-lambda": "^8.10.134",
    "@types/is-odd": "^3.0.4",
    "@types/node": "^20.11.19",
    "tsup": "^8.0.2",
    "tsx": "^4.7.1",
    "typescript": "^5.3.3"
  }
}

Conteúdo do arquivo principal index.ts, o código simplesmente retorna true se o numero enviadono corpo for pár ou ímpar se for ímpar.

import { APIGatewayProxyEvent, APIGatewayProxyResult } from "aws-lambda";
import isOdd from "is-odd";

export const handler = async (
  event: APIGatewayProxyEvent
): Promise<APIGatewayProxyResult> => {
  try {
    const number = JSON.parse(event.body!).number;
    const shouldIReturnTrue = isOdd(number);

    if (shouldIReturnTrue)
      return {
        statusCode: 200,
        body: JSON.stringify({
          message: "The number is odd! :)",
        }),
      };

    return {
      statusCode: 200,
      body: JSON.stringify({
        message: "The number is not odd! :(",
      }),
    };
  } catch (err) {
    console.log(err);

    return {
      statusCode: 500,
      body: JSON.stringify({
        message: "some error happened",
      }),
    };
  }
};

Comando usado pra registrar uma regra de execução

aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{"Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'

Comando usado pra atribuir uma politica na minha regra criada acima, para o funcionamento da função

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

Criando a função lambda pelo CLI, já vinculando as regras e politicas acima

aws lambda create-function --function-name my-function \
--zip-file fileb://dist/index.zip --handler index.handler --runtime nodejs20.x \
--role arn:aws:iam::YOUR_ACCOUNT_ID:role/lambda-ex

Criando um API Gateway para acessar a nossa função através do HTTP

Untitled

Obs: Sem autenticação;

Configurando camada a parte para acesso as bibliotecas externas do Nodejs dentro da nossa função, que está sendo executada dentro da AWS

Criando os arquivos que serão enviados para a camada de execução da função

{
  "name": "isodd-layer",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "is-odd": "^3.0.1"
  }
}

Incluir uma nova pasta e um novo arquivo package.json, iremos instalar as deps dele dentro dessa pasta e zipalo voltando para a rais da pasta.

Nomeei a pasta de nodejs → package.json + package-lock.json + node_modules

Com o zip dessa pasta contendo o package json e o node_modules, executei o comando de publicação de uma camada para a função em questão

aws lambda publish-layer-version --layer-name my-layer \
 --description “My layer” \
 --license-info “MIT” \
 --zip-file fileb://nodejs.zip \
 --compatible-runtimes nodejs20.x nodejs18.x \
 --compatible-architectures “arm64” “x86_64”

Resposta do comando

{
 “Content”: {
 “Location”: “https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-4aaa2fbb-ff77-4b0a-ad92-5b78a716a96a?versionId=27iWyA73cCAYqyH...",
 “CodeSha256”: “tv9jJO+rPbXUUXuRKi7CwHzKtLDkDRJLB3cC3Z/ouXo=”,
 “CodeSize”: 169
 },
 “LayerArn”: “arn:aws:lambda:us-east-2:123456789012:layer:my-layer”,
 “LayerVersionArn”: “arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1”,
 “Description”: “My layer”,
 “CreatedDate”: “2023–11–14T23:03:52.894+0000”,
 “Version”: 1,
 “CompatibleArchitectures”: [
 “arm64”,
 “x86_64”
 ],
 “LicenseInfo”: “MIT”,
 “CompatibleRuntimes”: [
 “nodejs20.x”,
 “nodejs18.x”
 ]
}

Com a informação contida no campo “LayerVersionArn”, executo o comando pra atualizar minha atual função, aplicando a camada criada acima

aws lambda update-function-configuration --function-name my-function \
    --layers NOME_DA_LAYER_LayerVersionArn

About

Projeto criado para aprender a trabalhar com funcoes serverless lambda da AWS

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published