En este proyecto, aprenderás a utilizar Terraform para desplegar una aplicación serverless. Las aplicaciones serverless permiten a los desarrolladores centrarse en el código sin preocuparse por la infraestructura subyacente. Utilizaremos AWS Lambda, API Gateway y DynamoDB para construir una aplicación simple.
Objetivos del Proyecto
- Configurar AWS Lambda: Crear una función Lambda que se ejecute en respuesta a eventos.
- Configurar API Gateway: Crear una API RESTful que invoque la función Lambda.
- Configurar DynamoDB: Crear una tabla DynamoDB para almacenar datos.
- Integrar los Componentes: Conectar Lambda, API Gateway y DynamoDB para crear una aplicación funcional.
Requisitos Previos
- Cuenta de AWS.
- Conocimientos básicos de Terraform.
- Conocimientos básicos de AWS Lambda, API Gateway y DynamoDB.
Paso 1: Configuración Inicial
1.1. Estructura del Proyecto
Crea una estructura de directorios para organizar los archivos de Terraform:
1.2. Archivo variables.tf
Define las variables necesarias para el proyecto:
variable "region" { description = "AWS region" default = "us-west-2" } variable "lambda_function_name" { description = "Name of the Lambda function" default = "MyServerlessFunction" } variable "dynamodb_table_name" { description = "Name of the DynamoDB table" default = "MyServerlessTable" }
1.3. Archivo outputs.tf
Define las salidas para obtener información útil después del despliegue:
output "api_gateway_url" { description = "URL of the API Gateway" value = aws_api_gateway_deployment.my_api.invoke_url }
Paso 2: Configurar AWS Lambda
2.1. Código de la Función Lambda
Crea un archivo index.js
en el directorio lambda/
con el siguiente contenido:
exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
2.2. Empaquetar la Función Lambda
Empaqueta el código en un archivo ZIP:
2.3. Definir el Recurso Lambda en main.tf
Añade el siguiente bloque de código en main.tf
para crear la función Lambda:
provider "aws" { region = var.region } resource "aws_lambda_function" "my_lambda" { function_name = var.lambda_function_name handler = "index.handler" runtime = "nodejs14.x" role = aws_iam_role.lambda_exec.arn filename = "lambda/function.zip" source_code_hash = filebase64sha256("lambda/function.zip") } resource "aws_iam_role" "lambda_exec" { name = "lambda_exec_role" assume_role_policy = jsonencode({ Version = "2012-10-17", Statement = [ { Action = "sts:AssumeRole", Effect = "Allow", Principal = { Service = "lambda.amazonaws.com" } } ] }) } resource "aws_iam_role_policy_attachment" "lambda_policy" { role = aws_iam_role.lambda_exec.name policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" }
Paso 3: Configurar API Gateway
3.1. Definir el Recurso API Gateway en main.tf
Añade el siguiente bloque de código en main.tf
para crear la API Gateway:
resource "aws_api_gateway_rest_api" "my_api" { name = "MyServerlessAPI" description = "API Gateway for serverless application" } resource "aws_api_gateway_resource" "my_resource" { rest_api_id = aws_api_gateway_rest_api.my_api.id parent_id = aws_api_gateway_rest_api.my_api.root_resource_id path_part = "myresource" } resource "aws_api_gateway_method" "my_method" { rest_api_id = aws_api_gateway_rest_api.my_api.id resource_id = aws_api_gateway_resource.my_resource.id http_method = "GET" authorization = "NONE" } resource "aws_api_gateway_integration" "my_integration" { rest_api_id = aws_api_gateway_rest_api.my_api.id resource_id = aws_api_gateway_resource.my_resource.id http_method = aws_api_gateway_method.my_method.http_method type = "AWS_PROXY" integration_http_method = "POST" uri = aws_lambda_function.my_lambda.invoke_arn } resource "aws_lambda_permission" "api_gateway" { statement_id = "AllowAPIGatewayInvoke" action = "lambda:InvokeFunction" function_name = aws_lambda_function.my_lambda.function_name principal = "apigateway.amazonaws.com" source_arn = "${aws_api_gateway_rest_api.my_api.execution_arn}/*/*" } resource "aws_api_gateway_deployment" "my_api" { depends_on = [aws_api_gateway_integration.my_integration] rest_api_id = aws_api_gateway_rest_api.my_api.id stage_name = "prod" }
Paso 4: Configurar DynamoDB
4.1. Definir el Recurso DynamoDB en main.tf
Añade el siguiente bloque de código en main.tf
para crear la tabla DynamoDB:
resource "aws_dynamodb_table" "my_table" { name = var.dynamodb_table_name billing_mode = "PAY_PER_REQUEST" hash_key = "id" attribute { name = "id" type = "S" } }
Paso 5: Integrar los Componentes
5.1. Actualizar la Función Lambda para Interactuar con DynamoDB
Actualiza el archivo index.js
para interactuar con DynamoDB:
const AWS = require('aws-sdk'); const dynamo = new AWS.DynamoDB.DocumentClient(); exports.handler = async (event) => { const params = { TableName: process.env.TABLE_NAME, Item: { id: '1', message: 'Hello from DynamoDB!' } }; await dynamo.put(params).promise(); const response = { statusCode: 200, body: JSON.stringify('Data saved to DynamoDB!'), }; return response; };
5.2. Actualizar la Configuración de Lambda en main.tf
Añade una variable de entorno para la tabla DynamoDB:
resource "aws_lambda_function" "my_lambda" { function_name = var.lambda_function_name handler = "index.handler" runtime = "nodejs14.x" role = aws_iam_role.lambda_exec.arn filename = "lambda/function.zip" source_code_hash = filebase64sha256("lambda/function.zip") environment { variables = { TABLE_NAME = aws_dynamodb_table.my_table.name } } }
Paso 6: Desplegar la Aplicación
6.1. Inicializar y Aplicar Terraform
Inicializa y aplica la configuración de Terraform:
Conclusión
En este proyecto, has aprendido a utilizar Terraform para desplegar una aplicación serverless en AWS utilizando Lambda, API Gateway y DynamoDB. Has configurado cada componente y los has integrado para crear una aplicación funcional. Este conocimiento te permitirá construir aplicaciones más complejas y escalables en el futuro.
Resumen de Conceptos Aprendidos
- AWS Lambda: Crear y configurar funciones Lambda.
- API Gateway: Crear y configurar API RESTful.
- DynamoDB: Crear y configurar tablas DynamoDB.
- Integración: Conectar Lambda, API Gateway y DynamoDB.
Próximos Pasos
- Experimenta con diferentes eventos que pueden desencadenar la función Lambda.
- Añade más endpoints a la API Gateway.
- Implementa operaciones CRUD completas en DynamoDB.
¡Felicidades por completar el proyecto!
Curso de Terraform
Módulo 1: Introducción a Terraform
- ¿Qué es Terraform?
- Instalando Terraform
- Conceptos Básicos de Terraform
- Primera Configuración de Terraform
Módulo 2: Lenguaje de Configuración de Terraform
Módulo 3: Gestión del Estado
Módulo 4: Módulos de Terraform
Módulo 5: Aprovisionamiento de Recursos
- Conceptos Básicos de Aprovisionamiento
- Aprovisionamiento de Recursos AWS
- Aprovisionamiento de Recursos Azure
- Aprovisionamiento de Recursos GCP
Módulo 6: Funcionalidades Avanzadas de Terraform
Módulo 7: Mejores Prácticas de Terraform
- Organización del Código
- Control de Versiones
- Pruebas del Código de Terraform
- Mejores Prácticas de Seguridad
Módulo 8: Terraform en CI/CD
- Integración de Terraform con CI/CD
- Automatización de Terraform con Jenkins
- Uso de Terraform con GitHub Actions
- Terraform Cloud y Enterprise