Resolución de problemas en Terraform

Modo depuración Podemos ejecutar Terraform con diferentes modos de logging de manera que podamos ver con más detalle las operaciones que está realizando a bajo nivel: TF_LOG=DEBUG terraform plan Los distintos modos disponibles son: TRACE DEBUG INFO WARN ERROR Desbloquear estado remoto de Terraform Terraform guarda el estado de la infraestructura remotamente, de manera que múltiples usuarios puedan ver el estado actual. Cuando un usuario inicia una operación, Terraform bloquea el estado remoto, así nadie más puede operar al mismo tiempo y provocar errores o conflictos. ...

June 1, 2022 · 3 min · José Luis Patiño Andrés

Asignación de un dominio personal a GCP API Gateway

GCP API Gateway es un producto de Google Cloud que ofrece un servicio de gateway que podemos utilizar como punto de entrada único a todas las APIs de nuestros microservicios desplegados en GCP. Una vez creado y configurado, GCP API Gateway se hace disponible a través de una URL generada automáticamente por Google, como por ejemplo https://megacorp-api-gateway-ayxsu52z.ew.gateway.dev. Esto puede no ser muy conveniente si queremos ofrecer nuestra Gateway al público, probablemente bajo un dominio de nuestra propiedad como podría ser simplemente https://api.megacorp.com. ...

April 22, 2022 · 4 min · José Luis Patiño Andrés

Usar datos GeoJSON para filtrar consultas en PostGIS

Suponiendo que tengamos un fichero, o simplemente un string, con GeoJSON, como por ejemplo: { "type": "MultiPoint", "coordinates": [ [-1.6402482999999999, 37.411843399999995], [-1.645345, 37.413398199999996], [-1.6453499999999999, 37.4129673], [-1.6453347, 37.41289], [-1.6455814, 37.4127428], [-1.6455834, 37.4136486], [-1.6402482999999999, 37.411843399999995] ] } y una base de datos PostGIS donde tengamos una tabla llamada field con un campo geometry, podríamos hacer una consulta para obtener todos los fields que intersecten con la geometría definida en el GeoJSON: SELECT field.id, field.name FROM field WHERE ST_Intersects(field_zone.geometry, ST_GeomFromGeoJSON(' { "type": "MultiPoint", "coordinates": [ [-1.6402482999999999, 37.411843399999995], [-1.645345, 37.413398199999996], [-1.6453499999999999, 37.4129673], [-1.6453347, 37.41289], [-1.6455814, 37.4127428], [-1.6455834, 37.4136486], [-1.6402482999999999, 37.411843399999995] ] }')); Los métodos de PostGIS utilizados son ST_Intersects, que comprueba intersección entre 2 objetos geometry o geography, y ST_GeomFromGeoJSON, que construye un objecto geometry a partir de su representación en GeoJSON. ...

February 2, 2022 · 1 min · José Luis Patiño Andrés

Seleccionar entradas inexistentes en PostgreSQL

En ocasiones podemos querer comprobar si el valor de una columna en una tabla existe en otra tabla. Sin que exista una relación de clave entre ellas. Por ejemplo, podríamos tener las tabla: CREATE TABLE usuario ( id serial PRIMARY KEY, nombre VARCHAR (50) NOT NULL, email VARCHAR (255) NOT NULL ); CREATE TABLE post ( id serial PRIMARY KEY, id_usuario INT NOT NULL, titulo VARCHAR (100) NOT NULL, contenido TEXT NOT NULL ); La tabla post tiene una columna id_usuario donde se debería poner el id del usuario que ha escrito el post. Sin embargo no es una Foreign Key, con lo cual no hay manera de saber si todos los post.ids concuerdan realmente con un usuario.id o si son números que no existen en la tabla usuario y por lo tanto son datos erróneos. ...

October 15, 2021 · 1 min · José Luis Patiño Andrés

Kong API Gateway

Iniciar Kong API Gateway con Docker docker run -d --name kong \ -e "KONG_DATABASE=off" \ -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \ -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \ -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \ -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \ -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \ -p 8000:8000 \ -p 8443:8443 \ -p 8001:8001 \ -p 8444:8444 \ kong Configuración ‘DB-less’ Kong puede ejecutarse en modo ‘DB-less, es decir sin necesidad de una base de datos, a través de ficheros YAML con instrucciones declarativas. Generación de fichero YAML inicial Para generar un fichero inicial desde una instancia de Kong ejecutándose a través de Docker hacemos: ...

