├── .gitignore ├── LICENSE ├── README.md ├── docs ├── TUTORIAL.md └── images │ ├── step-1.png │ ├── step-10.png │ ├── step-11.png │ ├── step-12.png │ ├── step-13.png │ ├── step-14.png │ ├── step-15.png │ ├── step-16.png │ ├── step-17.png │ ├── step-2.png │ ├── step-3.png │ ├── step-4.png │ ├── step-5.png │ ├── step-6.png │ ├── step-7.png │ ├── step-8.png │ └── step-9.png ├── function.zip ├── function ├── index.js └── package.json └── pack.sh /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .idea 3 | package-lock.json 4 | node_modules/ 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Um Inventor Qualquer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Aula prática de AWS Lambda 2 | 3 | Neste repositório você encontra os códigos de uma função lambda básica para demonstração. 4 | 5 | Este código foi criado para o vídeo do YouTube https://youtu.be/RCK9fBwrZeY 6 | 7 | ### Esta função retorna: 8 | As estatísticas de uso do Lambda através da função `lambda.getAccountSettings()` e retorna o objeto: 9 | ```json 10 | { 11 | "TotalCodeSize": 1007, 12 | "FunctionCount": 1 13 | } 14 | ``` 15 | 16 | ### O Objetivo é demonstrar: 17 | - A estrutura básica de uma função do AWS Lambda; 18 | - Como criar permissões para o Lambda no IAM; 19 | - Como criar uma trigger no API Gateway para chamar a função Lambda; 20 | 21 | ### Estrutura 22 | - `function/index.js`: Contém a função Lambda a ser executada 23 | - `function/package.json`: Arquivo de dependências do nodejs 24 | - `function.zip`: Versão zipada para upload 25 | 26 | ### Empacotamento da função 27 | Esta função utiliza apenas o pacote do `aws-sdk` que não é necessário ser enviado para a AWS, mas por padrão ele é 28 | instalado e empacotado com a função. O conteúdo do arquivo `function/index.js` pode ser inserido diretamente no painel 29 | do lambda sem a inclusão do diretório `node_modules`. 30 | 31 | Para preparar o arquivo ZIP para upload basta executar o comando `pack.sh`. Se você utilizar este repositório como 32 | modelo para desenvolver funcionalidades mais complexas e/ou que contenham mais arquivos necessários para ser executada, 33 | não se esqueça de editar o arquivo `pack.sh` e incluir os arquivos adicionais. 34 | 35 | ### Tutorial 36 | Para seguir o passo-a-passo, acesse o [TUTORIAL](docs/TUTORIAL.md) 37 | 38 | -------------------------------------------------------------------------------- /docs/TUTORIAL.md: -------------------------------------------------------------------------------- 1 | # Tutorial de criação de função Lambda com trigger em AWS API Gateway 2 | 3 | ### Passo 1: 4 | No seu painel principal do AWS Lambda, clique no botão `Create Function` (`Criar Função`). 5 | 6 | ![image info](./images/step-1.png) 7 | 8 | ### Passo 2: 9 | Na tela de criação de função selecione a opção `Author from Scratch` (`Criar do zero`). 10 | Insira um nome para sua função. 11 | Selecione a versão da engine do Node JS que deve ser usada 12 | Na área `Execution Role` (`Papel de execução`) deixe a opção padrão para que o lambda crie uma role padrão 13 | com permissão de envio de dados para o CloudWatch. 14 | 15 | ![image info](./images/step-3.png) 16 | 17 | ### Passo 4: 18 | Na tela da função lambda cole o conteúdo do arquivo `function/index.js`, salve e clique no botão `Deploy` 19 | para disponibilizar a função lambda para execução. 20 | 21 | ![image info](./images/step-4.png) 22 | 23 | ### Passo 5: 24 | Na aba `Configuration` (Configuração) selecione o item `Permissions` (`Permissões`) no menu lateral esquerdo, 25 | e em seguida clique na role exibida na caixa `Execution Role` (`Papel de Execução`) para ir para a tela do 26 | IAM. 27 | 28 | ![image info](./images/step-5.png) 29 | 30 | ### Passo 6: 31 | Na tela de detalhes da role no IAM, você tem duas opções, criar uma nova `policy` (`política`) ou adicionar 32 | uma política em linha, vamos pela segunda opção, então ao lado direito clique no link `Add inline policy` 33 | (`Adicionar política em linha`). 34 | 35 | ![image info](./images/step-6.png) 36 | 37 | ### Passo 7: 38 | Clique em `Choose a service` (`Escolha um serviço`) e digite `lambda` no campo de busca. 39 | 40 | ![image info](./images/step-7.png) 41 | 42 | ### Passo 8: 43 | Selecione a opção `Lambda` nos resultados abaixo. 44 | 45 | ![image info](./images/step-8.png) 46 | 47 | ### Passo 9: 48 | No item `Access level` (`Nível de acesso`) selecione o item `Read` (`Leitura`) para expandir as opções e marque 49 | a opção `GetAccountSettings`. Clique em `Review Policy` (`Revisar política`). 50 | 51 | ![image info](./images/step-9.png) 52 | 53 | ### Passo 10: 54 | Dê um nome para sua nova política de segurança, e clique em `Create Policy` (`Criar Política`). 55 | 56 | ![image info](./images/step-10.png) 57 | 58 | ### Passo 11: 59 | Agora você deve poder ver a sua nova política listada na role da sua função lambda. 60 | 61 | ![image info](./images/step-11.png) 62 | 63 | ### Passo 12: 64 | De volta a tela da sua função lambda, clique no botão `Add Trigger` (`Adicionar Gatilho`) e selecione a opção 65 | API Gateway. 66 | 67 | ![image info](./images/step-4.png) 68 | 69 | ### Passo 13: 70 | Selecione `Create an API` (`Criar uma API`). 71 | Selecione `REST API` (`API REST`). 72 | Em `Security` (`Segurança`) selecione a opção `Open` (`Abrir`). 73 | Digite um nome para sua API. 74 | Na opção `Deployment stage` (`Estágio de implantação`) digite `dev`. 75 | Deixe o restante das opções como padrão e clique em `Add` (`Adicionar`). 76 | 77 | ![image info](./images/step-12.png) 78 | 79 | ### Passo 14: 80 | Agora na lista de trigger você pode visualizar sua API já criada e o `API Endpoint` (`Endpoint da API`), que é 81 | o endereço que você deve usar no seu navegador para invocar sua função lambda. 82 | 83 | ![image info](./images/step-13.png) 84 | 85 | ### Passo 15: 86 | Este é o resultado da sua função. 87 | 88 | ![image info](./images/step-14.png) 89 | 90 | ### Passo 16: 91 | Na aba `Monitor` você terá acesso às métricas e logs da sua função e poderá conferir informações como o número 92 | de vezes que sua função foi invocada, tempo de resposta entre outras. 93 | 94 | ![image info](./images/step-15.png) 95 | 96 | ### Passo 17: 97 | Ainda na aba `Monitor` da sua função lambda você pode ver os logs detalhados de acesso. 98 | 99 | ![image info](./images/step-16.png) 100 | 101 | ### Passo 18: 102 | Entrando no painel do AWS API Gateway, é dessa maneira que a configuração do seu API Gateway irá parecer quanto 103 | a integração com sua função lambda. 104 | 105 | ![image info](./images/step-17.png) 106 | 107 | -------------------------------------------------------------------------------- /docs/images/step-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-1.png -------------------------------------------------------------------------------- /docs/images/step-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-10.png -------------------------------------------------------------------------------- /docs/images/step-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-11.png -------------------------------------------------------------------------------- /docs/images/step-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-12.png -------------------------------------------------------------------------------- /docs/images/step-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-13.png -------------------------------------------------------------------------------- /docs/images/step-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-14.png -------------------------------------------------------------------------------- /docs/images/step-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-15.png -------------------------------------------------------------------------------- /docs/images/step-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-16.png -------------------------------------------------------------------------------- /docs/images/step-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-17.png -------------------------------------------------------------------------------- /docs/images/step-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-2.png -------------------------------------------------------------------------------- /docs/images/step-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-3.png -------------------------------------------------------------------------------- /docs/images/step-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-4.png -------------------------------------------------------------------------------- /docs/images/step-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-5.png -------------------------------------------------------------------------------- /docs/images/step-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-6.png -------------------------------------------------------------------------------- /docs/images/step-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-7.png -------------------------------------------------------------------------------- /docs/images/step-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-8.png -------------------------------------------------------------------------------- /docs/images/step-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/docs/images/step-9.png -------------------------------------------------------------------------------- /function.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UmInventorQualquer/tutorial-lambda-basico/e6bd812cdf0b4ceffae8b5a4257151833b25b381/function.zip -------------------------------------------------------------------------------- /function/index.js: -------------------------------------------------------------------------------- 1 | const AWS = require('aws-sdk') 2 | const lambda = new AWS.Lambda() 3 | 4 | // Handler 5 | exports.handler = async function(event, context) { 6 | try { 7 | let accountSettings = await getAccountSettings() 8 | return formatResponse(serialize(accountSettings.AccountUsage)) 9 | } catch(error) { 10 | return formatError(error) 11 | } 12 | } 13 | 14 | const formatResponse = function(body){ 15 | const response = { 16 | "statusCode": 200, 17 | "headers": { 18 | "Content-Type": "application/json" 19 | }, 20 | "isBase64Encoded": false, 21 | "body": body 22 | } 23 | return response 24 | } 25 | 26 | const formatError = function(error){ 27 | const response = { 28 | "statusCode": error.statusCode, 29 | "headers": { 30 | "Content-Type": "text/plain", 31 | "x-amzn-ErrorType": error.code 32 | }, 33 | "isBase64Encoded": false, 34 | "body": error.code + ": " + error.message 35 | } 36 | return response 37 | } 38 | 39 | const getAccountSettings = function(){ 40 | return lambda.getAccountSettings().promise() 41 | } 42 | 43 | const serialize = function(object) { 44 | return JSON.stringify(object, null, 2) 45 | } 46 | -------------------------------------------------------------------------------- /function/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "projeto", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "aws-sdk": "^2.1000.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /pack.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo "- Removing the current function.zip file..." 3 | rm -f function.zip 4 | cd function 5 | echo "- Installing dependencies..." 6 | npm i &>/dev/null 7 | echo "- Compressing function files into function.zip..." 8 | zip -q -r ../function.zip index.js node_modules package.json 9 | cd ../ 10 | echo "DONE" 11 | --------------------------------------------------------------------------------