Ampliamos nuestra API para aprovisionar mejor con Terraform
Hace poco, un cliente se puso en contacto con nosotros para expresarnos su deseo de aprovisionar Transloadit con Hashicorp y su Terraform. Ya tenemos disponible el Terraform Provider Plugin (English), que aprovecha nuestra API para configurar una cuenta y Templates. Sin embargo, como señaló el cliente, faltaba una funcionalidad clave. Las credenciales de Template aún tenían que crearse y gestionarse a través de la interfaz de usuario de la Console.
Esta era la única forma de hacerlo… ¡hasta hoy! Ahora hemos añadido un endpoint adicional que hace posible gestionar tus credenciales de terceros sin tener que pasar por nuestro sitio web para hacerlo al viejo estilo de apuntar y hacer clic.
Si ya vas un paso por delante, aquí tienes la documentación del endpoint de la API de credenciales de Template.

¿Por qué es necesario?
El responsable de ingeniería de Tastemade Bryan McLemore nos dio a conocer este caso de uso y nos describió cómo nuestra API de aquel momento hacía que más personas de las necesarias quedaran expuestas a los secretos de la API.
Solo les quedaban dos opciones:

Podríamos romper nuestros principios en torno a la automatización y crear manualmente las claves IAM, que hay que copiar a mano en la Transloadit Console. Ese proceso, por sí mismo, aumentaría el número de personas que necesitan tener acceso al secreto y, además, obligaría a más personas a verlo. Ninguna de las dos cosas es buena.
Como alternativa, inyectamos los secretos en los Templates a medida que se generan en Terraform. Esto preserva la automatización, pero hace que cualquiera que pueda ver la definición del Template también pueda ver los secretos, ya que se almacenan en texto plano. Tendrían que esforzarse para verlos, pero sigue siendo posible.
Ninguna de estas opciones es ideal. En su lugar, decidimos tener en cuenta los comentarios de Bryan
e introducir el endpoint de la API /template_credentials para sortear este incómodo intercambio de
secretos. Así es como él imaginaba que ocurriría:
El patrón general que sigo es que las claves IAM (y otros secretos) se generan con Terraform y luego se almacenan directamente allí donde se necesitan. Por ejemplo, nuestras variables de CI y, en este caso, nuestros nuevos Templates de Transloadit. Para mitigar los riesgos asociados a la generación de claves IAM en Terraform, tenemos el estado de Terraform configurado en un lugar seguro y remoto que exige permisos especiales para siquiera poder acceder a él.
Tras introducir el endpoint, cualquier cliente podía hacer llamadas HTTP a nuestra API para aprovisionar credenciales automáticamente. Sin embargo, para ayudar con el caso de uso de Bryan, también le pedimos al mantenedor principal Etienne Carriere que implementara la compatibilidad con este endpoint en el Transloadit Terraform Provider Plugin.
En Terraform, defines localmente en Git la configuración de Transloadit que deseas. La haces evolucionar con tu equipo y puedes revertir cambios, igual que con el código de tu aplicación. Cuando ejecutas Terraform, este te muestra las diferencias entre la configuración real de Transloadit y la deseada, y te propondrá los cambios que hagan falta para que tu configuración real de Transloadit coincida con la deseada.
Esto protege frente a las desviaciones causadas por errores humanos, la pérdida de datos de Transloadit y otros problemas que afectan a las operaciones de TI modernas. No es muy distinto de cuando, en su momento, pasamos colectivamente de gestionar sitios web directamente en el disco del servidor con FTP a usar Git y CI/CD.
Aprovisionamiento en Terraform
Ahora que sabemos por qué podríamos querer usar Terraform con Transloadit, veamos a continuación un ejemplo de cómo implementar algo de infraestructura básica.
provider "aws" {
region = "us-east-1"
}
provider "transloadit" {}
resource "aws_iam_user" "transloadit" {
name = "transloadit"
}
resource "aws_iam_access_key" "transloadit" {
user = aws_iam_user.transloadit.name
}
resource "transloadit_template_credential" "s3_credentials" {
name = "my-terreaform-credentials"
type = "s3"
content = jsonencode({
bucket = "uploads-bucket"
bucket_region = "us-east-1"
key = aws_iam_access_key.transloadit.id
secret = aws_iam_access_key.transloadit.secret
})
}
resource "transloadit_template" "my-terraform-template" {
name = "my-terraform-template"
template =
{
"steps": {
":original": {
"robot": "/upload/handle"
},
"exported": {
"use": [ ":original" ],
"credentials": "${transloadit_template_credential.s3_credentials.name}",
"robot": "/s3/store"
}
}
}
}
En nuestro código de ejemplo definimos dos proveedores: Transloadit y AWS. A partir de ahí, creamos
dos recursos, aws_iam_user y aws_iam_access_key. Estos representan nuestro usuario de IAM de AWS,
desde el que después podemos acceder a nuestra clave y nuestro secreto de S3. La clave se comparte
bajo el recurso transloadit_template_credential, al que luego le pasamos el nombre de nuestras credenciales de Template, el tipo de
credencial (S3 en este caso, aunque se admiten muchos otros
terceros con los que nos integramos),
así como la clave y el secreto reales de las credenciales del usuario de IAM de AWS.
La principal ventaja de usar este patrón es que te permite integrarte con una opción de almacenamiento cifrado, como Hashicorp Vault, lo que da como resultado un almacenamiento seguro de nuestro estado de Terraform, ya que nuestras claves IAM se almacenarían en texto plano de forma predeterminada.
Después de esto, podemos especificar un recurso que defina el Template que queremos ejecutar, y listo.
Puedes leer más sobre los parámetros en la documentación de nuestro plugin de Terraform. Y si buscas parámetros específicos de plataforma para tus credenciales, consulta la documentación de alguno de nuestros muchos Robots de importación y exportación de archivos.
Ahora, solo para confirmar que funciona como esperas esta primera vez, puedes echar un vistazo a tu Transloadit Console, donde deberías ver tus nuevas credenciales de S3, listas para integrarse.

El poder de cambiar Transloadit está en tus manos
Todo esto pasó de ser una humilde solicitud de funcionalidad a formar parte de nuestra API en menos de un mes. Estamos muy orgullosos de seguir teniendo la misma agilidad con la que empezamos hace 17 años. Además, nos entusiasma que esto nos haya permitido mostrar el impacto continuo que tienen nuestros clientes en el futuro de Transloadit. Así que, si hay alguna forma en la que podamos mejorar tu flujo de trabajo actual, esperamos que esto demuestre que no deberías dudar en escribirnos y contárnoslo. Solicitudes de funcionalidad aparentemente sencillas como estas pueden acabar teniendo un efecto duradero en Transloadit.
Si hay algo que quieras comentarnos, deja un issue de GitHub en uno de nuestros SDK o escribe a soporte.
