Expandindo nossa API para um melhor provisionamento com Terraform
Recentemente, um cliente entrou em contato conosco dizendo que queria provisionar a Transloadit com a ferramenta da Hashicorp, o Terraform. Já tínhamos disponível o Plugin Terraform Provider, que usa nossa API para configurar uma conta e Templates. No entanto, como o cliente apontou, faltava um recurso essencial. As Credenciais de Template ainda precisavam ser criadas e gerenciadas pela interface do Console.
Essa era a única forma de fazer isso… até hoje! Adicionamos um novo endpoint que permite gerenciar suas credenciais de terceiros sem precisar acessar nosso site para fazer isso no bom e velho estilo de apontar e clicar.
Se você já quer adiantar a leitura, aqui está a documentação do endpoint da API de Credenciais de Template.

Por que isso é necessário?
O chefe de engenharia da Tastemade, Bryan McLemore, nos chamou a atenção para esse caso de uso, explicando como nossa API, na época, fazia com que mais pessoas do que o necessário tivessem contato com segredos de API.
Restavam a eles duas opções:

Poderíamos abrir mão dos nossos princípios de automação e criar as chaves IAM manualmente, que precisariam ser copiadas à mão para o Transloadit Console. Esse processo, por si só, aumentaria o número de pessoas que precisam ter acesso ao segredo, além de obrigar mais pessoas a vê-lo. Nenhuma das duas coisas é boa.
Como alternativa, injetamos os segredos nos Templates à medida que eles são gerados no Terraform. Isso preserva a automação, mas faz com que qualquer pessoa que consiga ver a definição do Template também consiga ver os segredos, já que eles ficam armazenados em texto simples. Ela teria que se esforçar para vê-los, mas ainda assim seria possível.
Nenhuma dessas opções é ideal. Por isso, decidimos acatar o feedback do Bryan e introduzir o endpoint
de API /template_credentials para evitar essa troca de segredos complicada. Foi assim que ele
imaginou que isso funcionaria:
O padrão geral que sigo é que as chaves IAM (e outros segredos) sejam geradas pelo Terraform e depois armazenadas diretamente onde são necessárias. Por exemplo, nas nossas variáveis de CI e, neste caso, nos nossos novos Templates da Transloadit. Para reduzir os riscos associados à geração de chaves IAM no Terraform, mantemos o estado do Terraform em um local remoto e seguro, que exige permissões especiais para qualquer tipo de acesso.
Com a introdução do endpoint, qualquer cliente passou a poder fazer chamadas HTTP à nossa API para provisionar credenciais automaticamente. Além disso, para atender ao caso de uso do Bryan, pedimos ao mantenedor principal Etienne Carriere que implementasse o suporte a esse endpoint no Plugin Terraform Provider da Transloadit.
No Terraform, você define localmente, no Git, a configuração desejada da Transloadit. Você a evolui com sua equipe e pode reverter alterações, assim como faz com o código do seu app. Ao executar o Terraform, ele mostra as diferenças entre a configuração real e a configuração desejada da Transloadit e propõe as alterações necessárias para que a configuração real da Transloadit corresponda à configuração desejada.
Isso protege contra desvios causados por erros humanos, perda de dados na Transloadit e outros problemas que afligem as operações de TI modernas. É parecido com o que aconteceu, lá atrás, quando todos deixamos de gerenciar sites diretamente no disco do servidor via FTP e passamos a usar Git e CI/CD.
Provisionamento no Terraform
Agora que sabemos por que podemos querer usar o Terraform com a Transloadit, vamos ver abaixo um exemplo de como implementar uma infraestrutura 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"
}
}
}
}
No nosso código de exemplo, definimos dois providers: Transloadit e AWS. A partir disso, criamos dois
recursos, aws_iam_user e aws_iam_access_key. Eles representam nosso
usuário IAM da AWS, a partir do qual podemos acessar a chave e o segredo do S3. A chave é
compartilhada no recurso transloadit_template_credential, ao qual passamos o nome das nossas
Credenciais de Template, o tipo de credencial (S3,
neste caso, mas há suporte a muitos outros
serviços de terceiros com os quais nos integramos), além da chave e
do segredo reais da credencial, vindos do usuário IAM da AWS.
A principal vantagem desse padrão é que ele permite integrar uma opção de armazenamento criptografado, como o Hashicorp Vault, o que resulta no armazenamento seguro do estado do Terraform, já que, por padrão, nossas chaves IAM seriam armazenadas em texto simples.
Depois disso, podemos especificar um recurso para definir o Template que queremos executar, e já estamos prontos para começar.
Você pode ler mais sobre os parâmetros na documentação do nosso plugin do Terraform. E, se estiver procurando parâmetros específicos de cada plataforma para suas credenciais, consulte a documentação de um dos nossos muitos Robots de importação de arquivos e de exportação de arquivos.
Agora, só para confirmar que tudo funciona como esperado nesta primeira vez, você pode abrir o Transloadit Console, onde deverá ver suas novas Credenciais do S3, prontas para a integração.

O poder de mudar a Transloadit está nas suas mãos
Tudo isso passou de uma simples solicitação de recurso a parte da nossa API em menos de um mês. Temos muito orgulho de manter a mesma agilidade com que começamos há 17 anos. Além disso, ficamos felizes por isso ter nos permitido mostrar o impacto contínuo que nossos clientes têm no futuro da Transloadit. Então, se houver alguma forma de melhorarmos seu fluxo de trabalho atual, esperamos que isso mostre que você não deve hesitar em entrar em contato e nos contar. Solicitações de recursos aparentemente simples como esta podem ter um efeito duradouro na Transloadit.
Se houver algo que você queira nos mostrar, abra uma issue no GitHub em um dos nossos SDKs ou entre em contato com o suporte.
