No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Secretos y API Keys

21/30
Recursos

驴C贸mo configurar la conexi贸n a la base de datos al desarrollar una funci贸n Lambda?

Cuando est谩s desarrollando funciones Lambda, especialmente para aplicaciones en AWS, una de las partes m谩s cr铆ticas es configurar correctamente la conexi贸n a tu base de datos. En este caso en particular, discutiremos c贸mo establecer una conexi贸n a una base de datos Postgres desde una funci贸n Lambda, asegur谩ndonos de hacerlo de manera eficiente y segura.

驴C贸mo crear la estructura del proyecto?

  1. Configura el directorio y los archivos necesarios:

    • Crea un nuevo directorio database dentro de tu proyecto de seguimiento de GitHub (GitHub Tracker).
    • Dentro de este directorio, crea un archivo database.go.
  2. Implementaci贸n de l贸gica de conexi贸n:

    • El paquete de database debe incluir la l贸gica necesaria para conectarse a una base de datos. Aunque es transversal a todas las bases de datos, este ejemplo se centrar谩 en Postgres.
  3. Define el m茅todo de conexi贸n:

    • Usa un m茅todo Connect que reciba un objeto context y devuelva una conexi贸n SQL.
    • Utiliza syncMuter en una variable dbOnce para garantizar que la conexi贸n se realice solo una vez.

驴C贸mo obtener credenciales con el Cliente de Secrets Manager?

  1. Configuraci贸n de las variables de entorno:
    • Extrae informaci贸n como host, puerto, usuario y un secret ID de las variables de entorno.
  2. Manipulaci贸n con AWS Secrets Manager:
    • Crea un cliente para Secrets Manager para acceder al API y obtener el secret ID.
    • Desempaque el secreto que viene como un mapa de JSON a un mapa de strings.

驴C贸mo a帽adir dependencias y sincronizarlas?

  1. Incluir el driver de Postgres:

    • Aseg煤rate de tener el driver de Postgres entre tus dependencias para garantizar la conexi贸n correcta.
  2. Descarga dependencias con Go:

    • Utiliza go get para obtener librer铆as necesarias, incluidas config y el SDK de AWS.
  3. Sincroniza con el archivo vendor:

    • Usa go mod vendor para asegurar que todas las dependencias est茅n correctamente alineadas y go mod dig para validarlas.

驴C贸mo configurar la funci贸n Lambda getMetrix?

  1. Estructura de la respuesta:

    • Define la respuesta que devolver谩 la Lambda, la cual incluir谩 autor, n煤mero de commits y detalles de cada commit.
  2. Validar par谩metros de entrada:

    • Extrae y valida el email desde los path parameters del request. Si falta, retorna un badRequest.
  3. Conexi贸n a la base de datos:

    • Utiliza la l贸gica de conexi贸n configurada previamente para establecer la comunicaci贸n con la base de datos y manejar posibles errores.
  4. Manipulaci贸n de datos:

    • Con los commits obtenidos, utiliza una funci贸n parseResponse para transformarlos en un objeto de respuesta que pueda ser enviado por el API Gateway.
  5. Conversi贸n a JSON:

    • Empaqu茅talos utilizando marshall para transformar la respuesta a un JSON y ajusta los headers a application/json.

驴Qu茅 m谩s considerar antes de probar la funci贸n Lambda?

  1. Datos en la base de datos:

    • Inserta registros dummy en la base de datos usando herramientas como pgAdmin para garantizar que haya datos al probar la Lambda.
  2. Configuraci贸n en AWS:

    • Aseg煤rate de que la funci贸n Lambda tenga permisos para acceder al API de Secrets mediante la configuraci贸n en Terraform y verifica los grupos de seguridad para conexiones IP.

Este proceso asegura que tu funci贸n Lambda no solo se conecte de manera eficiente a tu base de datos, sino que tambi茅n maneje de manera segura y l贸gica cualquier posible error en el proceso. 隆No hay mejor momento para poner en pr谩ctica estos conocimientos y seguir experimentando para optimizar tus soluciones en AWS!

Aportes 3

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

```js INSERT INTO commits (repo_name, commit_id, commit_message, author_username, author_email, payload) VALUES ('mi_proyecto', '123456789abcdef0', 'A帽adiendo nueva funcionalidad', 'usuario123', '[email protected]', '{ "files": ["archivo1.txt", "archivo2.jpg"], "changes": 50}'); ```
```js package database import ( "context" "database/sql" "encoding/json" "fmt" "github-tracker/github-tracker/models" "os" "sync" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/secretsmanager" _ "github.com/lib/pq" ) var ( getDbOnce sync.Once db *sql.DB ) func connect(ctx context.Context) (*sql.DB, error) { dbHost := os.Getenv("DB_HOST") dbPort := os.Getenv("DB_PORT") dbUser := os.Getenv("DB_USER") dbPasswordSecretId := os.Getenv("DB_PASSWORD") dbName := os.Getenv("DB_NAME") config, err := config.LoadDefaultConfig(context.Background(), config.WithRegion(models.REGION)) if err != nil { return &sql.DB{}, err } svc := secretsmanager.NewFromConfig(config) input := &secretsmanager.GetSecretValueInput{ SecretId: aws.String(dbPasswordSecretId), VersionStage: aws.String("AWSCURRENT"), } result, err := svc.GetSecretValue(ctx, input) if err != nil { return &sql.DB{}, err } if result.SecretString == nil { return &sql.DB{}, err } passwordJson := *result.SecretString var secret map[string]string err = json.Unmarshal([]byte(passwordJson), &secret) if err != nil { return &sql.DB{}, err } password := secret["password"] dsn := fmt.Sprintf(`host=%s port=%s user=%s password=%s dbname=%s sslmode=require search_path=public`, dbHost, dbPort, dbUser, password, dbName, ) return sql.Open("postgres", dsn) } func Connect(ctx context.Context) (*sql.DB, error) { var err error getDbOnce.Do(func() { db, err = connect(ctx) }) return db, err } ```
```js type Response struct { Author string `json:"author"` Count int `json:"commits_count"` Commits []Commit `json:"commits"` } type Commit struct { ID string `json:"id"` Repo string `json:"repo"` Message string `json:"message"` } ```