September 25, 2021 · 1 min · José Luis Patiño Andrés

Generación de claves para cifrado de datos

Generación de un par de claves OpenSSL RSA Generar clave RSA privada openssl genrsa -<CIFRADO> -out <NOMBRE_FICHERO> <NUM_BITS> Donde: CIFRADO es el algoritmo de cifrado usado, por ejemplo -des3. NOMBRE_FICHERO es el nombre del fichero en el que se guardará la clave privada, por ejemplo simplemente private.pem. NUM_BITS es el número de bits que tendrá la clave, por ejemplo 2048. Generar clave RSA pública Una vez tenemos nuestra clave privada en un fichero, private.pem por ejemplo, podemos exportar la clave pública que será entregada a otros usuarios o sistemas que necesiten cifrar datos para nosotros: ...

September 17, 2021 · 1 min · José Luis Patiño Andrés

Librería GeoPandas para análisis de datos GIS en Python

A continuación se muestra una serie de ejemplos útiles de uso de la librería Python GeoPandas. Activar soporte para ficheros KML GeoPandas utiliza la librería Fiona para cargar datos desde ficheros. Por defecto, Fiona tiene el soporte para ficheros KML desactivado. Por lo tanto si usamos la función read_file() de GeoPandas con un fichero KML nos devuelve un error. Para activar el soporte de estos ficheros KML, podemos ejecutar la siguiente sentencia en nuestro programa Python: ...

August 18, 2021 · 2 min · José Luis Patiño Andrés

Librería GDAL para desarrollo GIS

A continuación se muestra una pequeña referencia sobre la instalación y algunos ejemplos de uso de la librería GDAL. Instalación Necesitaremos la librería base del sistema, escrita en C++, la cual es usada por GDAL-Python durante su compilación. La podemos instalar mediante apt en sistemas Debian: sudo apt-get install libgdal1-dev Una vez instalada la librería del sistema ya podemos instalar GDAL-Python. Es mucho mejor utilizar pygdal, que es una versión actualizada más amigable con el sistema de instalación de pip: ...

July 29, 2021 · 1 min · José Luis Patiño Andrés

Ejemplos de uso de curl

Configuración básica Podemos añadir estos argumentos de entrada del comando curl a un fichero .curlrc en nuestro directorio de usuario y entonces se ejecutarán siempre. Silenciar salida de metadatos de curl De normal, al hacer curl http://example.com curl imprime una cabecera con metadatos del estado de la comunicación. curl http://example.com % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 12051 100 12051 0 0 16110 0 --:--:-- --:--:-- --:--:-- 16089 Si esto nos molesta, lo podemos eliminar con el argumento --silent. ...

July 21, 2021 · 2 min · José Luis Patiño Andrés

Borrar múltiples DBs en PostgreSQL

En el caso de que tengamos múltiples bases de datos llamadas de forma similar, por ejemplo como resultado de tests automatizados que las han ido creando, se puede facilitar el borrado de dichas bases de datos con la siguiente consulta: SELECT 'DROP DATABASE "'||datname||'";' FROM pg_database WHERE datname LIKE 'my_project_test_%'; En el caso de que tuviésemos muchas bases de datos con nombres del estilo my_project_test_1234, esto nos devolvería un resultado tal que así: ?column? ---------------------------------------------- DROP DATABASE "my_project_test_101534"; DROP DATABASE "my_project_test_101622"; DROP DATABASE "my_project_test_101731"; DROP DATABASE "my_project_test_101750"; DROP DATABASE "my_project_test_101889"; DROP DATABASE "my_project_test_102287"; DROP DATABASE "my_project_test_102299"; DROP DATABASE "my_project_test_102335"; DROP DATABASE "my_project_test_102408"; DROP DATABASE "my_project_test_102453"; DROP DATABASE "my_project_test_103004"; DROP DATABASE "my_project_test_103091"; DROP DATABASE "my_project_test_104146"; DROP DATABASE "my_project_test_108842"; DROP DATABASE "my_project_test_108865"; DROP DATABASE "my_project_test_109633"; (16 rows) Entonces borrarlas todas sería muy fácil: basta con copiar ese bloque de consultas y pegarlo en la misma shell psql. ...

June 24, 2021 · 1 min · José Luis Patiño Andrés