DevOps & CI/CD

Como Usar Gerenciamento de Secrets em Produção: Vault, AWS Secrets Manager e SOPS em Produção

20 min de leitura

Como Usar Gerenciamento de Secrets em Produção: Vault, AWS Secrets Manager e SOPS em Produção

O Problema Real: Por Que Gerenciar Secrets? Quando você trabalha em produção, inevitavelmente precisa lidar com informações sensíveis: chaves de API, senhas de banco de dados, certificados SSL, tokens de autenticação. A tentação inicial é armazenar tudo em variáveis de ambiente ou, pior ainda, commitar no repositório Git. Ambas as abordagens são vulneráveis e violam princípios básicos de segurança. O desafio aumenta conforme sua aplicação cresce: múltiplos ambientes (dev, staging, produção), rotação automática de credenciais, auditoria de acesso, distribuição segura entre servidores. Gerenciar secrets manualmente não escala. É exatamente aqui que entram ferramentas especializadas como Vault, AWS Secrets Manager e SOPS. Cada uma resolve o problema de forma diferente, com trade-offs distintos. Meu objetivo nesta aula é você entender quando usar cada uma. HashiCorp Vault: O Padrão Agnóstico em Nuvem Conceitos Fundamentais O Vault é um software open-source que centraliza o gerenciamento de secrets de forma agnóstica à nuvem. Ele funciona como um "cofre" digital: você o instancia (on-premise ou

<h2>O Problema Real: Por Que Gerenciar Secrets?</h2>

<p>Quando você trabalha em produção, inevitavelmente precisa lidar com informações sensíveis: chaves de API, senhas de banco de dados, certificados SSL, tokens de autenticação. A tentação inicial é armazenar tudo em variáveis de ambiente ou, pior ainda, commitar no repositório Git. Ambas as abordagens são vulneráveis e violam princípios básicos de segurança.</p>

<p>O desafio aumenta conforme sua aplicação cresce: múltiplos ambientes (dev, staging, produção), rotação automática de credenciais, auditoria de acesso, distribuição segura entre servidores. Gerenciar secrets manualmente não escala. É exatamente aqui que entram ferramentas especializadas como Vault, AWS Secrets Manager e SOPS. Cada uma resolve o problema de forma diferente, com trade-offs distintos. Meu objetivo nesta aula é você entender quando usar cada uma.</p>

<h2>HashiCorp Vault: O Padrão Agnóstico em Nuvem</h2>

<h3>Conceitos Fundamentais</h3>

<p>O Vault é um software open-source que centraliza o gerenciamento de secrets de forma agnóstica à nuvem. Ele funciona como um &quot;cofre&quot; digital: você o instancia (on-premise ou em nuvem), e todas as suas aplicações fazem requisições HTTP para recuperar credenciais sob demanda. O Vault autentica a aplicação, verifica permissões, registra o acesso em logs de auditoria, e entrega o secret criptografado.</p>

<p>Um conceito crucial do Vault é a <strong>identidade dinâmica</strong>. Em vez de armazenar uma senha estática, o Vault pode gerar credenciais temporárias para bancos de dados, AWS, etc., com TTL (Time To Live) configurável. Se uma credencial é comprometida, ela expira automaticamente em minutos. Isso reduz drasticamente o dano de uma breach.</p>

<h3>Instalação e Configuração Básica</h3>

<p>Para demonstrar, vou instalar Vault localmente em modo de desenvolvimento (nunca faça isso em produção):</p>

<pre><code class="language-bash"># Download e extração (macOS/Linux)

wget https://releases.hashicorp.com/vault/1.15.0/vault_1.15.0_linux_amd64.zip

unzip vault_1.15.0_linux_amd64.zip

sudo mv vault /usr/local/bin/

Iniciar em modo dev (apenas para aprendizado)

vault server -dev

Em outro terminal, autenticar com o token dev

export VAULT_ADDR=&#039;http://127.0.0.1:8200&#039;

export VAULT_TOKEN=&#039;s.XXXXXXXXXXXXXXXX&#039; # Token exibido no console anterior

Verificar status

vault status</code></pre>

<p>Pronto. Vault está rodando. Agora vamos armazenar um secret:</p>

<pre><code class="language-bash"># Armazenar uma credencial no caminho kv/database

vault kv put kv/database username=admin password=supersecret

Recuperar a credencial

vault kv get kv/database

Output esperado:

====== Secret Path ======

kv/database

#

====== Metadata ======

Key Value

--- -----

created_time 2024-01-15T10:30:00.123456Z

custom_metadata &lt;nil&gt;

deletion_time n/a

destroyed false

version 1

#

====== Data ======

Key Value

--- -----

password supersecret

username admin</code></pre>

<h3>Integração com Aplicação Python</h3>

<p>Agora a parte prática: sua aplicação precisa ler esse secret. Aqui está um exemplo real em Python:</p>

<pre><code class="language-python">import hvac

import os

class VaultClient:

def __init__(self, vault_addr: str, vault_token: str):

self.client = hvac.Client(url=vault_addr, token=vault_token)

def get_database_credentials(self) -&gt; dict:

&quot;&quot;&quot;

Recupera credenciais de banco de dados do Vault.

Lança exceção se o Vault estiver indisponível ou token inválido.

&quot;&quot;&quot;

try:

response = self.client.secrets.kv.read_secret_version(

path=&#039;database&#039;

)

return response[&#039;data&#039;][&#039;data&#039;]

except hvac.exceptions.InvalidPath:

raise Exception(&quot;Secret não encontrado no Vault&quot;)

except hvac.exceptions.Unauthorized:

raise Exception(&quot;Token do Vault expirou ou é inválido&quot;)

def get_dynamic_db_credentials(self, db_role: str, ttl: str = &#039;1h&#039;):

&quot;&quot;&quot;

Gera credenciais dinâmicas (temporárias) para PostgreSQL.

O Vault criará usuário no banco com TTL de 1 hora.

&quot;&quot;&quot;

try:

response = self.client.secrets.database.generate_credentials(

name=db_role

)

creds = response[&#039;data&#039;]

return {

&#039;username&#039;: creds[&#039;username&#039;],

&#039;password&#039;: creds[&#039;password&#039;],

&#039;ttl&#039;: creds[&#039;ttl&#039;] # Quanto tempo até expirar

}

except Exception as e:

raise Exception(f&quot;Erro ao gerar credenciais dinâmicas: {e}&quot;)

Uso na aplicação

if __name__ == &#039;__main__&#039;:

vault = VaultClient(

vault_addr=&#039;http://vault.internal:8200&#039;,

vault_token=os.getenv(&#039;VAULT_TOKEN&#039;)

)

Credenciais estáticas

db_creds = vault.get_database_credentials()

print(f&quot;Conectando ao banco com usuário: {db_creds[&#039;username&#039;]}&quot;)

Credenciais dinâmicas (recomendado para produção)

dynamic_creds = vault.get_dynamic_db_credentials(db_role=&#039;postgres-prod&#039;)

print(f&quot;Credencial temporária válida por: {dynamic_creds[&#039;ttl&#039;]}&quot;)</code></pre>

<p>Para isso funcionar, instale a biblioteca cliente:</p>

<pre><code class="language-bash">pip install hvac</code></pre>

<h3>Quando Usar Vault</h3>

<p>Use Vault quando você precisa de <strong>controle total</strong> sobre secrets, quer implementar <strong>rotação automática</strong>, ou sua infraestrutura é <strong>multi-cloud</strong>. Vault é especialmente poderoso para credenciais dinâmicas em bancos de dados, mas requer que você mantenha uma instância do Vault (ou use Vault Cloud).</p>

<h2>AWS Secrets Manager: Simplicidade Integrada à AWS</h2>

<h3>Conceitos Fundamentais</h3>

<p>Se sua infraestrutura é totalmente AWS, o Secrets Manager oferece uma solução nativa mais simples que Vault. Você armazena secrets no serviço AWS, e suas aplicações (EC2, Lambda, ECS) obtêm acesso via IAM roles, sem precisar gerenciar tokens. O AWS Secrets Manager integra-se profundamente com outros serviços: rotaciona credenciais de RDS automaticamente, gera credenciais temporárias para bancos, e oferece replicação multi-região.</p>

<p>A grande vantagem é a <strong>integração IAM</strong>: você não precisa injetar tokens em containers ou variáveis de ambiente. Uma EC2 instance com a role correta simplesmente faz a chamada à API, e o AWS verifica permissões automaticamente. Isso elimina toda uma classe de vulnerabilidades.</p>

<h3>Criando e Acessando Secrets</h3>

<p>Vamos criar um secret via AWS CLI:</p>

<pre><code class="language-bash"># Criar um secret com dados arbitrários

aws secretsmanager create-secret \

--name prod/database/postgres \

--description &quot;Credenciais do RDS PostgreSQL em produção&quot; \

--secret-string &#039;{&quot;username&quot;:&quot;admin&quot;,&quot;password&quot;:&quot;MySecure#Pass123&quot;,&quot;host&quot;:&quot;prod-db.c1234567890.us-east-1.rds.amazonaws.com&quot;,&quot;port&quot;:5432}&#039;

Output esperado:

{

&quot;ARN&quot;: &quot;arn:aws:secretsmanager:us-east-1:123456789012:secret:prod/database/postgres-AbCdEf&quot;,

&quot;Name&quot;: &quot;prod/database/postgres&quot;,

&quot;VersionId&quot;: &quot;a1b2c3d4-e5f6-47ab-8c9d-0e1f2a3b4c5d&quot;

}

Recuperar o secret

aws secretsmanager get-secret-value \

--secret-id prod/database/postgres \

--query SecretString \

--output text</code></pre>

<h3>Integração com Aplicação Python</h3>

<p>Aqui está como sua aplicação acessa o secret (assumindo que a role IAM tem permissão):</p>

<pre><code class="language-python">import boto3

import json

from typing import Dict

class AWSSecretsClient:

def __init__(self, region: str = &#039;us-east-1&#039;):

self.client = boto3.client(&#039;secretsmanager&#039;, region_name=region)

def get_secret(self, secret_name: str) -&gt; Dict:

&quot;&quot;&quot;

Recupera um secret do AWS Secrets Manager.

A autenticação acontece via IAM role da instância/função.

&quot;&quot;&quot;

try:

response = self.client.get_secret_value(SecretId=secret_name)

Se for string JSON, fazer parse

if &#039;SecretString&#039; in response:

return json.loads(response[&#039;SecretString&#039;])

Se for arquivo binário

else:

return response[&#039;SecretBinary&#039;]

except self.client.exceptions.ResourceNotFoundException:

raise Exception(f&quot;Secret &#039;{secret_name}&#039; não encontrado&quot;)

except self.client.exceptions.InvalidRequestException:

raise Exception(&quot;Requisição inválida ao Secrets Manager&quot;)

def list_secrets(self, filters: Dict = None) -&gt; list:

&quot;&quot;&quot;Lista todos os secrets (com filtros opcionais).&quot;&quot;&quot;

try:

response = self.client.list_secrets(

Filters=filters or []

)

return [s[&#039;Name&#039;] for s in response[&#039;SecretList&#039;]]

except Exception as e:

raise Exception(f&quot;Erro ao listar secrets: {e}&quot;)

Uso na aplicação

if __name__ == &#039;__main__&#039;:

secrets = AWSSecretsClient(region=&#039;us-east-1&#039;)

Recuperar credenciais de banco

db_creds = secrets.get_secret(&#039;prod/database/postgres&#039;)

print(f&quot;Conectando a {db_creds[&#039;host&#039;]} com usuário {db_creds[&#039;username&#039;]}&quot;)

Listar todos os secrets (útil para debug)

all_secrets = secrets.list_secrets()

print(f&quot;Secrets disponíveis: {all_secrets}&quot;)</code></pre>

<p>Para isso funcionar, instale boto3:</p>

<pre><code class="language-bash">pip install boto3</code></pre>

<h3>Configurando Rotação Automática</h3>

<p>Uma feature poderosa do AWS Secrets Manager é a rotação automática de credenciais RDS:</p>

<pre><code class="language-bash"># Criar um secret para RDS com rotação automática

aws secretsmanager create-secret \

--name prod/rds/master \

--description &quot;Master credentials for RDS rotation&quot; \

--secret-string &#039;{&quot;username&quot;:&quot;admin&quot;,&quot;password&quot;:&quot;InitialPass123&quot;}&#039;

Ativar rotação automática a cada 30 dias

aws secretsmanager rotate-secret \

--secret-id prod/rds/master \

--rotation-rules AutomaticallyAfterDays=30 \

--rotation-lambda-arn arn:aws:lambda:us-east-1:123456789012:function:SecretsManagerRotation</code></pre>

<h3>Quando Usar AWS Secrets Manager</h3>

<p>Use quando sua infraestrutura é <strong>majoritariamente AWS</strong> e você quer máxima simplicidade com integração IAM. Perfeito para aplicações serverless (Lambda), RDS, e ECS. Desvantagem: lock-in com AWS e menos flexibilidade que Vault para cenários multi-cloud.</p>

<h2>SOPS: Segredos em Repositório (Com Criptografia)</h2>

<h3>Conceitos Fundamentais</h3>

<p>SOPS (Secrets Operations) inverte a lógica: em vez de centralizar secrets em um serviço, você os armazena <strong>criptografados no repositório Git</strong> da sua aplicação. Quando alguém precisa do valor real, SOPS descriptografa usando chaves KMS (AWS, GCP, Azure) ou GPG. É particularmente útil para Infrastructure as Code (Terraform, Kubernetes) onde você quer versionamento de secrets junto com infraestrutura.</p>

<p>A filosofia do SOPS é: &quot;criptografe apenas os valores sensíveis, deixe o resto do arquivo legível&quot;. Isso facilita code review: você vê qual secret foi modificado sem expor o valor. O trade-off é que você precisa de acesso às chaves de criptografia (IAM para KMS, chave GPG) para descriptografar.</p>

<h3>Instalação e Setup com KMS</h3>

<p>Vou demonstrar SOPS com AWS KMS (mais seguro que GPG em produção):</p>

<pre><code class="language-bash"># Instalar SOPS (macOS com Homebrew)

brew install sops

Ou baixar direto (Linux)

wget https://github.com/mozilla/sops/releases/download/v3.8.1/sops-v3.8.1.linux.amd64

chmod +x sops-v3.8.1.linux.amd64

sudo mv sops-v3.8.1.linux.amd64 /usr/local/bin/sops

Verificar instalação

sops --version</code></pre>

<p>Agora crie uma chave KMS na AWS:</p>

<pre><code class="language-bash"># Criar chave KMS para SOPS

aws kms create-key \

--description &quot;SOPS encryption key for prod secrets&quot; \

--region us-east-1

Output:

{

&quot;KeyMetadata&quot;: {

&quot;KeyId&quot;: &quot;12345678-1234-1234-1234-123456789012&quot;,

&quot;Arn&quot;: &quot;arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012&quot;

}

}

Criar um alias para facilitar referência

aws kms create-alias \

--alias-name alias/sops-prod \

--target-key-id 12345678-1234-1234-1234-123456789012</code></pre>

<h3>Criando e Descriptografando Secrets</h3>

<p>Crie um arquivo com seus secrets:</p>

<pre><code class="language-yaml"># secrets.yaml (conteúdo original em texto plano)

database:

host: prod-db.c1234567890.us-east-1.rds.amazonaws.com

username: admin

password: MySecure#Pass123

port: 5432

api:

key: sk-1234567890abcdefghijklmnopqrstuvwxyz

secret: super_secret_value_12345</code></pre>

<p>Agora criptografe com SOPS:</p>

<pre><code class="language-bash"># Criptografar usando KMS

sops --encrypt \

--kms arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 \

secrets.yaml &gt; secrets.enc.yaml

Visualizar arquivo criptografado

cat secrets.enc.yaml

Output (dados sensíveis criptografados, mas metadata legível):

database:

host: prod-db.c1234567890.us-east-1.rds.amazonaws.com

password: ENC[AES256_GCM,data:abcdef123456...,iv:xyz...,tag:...,type:str]

port: 5432

username: ENC[AES256_GCM,data:1234567890...,iv:abc...,tag:...,type:str]

sops:

kms:

- arn: arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012

created_at: &#039;2024-01-15T10:30:00Z&#039;

enc: AQIDAHg...

aws_profile: &#039;&#039;

lastmodified: &#039;2024-01-15T10:30:05Z&#039;

mac: ENC[AES256_GCM,data:5678...,iv:def...,tag:...,type:str]

version: 3.8.1

Descriptografar para usar

sops --decrypt secrets.enc.yaml

Editar arquivo criptografado (SOPS descriptografa temporariamente)

sops secrets.enc.yaml

Seu editor padrão abre com valores descriptografados

Ao salvar e fechar, SOPS re-criptografa automaticamente</code></pre>

<h3>Integração em Pipeline CI/CD</h3>

<p>Na prática, você versionaria <code>secrets.enc.yaml</code> no Git, mas nunca <code>secrets.yaml</code>:</p>

<pre><code class="language-yaml"># .gitignore

secrets.yaml # Nunca commitar valores em texto plano

*.decrypted.yaml

secrets.enc.yaml é commitado normalmente (está criptografado)</code></pre>

<p>Em um pipeline Kubernetes com ArgoCD, você decodifica secrets assim:</p>

<pre><code class="language-bash">#!/bin/bash

deploy.sh - script executado no CI/CD com credenciais KMS

Descriptografar secrets e aplicar ao cluster

sops --decrypt secrets.enc.yaml | kubectl apply -f -

Ou usar o plugin Kustomize do SOPS

kustomize build . | sops --encrypt /dev/stdin &gt; kustomization.enc.yaml</code></pre>

<h3>Programaticamente com Python</h3>

<p>Para aplicações que precisam ler secrets criptografados em tempo de execução:</p>

<pre><code class="language-python">import subprocess

import json

import yaml

class SOPSClient:

def __init__(self, encrypted_file_path: str):

self.file_path = encrypted_file_path

def get_decrypted_config(self) -&gt; dict:

&quot;&quot;&quot;

Executa sops para descriptografar e retorna o config como dict.

Requer que as credenciais KMS estejam disponíveis (AWS_PROFILE, IAM role, etc)

&quot;&quot;&quot;

try:

result = subprocess.run(

[&#039;sops&#039;, &#039;--decrypt&#039;, self.file_path],

capture_output=True,

text=True,

check=True

)

Parseando YAML descriptografado

config = yaml.safe_load(result.stdout)

return config

except subprocess.CalledProcessError as e:

raise Exception(f&quot;Erro ao descriptografar com SOPS: {e.stderr}&quot;)

except FileNotFoundError:

raise Exception(&quot;SOPS não encontrado no PATH&quot;)

Uso

if __name__ == &#039;__main__&#039;:

sops = SOPSClient(&#039;/app/config/secrets.enc.yaml&#039;)

config = sops.get_decrypted_config()

db_password = config[&#039;database&#039;][&#039;password&#039;]

api_key = config[&#039;api&#039;][&#039;key&#039;]

print(f&quot;Conectando com senha: {db_password[:10]}...&quot;)</code></pre>

<h3>Quando Usar SOPS</h3>

<p>Use SOPS quando seus secrets fazem parte da <strong>Infrastructure as Code</strong> (Terraform, Kubernetes manifests) e você quer <strong>versionamento completo</strong> no Git. Excelente para DevOps e GitOps workflows. Desvantagem: não há rotação automática de credenciais, e requer acesso às chaves KMS em tempo de deploy.</p>

<h2>Comparação Prática: Qual Ferramenta Escolher?</h2>

<div class="table-wrap"><table><thead><tr><th>Aspecto</th><th>Vault</th><th>AWS Secrets Manager</th><th>SOPS</th></tr></thead><tbody><tr><td><strong>Rotação Automática</strong></td><td>Sim (dinâmica para DB)</td><td>Sim (para RDS)</td><td>Não</td></tr><tr><td><strong>Multi-Cloud</strong></td><td>Sim</td><td>Apenas AWS</td><td>Suporta KMS/GCP/Azure</td></tr><tr><td><strong>Integração IAM</strong></td><td>Não</td><td>Sim (nativa)</td><td>Sim (via KMS)</td></tr><tr><td><strong>Versionamento Git</strong></td><td>Não</td><td>Não</td><td>Sim</td></tr><tr><td><strong>Complexidade Setup</strong></td><td>Alta</td><td>Baixa</td><td>Média</td></tr><tr><td><strong>Melhor Para</strong></td><td>Multi-cloud, credenciais dinâmicas</td><td>Apps AWS puro</td><td>IaC + versionamento</td></tr><tr><td><strong>Custo</strong></td><td>Self-hosted ou Vault Cloud</td><td>~$0.40 por 10k requisições</td><td>Custo KMS apenas</td></tr></tbody></table></div>

<p><strong>Cenários recomendados:</strong></p>

<ul>

<li><strong>Startup com tudo em AWS + Lambda/RDS</strong>: AWS Secrets Manager</li>

<li><strong>Empresa multi-cloud (AWS + GCP + On-premise)</strong>: Vault</li>

<li><strong>Time DevOps com Kubernetes + GitOps</strong>: SOPS</li>

<li><strong>Aplicação legada com múltiplos ambientes</strong>: Vault</li>

<li><strong>Segurança máxima com rotação DB</strong>: Vault + SOPS em conjunto</li>

</ul>

<h2>Boas Práticas Universais</h2>

<p>Independente da ferramenta escolhida, algumas práticas nunca devem ser quebradas:</p>

<p><strong>1. Princípio do Menor Privilégio</strong>: Uma aplicação nunca deve ter acesso a todos os secrets. Use roles, policies, ou RBAC para limitar. Uma Lambda que só precisa de credenciais de S3 não deve ter acesso a senhas de RDS.</p>

<p><strong>2. Auditoria Completa</strong>: Log todo acesso (quem, quando, qual secret). Isso é crítico para investigações de segurança pós-breach.</p>

<p><strong>3. Rotação Regular</strong>: Mesmo com credenciais estáticas, altere-as a cada 90 dias no mínimo. Com credenciais dinâmicas (Vault), faça TTL curto (1-24 horas).</p>

<p><strong>4. Nenhum Secret em Logs</strong>: Nunca print ou log um valor de secret. Isso inclui exceções e stack traces. Use mascaramento.</p>

<pre><code class="language-python"></code></pre>

<p><strong>5. Secrets em Variáveis de Ambiente com Cuidado</strong>: Se você usa env vars, elas passam por processos filhos e podem vazar em logs de sistema. Prefira ler diretamente do serviço de secrets.</p>

<h2>Conclusão</h2>

<p>Gerenciar secrets em produção é uma tarefa que não tolera atalhos. As três ferramentas apresentadas —Vault, AWS Secrets Manager e SOPS— resolvem o mesmo problema com filosofias distintas. Vault oferece máxima flexibilidade e credenciais dinâmicas, ideal para arquiteturas complexas. AWS Secrets Manager é a escolha pragmática para quem já está no ecossistema AWS. SOPS é o campeão do versionamento e GitOps, permitindo secrets criptografados no repositório. O grande aprendizado é que não existe ferramenta única: você deve escolher baseado em sua arquitetura, constraints de operação e necessidades de compliance. Na minha experiência, o mais comum em startups é começar simples (Secrets Manager ou variáveis de ambiente), e escalar para Vault conforme a complexidade cresce.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://www.vaultproject.io/docs" target="_blank" rel="noopener noreferrer">HashiCorp Vault Official Documentation</a></li>

<li><a href="https://docs.aws.amazon.com/secretsmanager/" target="_blank" rel="noopener noreferrer">AWS Secrets Manager User Guide</a></li>

<li><a href="https://github.com/mozilla/sops" target="_blank" rel="noopener noreferrer">Mozilla SOPS GitHub Repository</a></li>

<li><a href="https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html" target="_blank" rel="noopener noreferrer">OWASP: Secrets Management Cheat Sheet</a></li>

<li><a href="https://12factor.net/config" target="_blank" rel="noopener noreferrer">12 Factor App: Store config in environment</a></li>

</ul>

<p>&lt;!-- FIM --&gt;</p>

Comentários

Mais em DevOps & CI/CD

Container Registry: Docker Hub, GHCR e Registry Privado com Harbor: Do Básico ao Avançado
Container Registry: Docker Hub, GHCR e Registry Privado com Harbor: Do Básico ao Avançado

O que é um Container Registry Um Container Registry é um repositório centrali...

Guia Completo de SRE na Prática: SLIs, SLOs, SLAs e Error Budgets
Guia Completo de SRE na Prática: SLIs, SLOs, SLAs e Error Budgets

SRE: O Fundamento para Confiabilidade em Produção Site Reliability Engineerin...

O que Todo Dev Deve Saber sobre Dockerfile Avançado: Multi-stage Builds, Distroless e Boas Práticas
O que Todo Dev Deve Saber sobre Dockerfile Avançado: Multi-stage Builds, Distroless e Boas Práticas

Entendendo Docker Multi-stage Builds Um dos maiores desafios ao containerizar...