<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Carlos Nogueira</title>
    <description>The latest articles on DEV Community by Carlos Nogueira (@cedon).</description>
    <link>https://dev.to/cedon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F226109%2F4c181e01-9de0-47e0-8185-256a92b7f779.webp</url>
      <title>DEV Community: Carlos Nogueira</title>
      <link>https://dev.to/cedon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cedon"/>
    <language>en</language>
    <item>
      <title>[EN] Best Practices for Managing Secrets in Kubernetes</title>
      <dc:creator>Carlos Nogueira</dc:creator>
      <pubDate>Sat, 25 Apr 2026 12:09:29 +0000</pubDate>
      <link>https://dev.to/cedon/en-best-practices-for-managing-secrets-in-kubernetes-4g18</link>
      <guid>https://dev.to/cedon/en-best-practices-for-managing-secrets-in-kubernetes-4g18</guid>
      <description>&lt;p&gt;Managing secrets in Kubernetes requires careful attention. The default implementation has significant security limitations. Encoding secrets in base64 offers no real protection, it’s a strategy that exposes sensitive data to serious risks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Essential Practices for Cluster Administrators
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Encrypt Secrets at Rest&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is critical to encrypt secret data stored in etcd, Kubernetes’ internal database.&lt;/p&gt;

&lt;p&gt;· Immediate action: Configure an encryption provider on the Kubernetes API server. You can do this using an encryption configuration file. For managed clusters (EKS, AKS, GKE), simply enable the managed encryption option.&lt;br&gt;
· Advanced approach (KMS): For stronger security and control, use a Key Management Service provider (AWS KMS, Google Cloud KMS, Azure Key Vault). This enables envelope encryption, where keys are managed externally, reducing the risk of direct etcd access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Control Access with Least Privilege (RBAC)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;RBAC is the primary tool for controlling who or what can access secrets.&lt;/p&gt;

&lt;p&gt;· Avoid unnecessary privileges: Never grant list, watch, or get permissions on secrets to users or service accounts that don’t explicitly need them. Remember that list permission can be used to view secret content.&lt;br&gt;
· Use namespaces for isolation: Isolate secrets by namespace and use RoleBindings instead of ClusterRoleBindings to restrict access scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Protect etcd and Cluster Components&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Beyond encryption, other measures help secure etcd, the cluster’s core datastore.&lt;/p&gt;

&lt;p&gt;· Secure communication: Configure TLS between etcd nodes to protect data in transit.&lt;br&gt;
· Sanitize storage: When decommissioning etcd persistent storage, use secure wiping methods (wipe or shred) to prevent data recovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Monitor and Audit Access&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Auditing can help to detecting unauthorized access.&lt;/p&gt;

&lt;p&gt;· Configure audit logs in Kubernetes to generate alerts for suspicious events: example, a single user reading many secrets in a short time.&lt;br&gt;
· Integrate with a SIEM (Security Information and Event Management) tool for deeper analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Essential Practices for Developers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Never Hardcode or Share Manifests with Secrets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Avoid storing literal values in code or sharing YAML manifests with plain‑text secrets, even in private repositories. The risk of exposure is too high.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Adopt Advanced Secret Management Tools&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of relying solely on native Secret resources, use tools that raise the security bar:&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;External Secrets Operator&lt;/strong&gt; (ESO): Synchronizes secrets from an external vault to Kubernetes. The cluster becomes a consumer, not the primary source of sensitive data.&lt;br&gt;
· &lt;strong&gt;Secrets Store CSI Driver&lt;/strong&gt;: Mounts secrets as a volume directly into a pod, avoiding storage in etcd or the Kubernetes API. The application reads the secret from the filesystem.&lt;br&gt;
· &lt;strong&gt;OpenBao&lt;/strong&gt;: A HashiCorp Vault FLOSS fork maintained by Linux Foundation that is a complete solution for high‑compliance environments, managing the full lifecycle of secrets with advanced access and auditing features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Adopt Secure GitOps&lt;/strong&gt;&lt;br&gt;
If you store manifests in Git (standard GitOps practice), never commit secrets in plain text. Use encryption tools:&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;Sealed Secrets&lt;/strong&gt; : Encrypts the secret inside the Git repository. Only the controller in the cluster can decrypt it.&lt;br&gt;
· &lt;strong&gt;Mozilla SOPS&lt;/strong&gt; (Secrets OPerationS): Encrypts secret files, which can be versioned in Git, using keys from services such as AWS KMS, GCP KMS, Azure Key Vault, or PGP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Automate Secret Rotation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;Automate with cloud provider&lt;/strong&gt; : Use automated rotation from your cloud secrets manager (AWS Secrets Manager) combined with ESO. When a secret changes, ESO updates it in the cluster, and the pod can be configured to refresh the environment variable without restarting.&lt;br&gt;
· &lt;strong&gt;Handle application restarts&lt;/strong&gt; : For changes that require pod restarts, use tools like rolloutRestartTargets (from the Vault Secrets Operator) to orchestrate the process automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Myths vs. Reality
&lt;/h2&gt;

&lt;p&gt;It is important to distinguish between encoding and encryption.&lt;/p&gt;

&lt;p&gt;Myth - What Kubernetes does not do by default&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;"&lt;strong&gt;A Secret in Kubernetes is encrypted by default.&lt;/strong&gt;"&lt;br&gt;&lt;br&gt;
Reality: No. A Secret is simply a base64‑encoded string, which offers zero security. Anyone with access to the cluster can decode it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"&lt;strong&gt;If my RBAC is configured, my data is safe.&lt;/strong&gt;"&lt;br&gt;&lt;br&gt;
Reality: RBAC alone is not enough. Direct access to etcd (or its backups) or to the Kubernetes API (kubectl get secret) exposes all data in plain text, regardless of RBAC.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Summary and Recommendations
&lt;/h2&gt;

&lt;p&gt;Build a robust secret management strategy by starting with the fundamentals and increasing complexity as needed.&lt;/p&gt;

&lt;p&gt;Step 1 - &lt;strong&gt;Foundation&lt;/strong&gt; (for everyone)&lt;/p&gt;

&lt;p&gt;· Enable encryption at rest for etcd on your managed cluster.&lt;br&gt;
· Implement RBAC with least privilege.&lt;br&gt;
· Educate your team to never store secrets as plain text in Git.&lt;/p&gt;

&lt;p&gt;Step 2 - &lt;strong&gt;Evolution&lt;/strong&gt; (for most teams)&lt;/p&gt;

&lt;p&gt;· Adopt an external secret manager. Start with the External Secrets Operator (ESO), which is simpler and offers an excellent balance between security and usability.&lt;/p&gt;

&lt;p&gt;Step 3 - &lt;strong&gt;Advanced&lt;/strong&gt; (for high compliance)&lt;/p&gt;

&lt;p&gt;· If you operate under strict compliance regimes (SOC2, HIPAA) or in multi‑cloud environments, invest in OpenBao.&lt;br&gt;
· For teams deeply invested in GitOps, use Sealed Secrets or SOPS to encrypt manifests before versioning.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/concepts/security/secrets-good-practices/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/concepts/security/secrets-good-practices/&lt;/a&gt;
-&lt;a href="https://kubernetes.io/docs/concepts/security/rbac-good-practices/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/concepts/security/rbac-good-practices/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://external-secrets.io/" rel="noopener noreferrer"&gt;https://external-secrets.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://secrets-store-csi-driver.sigs.k8s.io/" rel="noopener noreferrer"&gt;https://secrets-store-csi-driver.sigs.k8s.io/&lt;/a&gt;
-&lt;a href="https://developer.hashicorp.com/vault/docs/secrets/kubernetes" rel="noopener noreferrer"&gt;https://developer.hashicorp.com/vault/docs/secrets/kubernetes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bitnami-labs/sealed-secrets" rel="noopener noreferrer"&gt;https://github.com/bitnami-labs/sealed-secrets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mozilla/sops" rel="noopener noreferrer"&gt;https://github.com/mozilla/sops&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openbao.org/" rel="noopener noreferrer"&gt;https://openbao.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloud</category>
      <category>devops</category>
      <category>kubernetes</category>
      <category>security</category>
    </item>
    <item>
      <title>[PT-BR] Guia de Módulo OpenTofu AWS EC2: Requisitos, Testes e Estratégia BDD</title>
      <dc:creator>Carlos Nogueira</dc:creator>
      <pubDate>Fri, 24 Apr 2026 15:04:52 +0000</pubDate>
      <link>https://dev.to/cedon/pt-br-modulo-opentofu-aws-ec2-requisitos-testes-e-estrategia-bdd-55o1</link>
      <guid>https://dev.to/cedon/pt-br-modulo-opentofu-aws-ec2-requisitos-testes-e-estrategia-bdd-55o1</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;A criação de módulos reutilizáveis para provisionamento de instâncias EC2 na AWS é uma prática essencial para equipes que buscam infraestrutura como código (IaC) consistente, segura e escalável. Um módulo bem‑escrito vai além da definição de recursos, exige planejamento de requisitos, suíte de testes automatizados e  abordagem orientada ao comportamento (BDD) para garantir que atenda às necessidades de negócio e operacionais. Este guia substitui o uso do Terraform pelo OpenTofu, uma ferramenta que surgiu como um fork da última versão de código aberto do Terraform (1.5.7) e é mantida sob governança neutra da Linux Foundation, oferecendo alternativa totalmente open‑source sob a licença MPL.&lt;/p&gt;

&lt;p&gt;Todo o conteúdo apresentado a seguir é totalmente compatível com o OpenTofu: o provedor AWS utilizado é exatamente o mesmo, a sintaxe HCL é idêntica, e o fluxo de trabalho permanece praticamente inalterado. Portanto, você pode aplicar este guia diretamente em seus projetos com OpenTofu sem qualquer modificação adicional.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Requisitos para Gerar um Módulo OpenTofu de EC2
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.1 Pré‑requisitos&lt;/strong&gt; &lt;strong&gt;de Infraestrutura&lt;/strong&gt; &lt;strong&gt;e CLI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;· OpenTofu CLI instalado (versão 1.6.0 ou superior).&lt;br&gt;
· AWS CLI configurada com credenciais que tenham permissões para criar EC2, VPC, sub‑redes e grupos de segurança.&lt;br&gt;
· Um par de chaves SSH (key pair) existente na AWS, utilizado para acesso à instância.&lt;br&gt;
· Uma VPC e pelo menos uma sub‑rede (subnet) onde a instância será lançada. O ID da sub‑rede é um parâmetro obrigatório para o módulo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.2 Estrutura Essencial do Módulo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Um módulo deve seguir uma estrutura padrão, composta por três arquivos principais dentro de um diretório (ex.: modules/ec2/):&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;main.tofu&lt;/strong&gt;: contém o recurso aws_instance e demais recursos associados.&lt;br&gt;
· &lt;strong&gt;variables.tofu&lt;/strong&gt;: declara todas as variáveis de entrada.&lt;br&gt;
· &lt;strong&gt;outputs.tofu&lt;/strong&gt;: expõe informações úteis como ID da instância e IP público.&lt;/p&gt;

&lt;p&gt;Alternativamente, você pode manter a extensão .tf – o OpenTofu lê ambos os formatos perfeitamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.3 Componentes Obrigatórios no main.tofu&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"this"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;                    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ami_id&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance_type&lt;/span&gt;
  &lt;span class="nx"&gt;subnet_id&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subnet_id&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_security_group_ids&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;security_group_ids&lt;/span&gt;
  &lt;span class="nx"&gt;key_name&lt;/span&gt;               &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;key_name&lt;/span&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt;                   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Argumentos adicionais, como user_data, root_block_device e ebs_block_device, podem ser incluídos conforme a necessidade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.4 Boas Práticas de Segurança e Organização&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;· Não inserir credenciais diretamente no módulo; utilizar variáveis de ambiente ou backend remoto.&lt;br&gt;
· Validar variáveis com blocos validation (ex.: restringir instance_type a uma lista permitida).&lt;br&gt;
· Documentar todas as variáveis e outputs no arquivo README.md.&lt;br&gt;
· Utilizar namespaces consistentes nas tags (ex.: Environment, Application).&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Plano de Testes para o Módulo EC2
&lt;/h2&gt;

&lt;p&gt;Um módulo só é confiável se for testado adequadamente. O plano a seguir cobre desde verificações estáticas até testes de integração e testes nativos do OpenTofu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.1 Tipos de Teste e Ferramentas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tipo de Teste&lt;/strong&gt; | &lt;strong&gt;Objetivo&lt;/strong&gt; | &lt;strong&gt;Ferramentas&lt;/strong&gt;&lt;br&gt;
Análise estática | Validar sintaxe, formatação e boas práticas | &lt;em&gt;tofu fmt, tofu validate, tflint&lt;/em&gt; (com wrapper)&lt;/p&gt;

&lt;p&gt;Análise de segurança | Identificar configurações inseguras (portas abertas, falta de criptografia) | &lt;em&gt;checkov, tfsec, tofu_checkov&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Teste de unidade (mock) | Executar o módulo em ambiente simulado | &lt;em&gt;tofu test&lt;/em&gt; com simulação de provedores&lt;/p&gt;

&lt;p&gt;Teste de integração nativo | Provisionar recursos reais e realizar asserções diretamente em HCL | &lt;em&gt;tofu test&lt;/em&gt; (comandos nativos)&lt;/p&gt;

&lt;p&gt;Teste de integração avançado | Testes mais complexos com orquestração em Go | &lt;em&gt;Terratest&lt;/em&gt; (compatível com OpenTofu)&lt;/p&gt;

&lt;p&gt;Teste de regressão | Verificar se mudanças não quebram versões anteriores | &lt;em&gt;tofu test + versionamento do módulo&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.2 Fase 1: Testes Estáticos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Execute os comandos na raiz do módulo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tofu &lt;span class="nb"&gt;fmt&lt;/span&gt; &lt;span class="nt"&gt;-recursive&lt;/span&gt; &lt;span class="nt"&gt;-check&lt;/span&gt;
tofu init &lt;span class="nt"&gt;-backend&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false
&lt;/span&gt;tofu validate
tflint &lt;span class="nt"&gt;--init&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; tflint
checkov &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Critério de sucesso: nenhum erro ou warning crítico. O tflint pode ser utilizado com o wrapper para OpenTofu, e ferramentas como tofu_checkov estão disponíveis para substituir o checkov legado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.3 Fase 2: Testes de Segurança (checkov/tfsec)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Verificações obrigatórias:&lt;/p&gt;

&lt;p&gt;· A instância não deve estar em sub‑rede pública sem restrições.&lt;br&gt;
· O grupo de segurança não deve permitir &lt;em&gt;0.0.0.0/0&lt;/em&gt; para SSH (porta 22) em produção.&lt;br&gt;
· Volumes EBS devem ter encrypted = true.&lt;br&gt;
· O módulo não deve expor variáveis sensíveis nos outputs.&lt;/p&gt;

&lt;p&gt;O OpenTofu é suportado nativamente por essas ferramentas de análise estática.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.4 Fase 3: Testes Nativos com tofu test&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A partir da versão 1.6, o OpenTofu inclui o comando tofu test, que permite escrever testes de integração diretamente em HCL. O comando cria infraestrutura real (em uma conta AWS de teste), executa asserções e, ao final, destrói os recursos criados automaticamente.&lt;/p&gt;

&lt;p&gt;Exemplo de arquivo de teste (&lt;em&gt;tests/ec2.tofutest.hcl&lt;/em&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# tests/ec2.tofutest.hcl&lt;/span&gt;
&lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="s2"&gt;"basic_ec2_creation"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt;

  &lt;span class="nx"&gt;variables&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;instance_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"test-instance"&lt;/span&gt;
    &lt;span class="nx"&gt;ami_id&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ami-0c02fb55956c7d316"&lt;/span&gt;
    &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.micro"&lt;/span&gt;
    &lt;span class="nx"&gt;subnet_id&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"subnet-12345678"&lt;/span&gt;
    &lt;span class="nx"&gt;key_name&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"my-key"&lt;/span&gt;
    &lt;span class="nx"&gt;security_group_ids&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"sg-12345678"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;condition&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"t3.micro"&lt;/span&gt;
    &lt;span class="nx"&gt;error_message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Instance type não corresponde ao esperado"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;condition&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Name"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"test-instance"&lt;/span&gt;
    &lt;span class="nx"&gt;error_message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Tag Name não foi aplicada corretamente"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;modules/ec2
tofu init
tofu &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-test-directory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O OpenTofu executará o teste, criando recursos reais e destruindo‑os ao final. A partir da versão 1.8, o tofu test também suporta a simulação de provedores completos, o que facilita testes de unidade sem depender de recursos externos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.5 Fase 4: Testes de Integração Avançados com Terratest&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para cenários que exigem mais controle ou múltiplas etapas, o Terratest (framework em Go) pode ser utilizado. Como o OpenTofu é um substituto direto (“drop‑in replacement”) do Terraform, nenhuma alteração no código dos testes é necessária – basta garantir que o binário tofu esteja disponível no ambiente.&lt;/p&gt;

&lt;p&gt;Exemplo simplificado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"testing"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/gruntwork-io/terratest/modules/terraform"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/gruntwork-io/terratest/modules/aws"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/stretchr/testify/assert"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestEC2Module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parallel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;terraformOptions&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;terraform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Options&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;TerraformDir&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"../fixtures"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Vars&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{}{&lt;/span&gt;
            &lt;span class="s"&gt;"instance_name"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"integration-test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"ami_id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;        &lt;span class="s"&gt;"ami-0c02fb55956c7d316"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"instance_type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"t3.micro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"subnet_id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;     &lt;span class="s"&gt;"subnet-12345678"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"key_name"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="s"&gt;"my-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"security_group_ids"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"sg-12345678"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;terraform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Destroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terraformOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;terraform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InitAndApply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terraformOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;instanceID&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;terraform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;terraformOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"instance_id"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetEc2InstanceById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instanceID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"us-east-1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"running"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cenários a serem cobertos:&lt;/p&gt;

&lt;p&gt;· Criação básica (valores mínimos).&lt;br&gt;
· Com user_data para executar script de bootstrap.&lt;br&gt;
· Com volume EBS adicional.&lt;br&gt;
· Com tipo de instância inválido (deve falhar).&lt;br&gt;
· Destruição limpa (verificar ausência de recursos órfãos).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.6 Critérios de Aceitação do Plano de Testes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;· tofu validate: sem erros.&lt;br&gt;
· tofu fmt: 0 diferenças.&lt;br&gt;
· tflint (com wrapper): sem warnings de nível ERROR.&lt;br&gt;
· checkov/tofu_checkov: todos os checks de severidade HIGH aprovados.&lt;br&gt;
· tofu test: todos os cenários de teste nativos aprovados.&lt;br&gt;
· Teste de criação básica (via Terratest): sucesso.&lt;br&gt;
· Teste de conectividade SSH: sucesso.&lt;br&gt;
· Teste de destruição: nenhum recurso remanescente.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Estratégia BDD (Behavior-Driven Development) para o Módulo EC2
&lt;/h2&gt;

&lt;p&gt;O BDD permite descrever o comportamento esperado em linguagem natural, garantindo que o módulo atenda aos requisitos de negócio e operacionais. A ferramenta terraform‑compliance (que é compatível com OpenTofu) permite escrever cenários em Gherkin e validá‑los contra o plano gerado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.1 Ferramentas Recomendadas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;· terraform-compliance: executa cenários escritos em Gherkin contra o plano do OpenTofu.&lt;br&gt;
· tofu test com blocos run e assert (pode ser usado para validar comportamentos específicos).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.2 Estrutura de Diretórios para BDD&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modules/ec2/tests/bdd/
├── features/
│   ├── creation.feature
│   ├── security.feature
│   ├── connectivity.feature
│   └── destruction.feature
└── steps/
    └── steps.py (opcional, para customizações)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3.3 Exemplos de Cenários Gherkin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Criação básica (creation.feature):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; EC2 Instance Creation

  &lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Successfully create an EC2 instance with minimal required parameters
    &lt;span class="err"&gt;Given I have a OpenTofu module "ec2" with configuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="s"&gt;"""
      module "ec2" {
        source      = "../.."
        instance_name = "bdd-test-instance"
        ami_id        = "ami-0c02fb55956c7d316"
        instance_type = "t3.micro"
        subnet_id     = "subnet-12345678"
        key_name      = "my-key"
        security_group_ids = ["sg-12345678"]
      }
      """&lt;/span&gt;
    &lt;span class="nf"&gt;When &lt;/span&gt;I apply the OpenTofu configuration
    &lt;span class="nf"&gt;Then &lt;/span&gt;the EC2 instance should exist
    &lt;span class="nf"&gt;And &lt;/span&gt;its state should be &lt;span class="s"&gt;"running"&lt;/span&gt;
    &lt;span class="nf"&gt;And &lt;/span&gt;it should have tag &lt;span class="s"&gt;"Name"&lt;/span&gt; with value &lt;span class="s"&gt;"bdd-test-instance"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Segurança (security.feature):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Security Configuration

  &lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; SSH access should be limited to authorized IPs
    &lt;span class="nf"&gt;Given &lt;/span&gt;I have an EC2 instance created with security group &lt;span class="s"&gt;"allow-ssh-from-office"&lt;/span&gt;
    &lt;span class="nf"&gt;When &lt;/span&gt;I inspect the security group rules
    &lt;span class="nf"&gt;Then &lt;/span&gt;inbound rule for port 22 should exist
    &lt;span class="nf"&gt;And &lt;/span&gt;the CIDR block should be &lt;span class="s"&gt;"203.0.113.0/24"&lt;/span&gt;
    &lt;span class="nf"&gt;And &lt;/span&gt;no inbound rule should allow 0.0.0.0/0 for port 22

  &lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; EBS volumes must be encrypted
    &lt;span class="nf"&gt;Given &lt;/span&gt;I have an EC2 instance with root block device
    &lt;span class="nf"&gt;Then &lt;/span&gt;the &lt;span class="s"&gt;"encrypted"&lt;/span&gt; attribute of the root volume must be true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conectividade (connectivity.feature):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Connectivity and User Data

  &lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Instance should be reachable via SSH
    &lt;span class="nf"&gt;Given &lt;/span&gt;I have a running EC2 instance with public IP address
    &lt;span class="nf"&gt;And &lt;/span&gt;I have the private key file &lt;span class="s"&gt;"my-key.pem"&lt;/span&gt;
    &lt;span class="nf"&gt;When &lt;/span&gt;I try to SSH into the instance as user &lt;span class="s"&gt;"ec2-user"&lt;/span&gt;
    &lt;span class="nf"&gt;Then &lt;/span&gt;the connection should succeed within 60 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Destruição (destruction.feature):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Resource Cleanup

  &lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; All resources are destroyed after deletion
    &lt;span class="nf"&gt;Given &lt;/span&gt;I have applied the EC2 module
    &lt;span class="nf"&gt;When &lt;/span&gt;I run `tofu destroy`
    &lt;span class="nf"&gt;Then &lt;/span&gt;the EC2 instance should no longer exist
    &lt;span class="nf"&gt;And &lt;/span&gt;any associated EBS volumes should be deleted
    &lt;span class="nf"&gt;And &lt;/span&gt;the OpenTofu state should be empty
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3.4 Execução com terraform-compliance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instalação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;terraform-compliance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execução:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;modules/ec2/tests/bdd
tofu init
tofu plan &lt;span class="nt"&gt;-out&lt;/span&gt; plan.out
terraform-compliance &lt;span class="nt"&gt;-f&lt;/span&gt; ../features &lt;span class="nt"&gt;-p&lt;/span&gt; plan.out
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Integração contínua (GitHub Actions):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run BDD scenarios&lt;/span&gt;
  &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.AWS_ACCESS_KEY_ID }}&lt;/span&gt;
    &lt;span class="na"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.AWS_SECRET_ACCESS_KEY }}&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;cd modules/ec2/tests/bdd&lt;/span&gt;
    &lt;span class="s"&gt;tofu init&lt;/span&gt;
    &lt;span class="s"&gt;tofu plan -out plan.out&lt;/span&gt;
    &lt;span class="s"&gt;terraform-compliance -f ../features -p plan.out&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3.5 Matriz de Cenários Obrigatórios&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature&lt;/strong&gt; | &lt;strong&gt;Cenário&lt;/strong&gt; | &lt;strong&gt;Prioridade&lt;/strong&gt;&lt;br&gt;
Creation | Criar com valores mínimos | Must-have&lt;/p&gt;

&lt;p&gt;Security | SSH restrito por IP | Must-have&lt;/p&gt;

&lt;p&gt;Security | EBS criptografado | Must-have&lt;/p&gt;

&lt;p&gt;Security | Sem portas administrativas para &lt;em&gt;0.0.0.0/0&lt;/em&gt; | Must-have&lt;/p&gt;

&lt;p&gt;Connectivity | SSH reachable | Should-have&lt;/p&gt;

&lt;p&gt;Destruction | Destruição remove todos os recursos | Must-have&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.6 Critérios de Aceitação BDD&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;· 100% dos cenários classificados como “Must‑have” devem ser aprovados.&lt;br&gt;
· Nenhum cenário pode falhar devido a dependências externas (sub‑redes inexistentes, etc.). Utilize variáveis consistentes ou mocks (via tofu test).&lt;br&gt;
· Os arquivos .feature devem ser revisados pelas equipes de operações e segurança.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Desenvolver um módulo OpenTofu para EC2 vai muito além de escrever um recurso aws_instance. É necessário planejar requisitos, estruturar código de forma reutilizável/segura, implementar bateria de testes (estáticos, de segurança, integração nativa com tofu test, e destrutivos) e adotar estratégia BDD para alinhar o comportamento do módulo às expectativas de negócio.&lt;/p&gt;

&lt;p&gt;A transição para o OpenTofu não exige mudanças no código que é um substituto direto do Terraform, com a vantagem adicional de ser totalmente open‑source e governado pela comunidade, eliminando questões de licenciamento e garantindo a perenidade do seu investimento em IaC.&lt;/p&gt;

&lt;p&gt;Ao seguir este guia, você terá um módulo robusto, testável e &lt;em&gt;production ready&lt;/em&gt;, além de facilitar a colaboração entre equipes de desenvolvimento, operações e segurança.&lt;/p&gt;

&lt;p&gt;Referências&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://opentofu.org/blog/opentofu-1-11-0/" rel="noopener noreferrer"&gt;https://opentofu.org/blog/opentofu-1-11-0/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.opentofu.org" rel="noopener noreferrer"&gt;https://docs.opentofu.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.hashicorp.com/terraform/cli/commands/test" rel="noopener noreferrer"&gt;https://developer.hashicorp.com/terraform/cli/commands/test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://terraform-compliance.com" rel="noopener noreferrer"&gt;https://terraform-compliance.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.checkov.io" rel="noopener noreferrer"&gt;https://www.checkov.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/terraform-linters/tflint" rel="noopener noreferrer"&gt;https://github.com/terraform-linters/tflint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance" rel="noopener noreferrer"&gt;https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>terraform</category>
      <category>bdd</category>
      <category>tdd</category>
      <category>opentofu</category>
    </item>
    <item>
      <title>[PT-BR] Kubectl: boas práticas</title>
      <dc:creator>Carlos Nogueira</dc:creator>
      <pubDate>Thu, 23 Apr 2026 22:18:42 +0000</pubDate>
      <link>https://dev.to/cedon/pt-br-kubectl-boas-praticas-462j</link>
      <guid>https://dev.to/cedon/pt-br-kubectl-boas-praticas-462j</guid>
      <description>&lt;p&gt;Boas práticas para usar o kubectl de forma eficiente e segura:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use contextos e namespaces de forma explícita&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Defina o contexto atual com kubectl config use-context para evitar operações no cluster errado.&lt;/li&gt;
&lt;li&gt;Sempre especifique o --namespace ou configure o namespace padrão no contexto.&lt;/li&gt;
&lt;li&gt;Liste e alterne entre contextos com kubectl config get-contexts.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Aliases e autocompletion para ganhar velocidade&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Crie aliases comuns, por exemplo:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'kubectl'&lt;/span&gt;
  &lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;kgp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'kubectl get pods'&lt;/span&gt;
  &lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;ksys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'kubectl --namespace kube-system'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Habilite o autocomplete (Bash/Zsh) – isso reduz erros de digitação e acelera comandos.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Use kubectl explain para documentação rápida&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Antes de escrever um YAML, consulte os campos disponíveis:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  kubectl explain pod.spec.containers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Manipulação segura de recursos&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Nunca use kubectl delete sem antes validar com --dry-run=client ou kubectl get.&lt;/li&gt;
&lt;li&gt;Prefira kubectl apply -f em vez de create/replace – é declarativo e seguro.&lt;/li&gt;
&lt;li&gt;Para edição, use kubectl edit (o editor respeita o schema) e evite editar YAMLs baixados manualmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Aproveite os comandos integrados para debugging&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;kubectl logs --previous – vê logs do container anterior (útil após crash).&lt;/li&gt;
&lt;li&gt;kubectl exec -it  -- /bin/sh – acesso interativo.&lt;/li&gt;
&lt;li&gt;kubectl port-forward – expõe serviços localmente sem alterar o cluster.&lt;/li&gt;
&lt;li&gt;kubectl top pod/node – métricas de CPU/memória (requer Metrics Server).&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Formatação e filtros de saída&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Use -o wide, -o yaml ou -o json conforme necessário.&lt;/li&gt;
&lt;li&gt;Combine com jq ou custom-columns para extrair informações específicas:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  kubectl get pods &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="s1"&gt;'.items[].metadata.name'&lt;/span&gt;
  kubectl get pods &lt;span class="nt"&gt;-o&lt;/span&gt; custom-columns&lt;span class="o"&gt;=&lt;/span&gt;NAME:.metadata.name,STATUS:.status.phase
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Plugins e extensões&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Instale o &lt;a href="https://krew.sigs.k8s.io/" rel="noopener noreferrer"&gt;Krew&lt;/a&gt; (gerenciador de plugins) e experimente:

&lt;ul&gt;
&lt;li&gt;kubectl tree – mostra donos de recursos.&lt;/li&gt;
&lt;li&gt;kubectl ns – troca de namespace rapidamente.&lt;/li&gt;
&lt;li&gt;kubectl neat – remove campos gerados de YAMLs.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Evite comandos imperativos em produção&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Prefira arquivos YAML versionados (Git) a comandos como kubectl run ... --image=.... Isso garante reprodutibilidade e revisão.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Limite escopo de ações&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Use --all-namespaces apenas quando realmente necessário – pode retornar milhares de objetos.&lt;/li&gt;
&lt;li&gt;Combine --selector (label selector) para operações em subconjuntos de recursos.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Segurança&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Nunca exponha o kubeconfig (ele contém certificados ou tokens).&lt;/li&gt;
&lt;li&gt;Revise permissões com kubectl auth can-i antes de executar ações críticas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Seguindo essas práticas, você reduz riscos, ganha produtividade e mantém o controle sobre clusters Kubernetes.&lt;/p&gt;

&lt;p&gt;Referências&lt;br&gt;
&lt;a href="https://kubernetes.io/docs/reference/kubectl/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/reference/kubectl/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://krew.sigs.k8s.io/" rel="noopener noreferrer"&gt;https://krew.sigs.k8s.io/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>kubectl</category>
      <category>containers</category>
    </item>
    <item>
      <title>[PT-BR] Ciclo de Vida de Desenvolvimento de Software com assistência de IA</title>
      <dc:creator>Carlos Nogueira</dc:creator>
      <pubDate>Sun, 19 Apr 2026 21:11:25 +0000</pubDate>
      <link>https://dev.to/cedon/pt-br-ciclo-de-vida-de-desenvolvimento-de-software-com-assistencia-de-ia-1n7a</link>
      <guid>https://dev.to/cedon/pt-br-ciclo-de-vida-de-desenvolvimento-de-software-com-assistencia-de-ia-1n7a</guid>
      <description>&lt;p&gt;Um bom questionamento nos dias atuais é:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Será que as coisas mudaram mesmo no mundo de desenvolvimento de software?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pergunta necessária e que me fez lembrar que nunca é demais reforçar/revisitar os fundamentos. &lt;/p&gt;

&lt;p&gt;Até porque a área de tecnologia sempre esteve sob influência de atores aleatórios e hypes sem sentido que estão bem longe de agregar valor às organizações, ou que são apenas &lt;em&gt;chuva de verão&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;De qualquer forma,  neste processo de revisitar fundações, uma lupa no Ciclo de vida de Desenvolvimento de Software se faz necessária e considerar os casos de sucesso  (e desastres) do hype atual ajuda a perceber experiências válidas a se compartilhar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fluxo SDLC
&lt;/h2&gt;

&lt;p&gt;O fluxo SDLC (Software Development Life Cycle) é o processo de etapas para desenvolver software de forma estruturada. Um fluxo tradicional (em Cascata) inclui:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Planejamento&lt;/strong&gt;: Definição de escopo, custos e riscos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Análise de Requisitos&lt;/strong&gt;: Levantamento do que o sistema deve fazer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design&lt;/strong&gt;: Arquitetura, componentes, interfaces e banco de dados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementação (Codificação)&lt;/strong&gt;: Escrita do código fonte.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testes&lt;/strong&gt;: Verificação de bugs e validação dos requisitos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implantação (Deploy)&lt;/strong&gt;: Disponibilização do sistema em produção.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenção&lt;/strong&gt;: Correções, melhorias e atualizações contínuas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Variações comuns do fluxo:&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;Modelo em V&lt;/strong&gt;: Testes pareados com cada fase de desenvolvimento.&lt;br&gt;
· &lt;strong&gt;Iterativo/Incremental&lt;/strong&gt;: Ciclos curtos entregando partes funcionais.&lt;br&gt;
· &lt;strong&gt;Ágil (Scrum/Kanban)&lt;/strong&gt;: Iterações rápidas (sprints) com feedback contínuo.&lt;br&gt;
· &lt;strong&gt;Espiral&lt;/strong&gt;: Foco em análise de riscos e prototipação.&lt;br&gt;
· &lt;strong&gt;Continuos Delivery&lt;/strong&gt;: Integração contínua e entrega contínua (CI/CD), unindo desenvolvimento e operações.&lt;/p&gt;

&lt;p&gt;Cada projeto escolhe o fluxo conforme requisitos, tamanho da equipe e necessidade de entregas rápidas ou documentação rígida.&lt;/p&gt;

&lt;h2&gt;
  
  
  SDLC com assistência de IA
&lt;/h2&gt;

&lt;p&gt;O fluxo SDLC em 2026 pode apresentar mudanças influenciadas por assistência de IA: o processo de desenvolvimento está a deixar de ser uma série de tarefas em sua maioria manuais e está se transformando em uma cadeia de valor contínua e inteligente, na qual a IA participa ativamente de todas as fases.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;Modelo de Maturidade da 3Pillar and Forrester&lt;/em&gt; &lt;a href="https://www.3pillarglobal.com/insights/blog/building-an-ai-enabled-sdlc-insights-from-3pillar-and-forrester/#main-content" rel="noopener noreferrer"&gt;¹&lt;/a&gt; ajuda a descrever como as organizações podem evoluir nesse cenário.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Caminho da Maturidade
&lt;/h2&gt;

&lt;p&gt;A integração da IA no SDLC não é um evento único, mas uma jornada com níveis crescentes de sofisticação e impacto.&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;Nível 0: SDLC Clássico&lt;/strong&gt;: Práticas tradicionais (Ágil, Kanban), com processos majoritariamente manuais. É a base estável e conhecida, mas sem automação inteligente &lt;a href="https://www.3pillarglobal.com/insights/blog/building-an-ai-enabled-sdlc-insights-from-3pillar-and-forrester/#main-content" rel="noopener noreferrer"&gt;¹&lt;/a&gt;.&lt;br&gt;
· &lt;strong&gt;Nível 1: Assistido por IA&lt;/strong&gt;: A experimentação começa de forma individual e pontual, com ferramentas como assistentes de código, geradores de design e automação de testes. O progresso é real, porém inconsistente &lt;a href="https://www.3pillarglobal.com/insights/blog/building-an-ai-enabled-sdlc-insights-from-3pillar-and-forrester/#main-content" rel="noopener noreferrer"&gt;¹&lt;/a&gt;&lt;br&gt;
· &lt;strong&gt;Nível 2: Otimizado por IA&lt;/strong&gt;: A organização formaliza a adoção, estabelecendo governança, seleção de ferramentas e integração para gerar ganhos de eficiência mensuráveis em todo o ciclo &lt;a href="https://www.3pillarglobal.com/insights/blog/building-an-ai-enabled-sdlc-insights-from-3pillar-and-forrester/#main-content" rel="noopener noreferrer"&gt;¹&lt;/a&gt;.&lt;br&gt;
· &lt;strong&gt;Nível 3: Aumentado por Agentes&lt;/strong&gt;: Agentes de IA assumem o gerenciamento de workflows completos, coordenando tarefas e ferramentas. Humanos migram para uma posição de supervisão estratégica ("over the loop") &lt;a href="https://www.3pillarglobal.com/insights/blog/building-an-ai-enabled-sdlc-insights-from-3pillar-and-forrester/#main-content" rel="noopener noreferrer"&gt;¹&lt;/a&gt;.&lt;br&gt;
· &lt;strong&gt;Nível 4: Nativo em Agentes&lt;/strong&gt;: As equipes operam em ambientes totalmente orquestrados por IA, com o foco humano em estratégia, design e criação de valor. O processo é desenhado para otimizar a colaboração entre humanos e máquinas &lt;a href="https://www.3pillarglobal.com/insights/blog/building-an-ai-enabled-sdlc-insights-from-3pillar-and-forrester/#main-content" rel="noopener noreferrer"&gt;¹&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Entender em qual nível sua organização se encontra é o primeiro passo para planejar a transformação, caso seja aplicável/necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como a IA Pode Influenciar Cada Etapa do SDLC
&lt;/h2&gt;

&lt;p&gt;De forma geral, a IA Generativa (GenAI) tem o maior impacto nas fases de design, implementação, teste e documentação, com mais de 70% dos desenvolvedores relatando uma redução de pelo menos 50% do tempo gasto em tarefas repetitivas &lt;a href="https://arxiv.org/html/2603.16975v1" rel="noopener noreferrer"&gt;²&lt;/a&gt;. Já nas fases iniciais, como planejamento e análise de requisitos, os benefícios ainda são menores &lt;a href="https://arxiv.org/html/2603.16975v1" rel="noopener noreferrer"&gt;²&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Aqui está um panorama mais detalhado da transformação em cada etapa:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Planejamento e Requisitos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;O Que a IA Faz&lt;/strong&gt;: Gera histórias de usuário a partir de conversas, identifica conflitos em requisitos e cria rascunhos de documentação&lt;a href="https://www.hcltech.com/de-de/trends-and-insights/autonomous-software-factory-agentic-ai-sdlc" rel="noopener noreferrer"&gt;³&lt;/a&gt; &lt;a href="https://circleci.com/blog/ai-sdlc/" rel="noopener noreferrer"&gt;⁴&lt;/a&gt;.&lt;br&gt;
· &lt;strong&gt;Papéis e Ferramentas&lt;/strong&gt;: Agente de Requisitos, Documentos de Requisitos de Negócio (BRDs), Jira, documentação assistida por IA &lt;a href="https://www.hcltech.com/de-de/trends-and-insights/autonomous-software-factory-agentic-ai-sdlc" rel="noopener noreferrer"&gt;³&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design e Arquitetura&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;O Que a IA Faz&lt;/strong&gt;: Propõe padrões arquiteturais (ex: eventos para alta escalabilidade), gera especificações (OpenAPI, C4) e documenta decisões de design &lt;a href="https://www.hcltech.com/de-de/trends-and-insights/autonomous-software-factory-agentic-ai-sdlc" rel="noopener noreferrer"&gt;³&lt;/a&gt;.&lt;br&gt;
· &lt;strong&gt;Papéis e Ferramentas&lt;/strong&gt;: Agente de Design, OpenAPI, geradores de diagramas C4, Designers e Arquitetos de IA &lt;a href="https://www.hcltech.com/de-de/trends-and-insights/autonomous-software-factory-agentic-ai-sdlc" rel="noopener noreferrer"&gt;³&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codificação (Implementação)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;O Que a IA Faz&lt;/strong&gt;: Gera código, refatora e resolve erros automaticamente com ferramentas mais avançadas (Agente de Codificação) &lt;a href="https://www.hcltech.com/de-de/trends-and-insights/autonomous-software-factory-agentic-ai-sdlc" rel="noopener noreferrer"&gt;³&lt;/a&gt;.&lt;br&gt;
· &lt;strong&gt;Papéis e Ferramentas&lt;/strong&gt;: Agente de Codificação (GitHub Copilot, Amazon Q) e Engenheiro de Prompt para guiar a geração de código &lt;a href="https://developer.microsoft.com/blog/reimagining-every-phase-of-the-developer-lifecycle?WT_mc_id=M365-MVP-5001530#respond" rel="noopener noreferrer"&gt;⁵&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testes (QA)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;O Que a IA Faz&lt;/strong&gt;: Cria casos de teste, gera scripts de automação (Selenium, Cucumber), realiza automação de QA (Agente de QA) e testa de forma autônoma (Agente de Teste Autônomo) &lt;a href="https://www.hcltech.com/de-de/trends-and-insights/autonomous-software-factory-agentic-ai-sdlc" rel="noopener noreferrer"&gt;³&lt;/a&gt; &lt;a href="https://circleci.com/blog/ai-sdlc/" rel="noopener noreferrer"&gt;⁴&lt;/a&gt;.&lt;br&gt;
· &lt;strong&gt;Papéis e Ferramentas&lt;/strong&gt;: Agente de QA (Autonomous Quality Engineering), Selenium, Cucumber, estruturas de teste de IA &lt;a href="https://circleci.com/blog/ai-sdlc/" rel="noopener noreferrer"&gt;⁴&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implantação (Deploy)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;O Que a IA Faz&lt;/strong&gt;: Gerencia pipelines de CI/CD, toma decisões sobre os estágios de deploy e, com IAs mais avançadas (Agente de DevOps), orquestra e monitora o ciclo inteiro &lt;a href="https://developer.microsoft.com/blog/reimagining-every-phase-of-the-developer-lifecycle?WT_mc_id=M365-MVP-5001530#respond" rel="noopener noreferrer"&gt;⁵&lt;/a&gt;.&lt;br&gt;
· &lt;strong&gt;Papéis e Ferramentas&lt;/strong&gt;: Agente de DevOps, pipelines de CI/CD, ferramentas de monitoramento &lt;a href="https://developer.microsoft.com/blog/reimagining-every-phase-of-the-developer-lifecycle?WT_mc_id=M365-MVP-5001530#respond" rel="noopener noreferrer"&gt;⁵&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manutenção e Operações&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;O Que a IA Faz&lt;/strong&gt;: Monitora sistemas, sugere correções proativas e auxilia na autoria de patches para self-healing &lt;a href="https://www.hcltech.com/de-de/trends-and-insights/autonomous-software-factory-agentic-ai-sdlc" rel="noopener noreferrer"&gt;³&lt;/a&gt;&lt;br&gt;
· &lt;strong&gt;Papéis e Ferramentas&lt;/strong&gt;: Agente de Operações, sistemas de monitoramento, ferramentas de self-healing &lt;a href="https://www.hcltech.com/de-de/trends-and-insights/autonomous-software-factory-agentic-ai-sdlc" rel="noopener noreferrer"&gt;³&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Evolução das Equipes
&lt;/h2&gt;

&lt;p&gt;Nem toda organização se enquadra ou precisa necessariamente entrar na jornada de evolução e maturidade do modelo. &lt;/p&gt;

&lt;p&gt;Deve existir a devida curadoria tecnológica, metodológica e estratégica que vislumbre se adicionar assistência de AI no SDLC é algo que vai agregar valor real.&lt;/p&gt;

&lt;p&gt;No caso que se enquadre, com a IA automatizando a criação de artefatos (código, testes, documentação), o papel humano vai se deslocar para as atividades de maior valor.&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;O Profissional como "Condutor" (Conductor)&lt;/strong&gt;: A nova função principal é a de orquestrar agentes de IA, compor workflows e garantir a aderência aos padrões e objetivos de negócio.&lt;br&gt;
· &lt;strong&gt;Surgem Novas Funções Especializadas&lt;/strong&gt;: Vemos o aparecimento de carreiras como Arquiteto de SDLC Nativo em IA, Desenvolvedor de Engenharia de Prompt e Escritor Técnico de Workflows de IA, focados em criar as instruções e estruturas que guiam as IAs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Os Novos Desafios e Gargalos
&lt;/h2&gt;

&lt;p&gt;A velocidade trazida pela IA expõe e até amplifica gargalos existentes &lt;a href="https://labs.thisdot.co/blog/ai-speed-vs-bottlenecks" rel="noopener noreferrer"&gt;¹¹&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;O Gargalo da Revisão&lt;/strong&gt;: A maior dificuldade atualmente não é gerar código, mas sim revisar o dilúvio de código gerado pelas IAs. A capacidade humana de revisão tornou-se o principal ponto de estrangulamento &lt;a href="https://www.xano.com/blog/how-to-incorporate-ai-into-sdlc/" rel="noopener noreferrer"&gt;¹²&lt;/a&gt;.&lt;br&gt;
· &lt;strong&gt;Dívida Técnica e Segurança&lt;/strong&gt;: Código gerado em alta velocidade pode introduzir dívida técnica, vulnerabilidades de segurança e problemas de manutenibilidade se não for devidamente governado &lt;a href="https://www.xano.com/blog/how-to-incorporate-ai-into-sdlc/" rel="noopener noreferrer"&gt;¹²&lt;/a&gt;&lt;br&gt;
· &lt;strong&gt;Necessidade de "Guardrails"&lt;/strong&gt;: É crucial estabelecer regras claras, supervisão humana e processos de validação automatizados para mitigar os riscos. A saída da IA deve ser tratada como a de um novo desenvolvedor: potencialmente falha e que precisa ser revisada &lt;a href="https://www.xano.com/blog/how-to-incorporate-ai-into-sdlc/" rel="noopener noreferrer"&gt;¹²&lt;/a&gt; &lt;a href="https://hodapp.com/posts/axioms-and-theorems-of-human-ai-systems-engineering/" rel="noopener noreferrer"&gt;¹⁵&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Frameworks e Ferramentas Prontas
&lt;/h2&gt;

&lt;p&gt;Para navegar por essa nova realidade, diversas metodologias e ferramentas já estão disponíveis.&lt;/p&gt;

&lt;p&gt;· &lt;strong&gt;AWS AI-Driven Development Lifecycle (AI-DLC)&lt;/strong&gt;: Uma metodologia open-source de três fases (Inception, Construction, Operations) que integra IA em cada etapa, com gatekeepers humanos nos pontos críticos. Pode ser implementada com o Amazon Q Developer &lt;a href="https://www.crnasia.com/india/news-network/news/aws-devsphere-2025-aws-unveils-ai-powered-software-development-framework?utm=crnindia_redirect_click" rel="noopener noreferrer"&gt;⁹&lt;/a&gt;.&lt;br&gt;
· &lt;strong&gt;Agentic DevOps (Microsoft)&lt;/strong&gt;: Uma abordagem que utiliza agentes de IA como colegas de equipe em todas as fases, do planejamento à modernização, usando ferramentas como o GitHub Copilot &lt;a href="https://developer.microsoft.com/blog/reimagining-every-phase-of-the-developer-lifecycle?WT_mc_id=M365-MVP-5001530#respond" rel="noopener noreferrer"&gt;¹⁰&lt;/a&gt;.&lt;br&gt;
· &lt;strong&gt;3Pillar AI-Enabled SDLC Maturity Model&lt;/strong&gt;: Um framework útil para diagnosticar em que nível de maturidade sua organização se encontra e planejar os próximos passos &lt;a href="https://www.3pillarglobal.com/insights/blog/building-an-ai-enabled-sdlc-insights-from-3pillar-and-forrester/#main-content" rel="noopener noreferrer"&gt;¹&lt;/a&gt;.&lt;br&gt;
· &lt;strong&gt;Outras Soluções&lt;/strong&gt;: Ferramentas como o Kiro (AWS) (IDE agente)&lt;a href="https://www.crnasia.com/india/news-network/news/aws-devsphere-2025-aws-unveils-ai-powered-software-development-framework?utm=crnindia_redirect_click" rel="noopener noreferrer"&gt;⁸&lt;/a&gt; e metodologias de empresas como EPAM (Native AI SDLC) e AMPECO (CoOperator Dev Agent) também oferecem caminhos práticos para a adoção &lt;a href="https://www.ampeco.com/blog/how-we-built-an-ai-native-engineering-system/" rel="noopener noreferrer"&gt;⁶&lt;/a&gt; &lt;a href="https://www.epam.com/about/newsroom/in-the-news/2026/from-traditional-software-to-a-native-ai-sdlc-how-genai-is-redefining-engineering" rel="noopener noreferrer"&gt;⁷&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Síntese e Próximos Passos
&lt;/h2&gt;

&lt;p&gt;Integrar IA no SDLC é uma oportunidade estratégica para aumentar a velocidade e a qualidade, mas exige planejamento. O primeiro passo prático é avaliar em qual nível de maturidade sua equipe se encontra, identificar os gargalos atuais e começar com projetos-piloto bem definidos, caso seja identificado a necessidade de utilização de SDLC com assistência de IA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.microsoft.com/blog/reimagining-every-phase-of-the-developer-lifecycle?WT_mc_id=M365-MVP-5001530#respond" rel="noopener noreferrer"&gt;https://developer.microsoft.com/blog/reimagining-every-phase-of-the-developer-lifecycle?WT_mc_id=M365-MVP-5001530#respond&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://circleci.com/blog/ai-sdlc/" rel="noopener noreferrer"&gt;https://circleci.com/blog/ai-sdlc/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/html/2603.16975v1" rel="noopener noreferrer"&gt;https://arxiv.org/html/2603.16975v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://labs.thisdot.co/blog/ai-speed-vs-bottlenecks" rel="noopener noreferrer"&gt;https://labs.thisdot.co/blog/ai-speed-vs-bottlenecks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xano.com/blog/how-to-incorporate-ai-into-sdlc/" rel="noopener noreferrer"&gt;https://www.xano.com/blog/how-to-incorporate-ai-into-sdlc/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.crnasia.com/india/news-network/news/aws-devsphere-2025-aws-unveils-ai-powered-software-development-framework?utm=crnindia_redirect_click" rel="noopener noreferrer"&gt;https://www.crnasia.com/india/news-network/news/aws-devsphere-2025-aws-unveils-ai-powered-software-development-framework?utm=crnindia_redirect_click&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ampeco.com/blog/how-we-built-an-ai-native-engineering-system/" rel="noopener noreferrer"&gt;https://www.ampeco.com/blog/how-we-built-an-ai-native-engineering-system/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hodapp.com/posts/axioms-and-theorems-of-human-ai-systems-engineering/" rel="noopener noreferrer"&gt;https://hodapp.com/posts/axioms-and-theorems-of-human-ai-systems-engineering/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>[PT-BR] Pois é! Um post sobre o hype.</title>
      <dc:creator>Carlos Nogueira</dc:creator>
      <pubDate>Fri, 06 Feb 2026 01:04:17 +0000</pubDate>
      <link>https://dev.to/cedon/pois-e-um-post-sobre-o-hype-kpa</link>
      <guid>https://dev.to/cedon/pois-e-um-post-sobre-o-hype-kpa</guid>
      <description>&lt;p&gt;Enfim, resolvi dar uma pausa na escrita do livro para escrever sobre um tema que, como muitos que acompanham as &lt;a href="https://www.youtube.com/@carlosenog" rel="noopener noreferrer"&gt;#engineeringsessions&lt;/a&gt; já perceberam, me incomoda bastante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DISCLAIMER&lt;/strong&gt;: SEMPRE enfatizo que as críticas não são à tecnologia. Tirando o lado  óbvio dos prejuízos ao meio-ambiente &lt;a href="https://aclanthology.org/2025.findings-emnlp.939.pdf" rel="noopener noreferrer"&gt;¹&lt;/a&gt; &lt;a href="https://arxiv.org/html/2503.05804v1" rel="noopener noreferrer"&gt;²&lt;/a&gt; e à saúde mental ocasionados pelo hype de LLM &lt;a href="https://mental.jmir.org/2024/1/e59479/" rel="noopener noreferrer"&gt;³&lt;/a&gt; &lt;a href="https://futurism.com/commitment-jail-chatgpt-psychosis" rel="noopener noreferrer"&gt;⁴&lt;/a&gt; &lt;a href="https://futurism.com/chatgpt-mental-health-crises" rel="noopener noreferrer"&gt;⁵&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"É ÉLE-ÉLE-EME, nada de botar a culpa na conta da AI, que por sinal é uma área muito mais abrangente do que o hype vende.&lt;a href="https://roadmap.sh/ai-engineer" rel="noopener noreferrer"&gt;⁶&lt;/a&gt; &lt;a href="https://roadmap.sh/ai-data-scientist" rel="noopener noreferrer"&gt;⁷&lt;/a&gt; &lt;a href="https://roadmap.sh/machine-learning" rel="noopener noreferrer"&gt;⁸&lt;/a&gt;"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sem falar na carga pesada de propaganda do tipo "&lt;em&gt;comprem meu produto&lt;/em&gt;", "&lt;em&gt;façam meu treinamento&lt;/em&gt;", "&lt;em&gt;assinem meu serviço&lt;/em&gt;" coisas que tentam deturpar (até) os próprios conceitos que fazem parte do núcleo base da tecnologia que tá sendo empurrada em nossa direção pelo hype.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DISCLAIMER 2&lt;/strong&gt;: A Stack HOMOLOGADA do seu trabalho é(ou ao menos deveria ser) de utilização OBRIGATÓRIA do profissional de T.I. que faz parte dos times técnicos. &lt;/p&gt;

&lt;p&gt;Logo, se vc veio aqui "&lt;em&gt;se queixar que o Carlos está a incentivar a não utilização de ferramentas de LLM no trabalho&lt;/em&gt;", pode dar meia-volta. &lt;/p&gt;

&lt;p&gt;Não sou "&lt;strong&gt;hater de AI&lt;/strong&gt;", aliás, nem acredito que esta persona exista no mundo profissional real. &lt;/p&gt;

&lt;p&gt;Pois se não tem como evitarmos a utilização, não existe essa pessoa que vai chegar com os gestores e dizer "ME RECUSO A USAR!".&lt;/p&gt;

&lt;p&gt;Cada um usa o que bem entender, traça a estratégia que achar mais adequada para sua própria vida profissional/carreira, ninguém precisa de "babá de tecnologia/stack" e cada um sabe onde o calo aperta.&lt;/p&gt;

&lt;p&gt;Apesar disso, não utilizar no trabalho ferramentas que não sejam homologadas pela sua organização é requisito básico de compliance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"NÃO DÁ PRA DERROTAR QUEM JÁ TÁ NO CHÃO"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É ruim "bater em bêbado", quando o assunto é falhas de cybersegurança&lt;a href="https://arxiv.org/html/2405.03644v2" rel="noopener noreferrer"&gt;⁹&lt;/a&gt;, ou as diversas reticências no que diz respeito aos desafios de manter&lt;a href="https://arxiv.org/abs/2502.02368" rel="noopener noreferrer"&gt;¹⁰&lt;/a&gt; um software gerado por ferramentas de LLM que auxiliam na codificação.&lt;/p&gt;

&lt;p&gt;Então essas são outras coisas que NÃO irei abordar aqui. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"NÃO, ESTE HYPE NÃO É IGUAL AOS OUTROS"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Muitos comentam que &lt;em&gt;"este hype é parecido com o de microsserviços"&lt;/em&gt; (por exemplo). &lt;/p&gt;

&lt;p&gt;Não, não é. &lt;/p&gt;

&lt;p&gt;Poderia ser só mais uma (boa) tecnologia para acrescentarmos à nossa stack e ao nosso trabalho. &lt;/p&gt;

&lt;p&gt;O problema é que MUITA GENTE tenta vender como um "PARADIGMA", algo que vai "MATAR os Devs", ou substituir a engenharia de software como ela é hoje. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;E é nessa parte que a propaganda me pega.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;(Sob meu ponto de vista) Chega a ser ultrajante desconsiderar os avanços da engenharia depois de mais de 40 anos de história. &lt;/p&gt;

&lt;p&gt;Existe um fluxo para a evolução e implementação da Engenharia. &lt;/p&gt;

&lt;p&gt;Os últimos anos consolidaram um conjunto de processos, organização de times, metodologias, frameworks de trabalho, matérias relacionadas a automação, plataformas e maturidade das tecnologias que são base de tudo que é utilizado para a confecção de produtos digitais. &lt;/p&gt;

&lt;p&gt;O fator preponderante do que nós vemos no mercado hoje, é o papel cada vez mais presente do método científico servir como base para as engenharias. &lt;/p&gt;

&lt;p&gt;O embate entre quem se preocupa com a forma e  "agradabilidade de leitura" do código(artesãos) e quem "só" deseja resolver os problemas(engenheiros) havia encontrado o chão comum: a ciência. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Dave Farley aborda o papel da ciência na evolução das engenharias aqui neste vídeo: &lt;br&gt;
&lt;a href="https://youtube.com/watch?v=J8vCm1NdKIc" rel="noopener noreferrer"&gt;&lt;em&gt;-Engineering for Software&lt;/em&gt;&lt;/a&gt;"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Esse fluxo não sumiu(e nem vai tão cedo). Ele está aí e construir produtos digitais ainda obedece aos mesmos fundamentos. &lt;/p&gt;

&lt;p&gt;Quando aquela pessoa Dev amiga (de verdade) diz pra você "utilize a LLM para auxiliar no código, mas tenha senso crítico", na realidade ela não está nada mais do que afirmando nas entrelinhas que você precisa estudar os fundamentos da engenharia moderna para poder implementar. &lt;/p&gt;

&lt;p&gt;Isso não mudou, mesmo que a propaganda tente vender as técnicas de engenharia &lt;em&gt;(Ágil,Cloud Native,FLOSS,Entrega Contínua,12factor app, OpenAPI,DDD,BDD,TDD,etc.)&lt;/em&gt; usando outro nome, outra roupagem. &lt;/p&gt;

&lt;p&gt;O desafio está em conseguir filtrar o que é evolução de fundação, do que é propaganda de uma solução proprietária.&lt;/p&gt;

&lt;p&gt;Muitas "novidades" alardeadas pelo hype, não passam de imagens de contêineres que fazem chamadas para consumir alguma API proprietária, ou padrões(como OpenAPI) "repaginados"(por vezes mal implementados) para a "nova realidade".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"PARE DE TREINAR O MODELO DOS OUTROS E VÁ TREINAR O SEU CÉREBRO!"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se você faz parte de times com pouca senioridade (estou falando sobre senioridade do TIME e não individual), muito provavelmente a  utilização de codificação assistida por LLM vai acelerar o prejuízo e dívida técnica que o seu time naturalmente já iria produzir&lt;a href="https://dora.dev/research/2025/dora-report/" rel="noopener noreferrer"&gt;¹¹&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Então sabendo disso, você deve atuar para auxiliar na evolução do conhecimento de engenharia do seu time. &lt;/p&gt;

&lt;p&gt;Este deveria ser o papel de quem é Senior++ e gestores, porém a situação atual pede que todas e todos que fazem parte da equipe tenham de procurar um papel de compartilhamento de conhecimento no time. &lt;/p&gt;

&lt;p&gt;Neste caso, as ferramentas de AI também podem auxiliar. &lt;/p&gt;

&lt;p&gt;Toda equipe, mesmo antes do hype, já deveria ter um contexto de gestão do conhecimento. Isso agora tem um papel muito mais forte. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"PROPAGANDA NÃO É FUNDAMENTO, SOFTWARE PROPRIETÁRIO NÃO É FLOSS(Free Libre Open Source Software)"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Propaganda não é fundamento, o "método de utilização do software do zezinho" não é o mesmo do software do pedrinho. &lt;/p&gt;

&lt;p&gt;Aliás, nem as metodologias de desenvolvimento estão fincadas em pedra. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://martinfowler.com/bliki/ExtremeProgramming.html" rel="noopener noreferrer"&gt;XP&lt;/a&gt; foi uma experiência que deu certo com o Kent Beck &lt;a href="https://a.co/d/08pK3Wgo" rel="noopener noreferrer"&gt;naqueles projetos&lt;/a&gt;, mas talvez não vá dar certo na sua organização. &lt;/p&gt;

&lt;p&gt;Em resumo: ATÉ as experiências que deram certo no passado, muito provavelmente não vão funcionar no caso da sua organização.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mas por que ressaltar isso?&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;O hype atual emula EXPERIÊNCIAS QUE NÃO DERAM CERTO no passado. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;focar em soluções proprietárias &lt;a href="https://version-2.com/en/2024/10/exploring-the-differences-between-community-foss-open-core-and-commercial-oss/" rel="noopener noreferrer"&gt;¹²&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;aproximar programação da linguagem humana&lt;a href="https://www.cs.utexas.edu/~EWD/transcriptions/EWD01xx/EWD117.html" rel="noopener noreferrer"&gt;¹³&lt;/a&gt; &lt;a href="https://news.ycombinator.com/item?id=43564386" rel="noopener noreferrer"&gt;¹⁵&lt;/a&gt; &lt;a href="https://medium.com/@Szypetike/llms-programming-and-re-dijkstras-on-the-foolishness-of-natural-language-programming-1978-831729c4b968" rel="noopener noreferrer"&gt;¹⁶&lt;/a&gt; &lt;a href="https://www.cs.utexas.edu/~EWD/transcriptions/EWD06xx/EWD667.html" rel="noopener noreferrer"&gt;¹⁷&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Não é "discurso de doidinho do GNU/Linux". O core das bigtechs/Cloud e principais produtos digitais do mercado é FLOSS &lt;a href="https://share.google/bAbLvFJ3QfqWE369s" rel="noopener noreferrer"&gt;&lt;em&gt;(FOSS analytical)&lt;/em&gt;&lt;/a&gt;. E o hype não tem como base FLOSS. &lt;/p&gt;

&lt;p&gt;Ano passado(2025) as primeiras iniciativas mais relevantes começaram a aparecer &lt;a href="https://opensource.org/ai/webinars/the-ideology-of-foss-and-ai-what-open-means-relating-to-platforms-and-black-box-systems" rel="noopener noreferrer"&gt;¹⁸&lt;/a&gt;, o problema é que estão vindo tarde &lt;a href="https://www.linuxfoundation.org/press/linux-foundation-announces-the-formation-of-the-agentic-ai-foundation" rel="noopener noreferrer"&gt;¹⁹&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;E para completar, o ritmo de surgimento de "padrões" e "especificações" é frenético, a ponto de vermos a "morte" de padrões que não duram sequer 3 meses&lt;a href="https://acuvity.ai/the-clawdbot-dumpster-fire-72-hours-that-exposed-everything-wrong-with-ai-security/" rel="noopener noreferrer"&gt;²⁰&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"CUIDADO COM O SENIOR++ ENDOSER DO HYPE"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Desde o surgimento do hype de LLM diversas pesquisas já demonstraram que isto acelera sua equipe(pro bem e/ou pro mal)&lt;a href="https://dora.dev/research/2025/dora-report/" rel="noopener noreferrer"&gt;²¹&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Se a equipe for boa, vai acelerar a qualidade  boa da entrega.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Se a equipe for ruim, vai acelerar os problemas.&lt;a href="https://youtu.be/b9EbCb5A408?si=PF2RLGI2fudhOd0p" rel="noopener noreferrer"&gt;²²&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Essa lógica vale pros devs Seniors++ individualmente também. &lt;/p&gt;

&lt;p&gt;A pessoa tem os fundamentos bem definidos na memória muscular, já têm bastante vivência de mercado. Daí fica fácil enxergar o grande valor que a ferramenta pode gerar no trabalho do dia-a-dia.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;E isso é um problema.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Nós temos nossas experiências pessoais, porém da mesma forma devs e projetos crescem em conjunto, seja num time, seja numa organização, seja na comunidade de profissionais de tecnologia.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Não existe time de uma pessoa só!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dev senior consegue aproveitar, mas TEM DE SER SENIOR e não dá pra fingir que "todo time é repleto de seniors".&lt;/p&gt;

&lt;p&gt;Não dá pra fingir que times com senioridade baixa não existem, se bobear são a grande maioria no mercado. &lt;/p&gt;

&lt;p&gt;Então muito cuidado com Dev Senior++ que está empolgado nas redes sociais. A experiencia desse tipo de pessoa NÃO É a mesma que a sua, principalmente se você tem pouca senioridade e ainda tem um caminho grande de estudo/trabalho por percorrer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONCLUSÃO DO DESABAFO&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;E é isso, este foi um desabafo que estava a correr na minha cabeça já tem umas semanas. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sugestões de Eps das Sessões de Engenharia relacionados ao texto:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- "Vida do Profissional de Tecnologia": &lt;a href="https://youtu.be/3hNH881-5cw" rel="noopener noreferrer"&gt;https://youtu.be/3hNH881-5cw&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- "Engenheiros Staff+":  &lt;a href="https://youtu.be/15Zbg7Vk8Kw" rel="noopener noreferrer"&gt;https://youtu.be/15Zbg7Vk8Kw&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- "Retrospectiva 2025": &lt;a href="https://youtu.be/kdkPBE7fj20" rel="noopener noreferrer"&gt;https://youtu.be/kdkPBE7fj20&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- "Limites da Simplicidade": &lt;a href="https://youtu.be/byl4QAPajrU" rel="noopener noreferrer"&gt;https://youtu.be/byl4QAPajrU&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- "Velocidade":&lt;br&gt;
&lt;a href="https://youtu.be/QWRsLrbFch0" rel="noopener noreferrer"&gt;https://youtu.be/QWRsLrbFch0&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- "Filosofia UNIX: &lt;a href="https://youtu.be/mWXR_OBwjqY" rel="noopener noreferrer"&gt;https://youtu.be/mWXR_OBwjqY&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- "BDD":&lt;br&gt;
&lt;a href="https://youtu.be/VMY_Z2jDl00" rel="noopener noreferrer"&gt;https://youtu.be/VMY_Z2jDl00&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- "O Mítico Homem-mês": &lt;a href="https://youtu.be/f3z794AMpng" rel="noopener noreferrer"&gt;https://youtu.be/f3z794AMpng&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- "DDD":&lt;br&gt;
&lt;a href="https://youtu.be/rt0gSnwqcGY" rel="noopener noreferrer"&gt;https://youtu.be/rt0gSnwqcGY&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- "Complexidade Acidental":&lt;br&gt;
&lt;a href="https://youtu.be/IO4kOGfyVds" rel="noopener noreferrer"&gt;https://youtu.be/IO4kOGfyVds&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- "TDD":&lt;br&gt;
&lt;a href="https://youtu.be/H3N2B5gcGYs" rel="noopener noreferrer"&gt;https://youtu.be/H3N2B5gcGYs&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;- "12 Factor App":&lt;br&gt;
&lt;a href="https://youtu.be/8SMdEiNSKf4" rel="noopener noreferrer"&gt;https://youtu.be/8SMdEiNSKf4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*A leitura fica mais completa com consulta aos links das referências no texto.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Crossplane: GKE Installation</title>
      <dc:creator>Carlos Nogueira</dc:creator>
      <pubDate>Wed, 24 Feb 2021 14:27:50 +0000</pubDate>
      <link>https://dev.to/cedon/crossplane-gke-installation-i01</link>
      <guid>https://dev.to/cedon/crossplane-gke-installation-i01</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;..Crossplane is an open source Kubernetes add-on that supercharges your Kubernetes clusters enabling you to provision and manage infrastructure, services, and applications from kubectl.&lt;/em&gt; (crossplane.io)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Crossplane is a CNCF sandbox project, open source, community driven solution and add-on for your kubernetes API to manage and compose infrastructure.&lt;/p&gt;

&lt;p&gt;It uses a team centric approach with Open Application Model.&lt;/p&gt;

&lt;p&gt;The idea is to use a kubernetes cluster as a single control panel. where there is freedom to provision resources in any cloud and link these services with the cluster itself. The cluster does not need to be in the same cloud as the services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnz3dp5pfbhx0rgl2ejst.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnz3dp5pfbhx0rgl2ejst.png" alt="Alt Text" width="641" height="467"&gt;&lt;/a&gt;&lt;/p&gt;
Crossplane Application Architecture Example



&lt;p&gt;Basically a provider is configured in the cluster linked to a service account of a specific cloud.&lt;/p&gt;

&lt;p&gt;Crossplane CRDs use this provider to deploy and link services across the cluster.&lt;/p&gt;

&lt;p&gt;Each cloud service has its particularity and is defined through structures of compositions, definitions and namespaced k8s specifications.&lt;/p&gt;

&lt;p&gt;The CRDs that define the crossplane providers services are called XRDs.&lt;/p&gt;

&lt;p&gt;Crossplane has an external CLI and its own CRDs that are deployed in the cluster. &lt;/p&gt;

&lt;p&gt;Since CRDs and XRDs are deployed, the provisioning operation no longer requires the local CLI. Just having kubectl configured needed to re-deploy the types of resources that are already configured.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Follows ansible to automate the installation of a crossplane + GCP Provider in a GKE cluster&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;GKE&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Google Cloud SDK (316.+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;bq (2.0.62+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;core (2020.10.23.+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;gsutil (4.54.+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Kubernetes(1.16.+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;kubectl(1.16.+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Helm(3.+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;ansible (2.10.+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;openshift python client (0.11.+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;PyYAML (5.3.+)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deploy
&lt;/h2&gt;

&lt;p&gt;1 - Git clone the repo to bastion&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  - $ git clone https://gitlab.com/cedon/crossplane-gcp.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 - Check if roles/crossplane/defaults/main.yml is right for the environment you want to deploy&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tov5u0nlm441s3iuvmj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tov5u0nlm441s3iuvmj.png" alt="Alt Text" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3 - Deploy with ansible command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  - $ ansible-playbook -i ./hosts -e \ 
'ansible_python_interpreter=/usr/bin/python3' crossplane.yml 
\ --tags "install, gcp" -vvv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;After the Deploy you must take care about the file creds.json. It will be located at the repo root, and has the service account credentials.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;4 - Check Crossplane Installation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  - $ kubectl get all -n crossplane-system
  - $ kubectl crossplane --help
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Crossplane - &lt;a href="https://crossplane.io" rel="noopener noreferrer"&gt;https://crossplane.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Crossplane Install and Configure V1.0 - &lt;a href="https://crossplane.io/docs/v1.0/getting-started/install-configure.html" rel="noopener noreferrer"&gt;https://crossplane.io/docs/v1.0/getting-started/install-configure.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Crossplane Provision Infrastructure - &lt;a href="https://crossplane.io/docs/v1.0/getting-started/provision-infrastructure.html" rel="noopener noreferrer"&gt;https://crossplane.io/docs/v1.0/getting-started/provision-infrastructure.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>multicloud</category>
      <category>provider</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Linkerd: Service Mesh Overview</title>
      <dc:creator>Carlos Nogueira</dc:creator>
      <pubDate>Thu, 19 Nov 2020 05:37:26 +0000</pubDate>
      <link>https://dev.to/cedon/linkerd-service-mesh-overview-an7</link>
      <guid>https://dev.to/cedon/linkerd-service-mesh-overview-an7</guid>
      <description>&lt;p&gt;Linkerd is a ultralight, ultrafast, security-first service mesh for Kubernetes.&lt;/p&gt;

&lt;p&gt;Linkerd Service Mesh comes to solve the problem to add 3 layers at Cloud-Native Kubernetes app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Observability&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Reliability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Going back in monolith time, we have to deal with one language technology stack(for example: Java). And 3 operations teams to interact, deploy, operate with it: Devs, Networking and Security.&lt;/p&gt;

&lt;p&gt;But if we look at a Cloud-Native Kubernetes app, we have multi-language and architecture scenarios. So, the chalengers are most complex, and add Observability, Security Layer and Reliability becomes a implementation and operations difficult task. &lt;/p&gt;

&lt;p&gt;On earliest 2010 years, Twitter, Netflix and Google dealt with this situations making native languages libraries for their microservices stacks. &lt;/p&gt;

&lt;p&gt;Twitter has evolved its jvm based library Finable to deal with a multilanguage architecture. Then changed the name to Linkerd on 2016. Became the first Service Mesh Plataform.  &lt;/p&gt;

&lt;p&gt;In 2017 Linkerd was donated to CNCF.&lt;/p&gt;

&lt;p&gt;In 2018 was launched the Linkerd 2.0 version. With several changes. Now we have a Linkerd2-proxy Rust-based and Control Plane Golang-based. &lt;/p&gt;

&lt;p&gt;Implement a network of proxies that communicate securely(mTLS) using HTTP and gRPC. It was the solution found to inject the mesh layer. Each microservice meshed has a proxy injected like a side-car container. &lt;/p&gt;

&lt;p&gt;The name of the proxies network layer is Data Plane. This is the base of collected metrics and active operations. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkugzn5aje8q3wmaml8t7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkugzn5aje8q3wmaml8t7.png" alt="Alt Text" width="800" height="219"&gt;&lt;/a&gt;&lt;/p&gt;
Data Plane




&lt;p&gt;The other module is the Control Plane. This is the Linkerd Plataform Owners API Operations interface. Can be access by CLI or Browser. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkihnxc72kbd6igb9mdug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkihnxc72kbd6igb9mdug.png" alt="Alt Text" width="756" height="516"&gt;&lt;/a&gt;&lt;/p&gt;
Linkerd 2.x Architecture




&lt;p&gt;Linkerd Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Observability: Service-level golden metrics: success rates, latencies, throughput. Service topologies&lt;/li&gt;
&lt;li&gt;Reliability: Retries, timeouts, load balancing, circuit breaking&lt;/li&gt;
&lt;li&gt;Security: Transparent mTLS, cert management and rotation, policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most Service Mesh Plataforms are based on Envoy Proxy, but it isn't The Linkerd case. &lt;/p&gt;

&lt;p&gt;Use a "micro-proxy" Rust-based let the project to..&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;avoid a entire class of memory vulnerabilities. &lt;/li&gt;
&lt;li&gt;compiles to native code(no runtime env/GC). So it can be ultralight and ultrafast &lt;/li&gt;
&lt;li&gt;built on Tokio, Hyper, H2, Tower and the rest of modern Rust async networking stack. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Linkerd has huge numbers and benchmark results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4+ years in production&lt;/li&gt;
&lt;li&gt;5,000+ Slack channel members&lt;/li&gt;
&lt;li&gt;10,000+ GitHub stars&lt;/li&gt;
&lt;li&gt;100+ contributors&lt;/li&gt;
&lt;li&gt;Weekly edge releases&lt;/li&gt;
&lt;li&gt;Open governance, neutral home&lt;/li&gt;
&lt;li&gt;Tl;dr: really fast. Not as fast as "no service mesh", but significantly smaller and faster than Istio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't use Linkerd if your app..&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;..is a monolith&lt;/li&gt;
&lt;li&gt;..that communicate purely via Kafka or another distributed queue&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Previous Post
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/cedon/linkerd-install-and-basic-ops-2l90"&gt;Linkerd: Install and Basic Ops&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Linkerd Docs - &lt;a href="https://linkerd.io/docs" rel="noopener noreferrer"&gt;https://linkerd.io/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.edx.org/course/introduction-to-service-mesh-with-linkerd" rel="noopener noreferrer"&gt;Course: Introduction to Service Mesh with Linkerd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CNCF - &lt;a href="https://www.cncf.io/" rel="noopener noreferrer"&gt;https://www.cncf.io/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;gRPC - &lt;a href="https://grpc.io/" rel="noopener noreferrer"&gt;https://grpc.io/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Rust - &lt;a href="https://www.rust-lang.org/" rel="noopener noreferrer"&gt;https://www.rust-lang.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Golang - &lt;a href="https://golang.org/" rel="noopener noreferrer"&gt;https://golang.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kinvolk Benchmark - &lt;a href="https://kinvolk.io/blog/2019/05/performance-benchmark-analysis-of-istio-and-linkerd/" rel="noopener noreferrer"&gt;https://kinvolk.io/blog/2019/05/performance-benchmark-analysis-of-istio-and-linkerd/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tokio - &lt;a href="https://tokio.rs/" rel="noopener noreferrer"&gt;https://tokio.rs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hyper - &lt;a href="https://github.com/hyperium/hyper" rel="noopener noreferrer"&gt;https://github.com/hyperium/hyper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;H2 - &lt;a href="https://github.com/hyperium/h2" rel="noopener noreferrer"&gt;https://github.com/hyperium/h2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tower - &lt;a href="https://github.com/tower-rs/tower" rel="noopener noreferrer"&gt;https://github.com/tower-rs/tower&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kafka - &lt;a href="https://kafka.apache.org/intro" rel="noopener noreferrer"&gt;https://kafka.apache.org/intro&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linkerd</category>
      <category>mesh</category>
      <category>kubernetes</category>
      <category>fundamentals</category>
    </item>
    <item>
      <title>Linkerd: Install and Basic Ops</title>
      <dc:creator>Carlos Nogueira</dc:creator>
      <pubDate>Sun, 01 Nov 2020 01:59:27 +0000</pubDate>
      <link>https://dev.to/cedon/linkerd-install-and-basic-ops-2l90</link>
      <guid>https://dev.to/cedon/linkerd-install-and-basic-ops-2l90</guid>
      <description>&lt;p&gt;Linkerd Installation, Basic Operations and My Thoughts About it. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Requirements(Works on Production too)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;GKE or Minikube or kind&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Kubernetes(1.16+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;kubectl(1.16+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Linkerd 2.x&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;1 - Install Linkerd CLI&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- $ curl -sL https://run.linkerd.io/install | sh
- $ export PATH=$PATH:$HOME/.linkerd2/bin
- $ linkerd version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 - Validate Kubernetes Cluster&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- $ linkerd check --pre
OUTPUT:
..
pre-kubernetes-capability
-------------------------
‼ has NET_ADMIN capability
    found 1 PodSecurityPolicies.. 
‼ has NET_RAW capability
    found 1 PodSecurityPolicies..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
(on GKE ignore this warnings. This is because there's no linkerd previously installation and the pods security policies are on. But, dont worry)






&lt;p&gt;3 - Deploy Linkerd&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- $ linkerd install | kubectl apply -f -
- $ linkerd check
- $ kubectl get all -n linkerd 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
(now the linkerd check command must have all green checks output)





&lt;p&gt;4 - Access the Dashboard&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- $ linkerd dashboard
OUTPUT:
Linkerd dashboard available at:
http://localhost:50750
Grafana dashboard available at:
http://localhost:50750/grafana
Opening Linkerd dashboard in the default browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use port-forward to expose the dashboard.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- $ kubectl port-forward --address 127.0.0.1 \
service/linkerd-web 5000:8084 -n linkerd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dashboard is referenced by the linkerd-web service. If you are executing from a bastion, you can define the bastion IP editing the deployment.apps/linkerd-web&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- $ kubectl edit deployment.apps/linkerd-web -n linkerd
# you must edit the address on the arg enforced-host:
# BEFORE EDIT:-enforced-host=^(localhost|127\.0\.0\.1|..
# AFTER  EDIT:-enforced-host=^(bastionhost|192\.168\.0\.9|..

- $ kubectl port-forward --address 0.0.0.0 \
service/linkerd-web 5000:8084 -n linkerd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can open the Dashboard with bastion IP(192.168.0.9 as the example) and port 5000&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq5wu7qdgh4mn0uii7cb1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq5wu7qdgh4mn0uii7cb1.png" alt="Linkerd Dashboard" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With dashboard we can visualize our microservices architecture in selected namespace&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkn5kj195sijqkkue9dp3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkn5kj195sijqkkue9dp3.png" alt="Alt Text" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on the Grafana icon link at the pod line, we can see the pod stats on a template pre-configurated&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftmtkvizcy0qjgoaxjqje.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftmtkvizcy0qjgoaxjqje.png" alt="Alt Text" width="251" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnrb68veiepq17716ck7q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnrb68veiepq17716ck7q.png" alt="Alt Text" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;
Each meshed pod will have a pre-configured Grafana Dashboard.



&lt;p&gt;The Linkerd is a lightweight powerful service mesh plataform, and had the advantage to be strongly decoupled architecture. It can be added and removed without influencing your app.&lt;/p&gt;

&lt;p&gt;Linkerd is unique in that it is part of the Cloud Native Foundation (CNCF), which is the organization responsible for Kubernetes.  &lt;/p&gt;

&lt;p&gt;The CLI had a simple and intuitive user experience.&lt;/p&gt;

&lt;p&gt;You can mesh your deployed microservice with simple commands&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#add with linkerd inject command on a deployed app
- $ kubectl get -n YOUR_APP_NAMESPACE deploy -o yaml \
  | linkerd inject - \
  | kubectl apply -f -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or add few yaml instructions(two config lines on the app deployment yaml)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#example:
annotations:
  checksum/config: 37b064423157b6fe14ddeba6924195c1075bd17feb
  linkerd.io/inject: enabled

#this values are extract from the command
- $ kubectl get -n YOUR_APP_NAMESPACE deploy -o yaml \
  | linkerd inject -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To reverse the mesh on your app do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- $ kubectl get -n YOUR_APP_NAMESPACE deploy -o yaml \
  | linkerd uninject - \
  | kubectl apply -f -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To uninstall Linkerd&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- $ linkerd uninstall | kubectl apply -f -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Linkerd Docs - &lt;a href="https://linkerd.io/docs" rel="noopener noreferrer"&gt;https://linkerd.io/docs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Converting Helm Charts to K8S SDK Templates</title>
      <dc:creator>Carlos Nogueira</dc:creator>
      <pubDate>Fri, 16 Oct 2020 07:37:55 +0000</pubDate>
      <link>https://dev.to/cedon/converting-helm-charts-to-k8s-sdk-templates-3a7e</link>
      <guid>https://dev.to/cedon/converting-helm-charts-to-k8s-sdk-templates-3a7e</guid>
      <description>&lt;p&gt;If you are working on a helm chart, however, you need to make customizations or debug in a more native way. An alternative is to convert it to kubernetes SDK templates. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Requirements&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Kubernetes(1.16+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;helm (3+)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;kubectl(1.16+)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The process is simple:&lt;br&gt;
(mongodb example)&lt;/p&gt;

&lt;p&gt;1 Install desired chart generic release&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- $ kubectl create ns mgodb-ns
- $ helm install mongodb --namespace mgodb-ns stable/mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 Extract default generated chart values from the release&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- $ helm get values mongodb -a --output yaml &amp;gt; values.yaml 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3 Convert the chart to template&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- $ helm template --values ./values.yaml --output-dir \
./manifests stable/mongodb

OUTPUT: 
wrote ./manifests/mongodb/templates/secrets.yaml
wrote ./manifests/mongodb/templates/pvc-standalone.yaml
wrote ./manifests/mongodb/templates/svc-standalone.yaml
wrote ./manifests/mongodb/templates/deployment-standalone.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can work on native SDK k8s yamls at the directory manifests/mongodb/templates/&lt;/p&gt;

&lt;p&gt;4 Don't forget to delete the generic release&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- $ helm uninstall mongodb
- $ kubectl delete ns mgodb-ns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Deploy BigchainDB using Docker Compose</title>
      <dc:creator>Carlos Nogueira</dc:creator>
      <pubDate>Sun, 20 Oct 2019 21:37:35 +0000</pubDate>
      <link>https://dev.to/cedon/deploy-bigchaindb-using-docker-compose-4ig7</link>
      <guid>https://dev.to/cedon/deploy-bigchaindb-using-docker-compose-4ig7</guid>
      <description>&lt;p&gt;BigchainDB is a "blockchain database"..&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;..With high throughput, low latency, powerful query functionality, decentralized control, immutable data storage and built-in asset support, BigchainDB is like a database with blockchain characteristics.&lt;/em&gt;(bigchaindb.com)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's a good choice for who wants to work with immutable databases.&lt;/p&gt;

&lt;p&gt;Here's a tutorial to deploy a local infrastructure docker based.&lt;br&gt;
(I'm using Debian Buster, but the project recommends latests Ubuntu and CentOS)&lt;/p&gt;
&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Docker(19.03+)&lt;/li&gt;
&lt;li&gt;Docker-Compose (2.0+)&lt;/li&gt;
&lt;li&gt;python3.6+&lt;/li&gt;
&lt;li&gt;pip3+ &lt;/li&gt;
&lt;li&gt;bigchaindb_driver(for the tests, install via pip3)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Clone Repo
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git clone https://github.com/bigchaindb/bigchaindb.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;

&lt;p&gt;Bigchaindb Dependences&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo bash bigchaindb/pkg/scripts/bootstrap.sh --operation install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy Docker Compose&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker-compose -f bigchaindb/docker-compose.yaml up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check Containers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                    PORTS                                                        NAMES
6b9dcd4f524d        bigchaindb_bigchaindb           ".ci/entrypoint.sh"      32 minutes ago      Up 32 minutes (healthy)   0.0.0.0:9984-9985-&amp;gt;9984-9985/tcp, 0.0.0.0:32770-&amp;gt;26658/tcp   bigchaindb_bigchaindb_1
4b4c08cc3680        tendermint/tendermint:v0.31.5   "sh -c 'tendermint i…"   33 minutes ago      Up 32 minutes             0.0.0.0:26656-26657-&amp;gt;26656-26657/tcp                         bigchaindb_tendermint_1
443b20abbb7d        mongo:3.6                       "docker-entrypoint.s…"   33 minutes ago      Up 32 minutes             0.0.0.0:27017-&amp;gt;27017/tcp                                     bigchaindb_mongodb_1
3afee461139c        nginx                           "nginx -g 'daemon of…"   33 minutes ago      Up 32 minutes             0.0.0.0:33333-&amp;gt;80/tcp                                        bigchaindb_vdocs_1

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testing db
&lt;/h3&gt;

&lt;p&gt;Create &lt;em&gt;testdb.py&lt;/em&gt; to test your installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from bigchaindb_driver import BigchainDB
from bigchaindb_driver.crypto import generate_keypair
from time import sleep
from sys import exit

alice, bob = generate_keypair(), generate_keypair()

bdb_root_url = 'http://localhost:9984'  # Use YOUR BigchainDB Root URL here

bdb = BigchainDB(bdb_root_url)

bicycle_asset = {
    'data': {
        'bicycle': {
            'serial_number': 'abcd1234',
            'manufacturer': 'bkfab'
        },
    },
}

bicycle_asset_metadata = {
    'planet': 'earth'
}

prepared_creation_tx = bdb.transactions.prepare(
    operation='CREATE',
    signers=alice.public_key,
    asset=bicycle_asset,
    metadata=bicycle_asset_metadata
)

fulfilled_creation_tx = bdb.transactions.fulfill(
    prepared_creation_tx,
    private_keys=alice.private_key
)

sent_creation_tx = bdb.transactions.send_commit(fulfilled_creation_tx)

txid = fulfilled_creation_tx['id']

asset_id = txid

transfer_asset = {
    'id': asset_id
}

output_index = 0
output = fulfilled_creation_tx['outputs'][output_index]

transfer_input = {
    'fulfillment': output['condition']['details'],
    'fulfills': {
        'output_index': output_index,
        'transaction_id': fulfilled_creation_tx['id']
    },
    'owners_before': output['public_keys']
}

prepared_transfer_tx = bdb.transactions.prepare(
    operation='TRANSFER',
    asset=transfer_asset,
    inputs=transfer_input,
    recipients=bob.public_key,
)

fulfilled_transfer_tx = bdb.transactions.fulfill(
    prepared_transfer_tx,
    private_keys=alice.private_key,
)

sent_transfer_tx = bdb.transactions.send_commit(fulfilled_transfer_tx)

print("Is Bob the owner?",
    sent_transfer_tx['outputs'][0]['public_keys'][0] == bob.public_key)

print("Was Alice the previous owner?",
    fulfilled_transfer_tx['inputs'][0]['owners_before'][0] == alice.public_key)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Execute Test Script
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   $ python3 testdb.py 
   [out]Is Bob the owner? True
   [out]Was Alice the previous owner? True
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;Bigchaindb Docs - &lt;a href="http://docs.bigchaindb.com/" rel="noopener noreferrer"&gt;http://docs.bigchaindb.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bigchaindb</category>
      <category>blockchain</category>
      <category>mongodb</category>
      <category>docker</category>
    </item>
    <item>
      <title>Deploying A Private Storage Cloud (SeaFile) Using Docker</title>
      <dc:creator>Carlos Nogueira</dc:creator>
      <pubDate>Fri, 18 Oct 2019 13:04:14 +0000</pubDate>
      <link>https://dev.to/cedon/deploying-a-private-storage-cloud-seafile-using-docker-56gk</link>
      <guid>https://dev.to/cedon/deploying-a-private-storage-cloud-seafile-using-docker-56gk</guid>
      <description>&lt;p&gt;Seafile...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;..is an open source file sync&amp;amp;share solution designed for high reliability, performance and productivity. Sync, share and collaborate across devices and teams.&lt;/em&gt;(SeaFile.com)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here we have a powerful suite: service, desktop/mobile clients, cli and web interface. A good private alternative to public clouds. &lt;/p&gt;

&lt;p&gt;Features includes storage, sharing, security and LDAP integration.&lt;/p&gt;

&lt;p&gt;Here's a video &lt;a href="https://www.youtube.com/watch?v=CdP_MTWBnE4" rel="noopener noreferrer"&gt;review&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Compose
&lt;/h2&gt;

&lt;p&gt;For this configuration the host just need allow services using the web ports(80,443).&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://gitlab.com/cedon/seafile/blob/master/docker-compose.yaml" rel="noopener noreferrer"&gt;docker compose&lt;/a&gt; sets 3 containers: mariadb, memcached and seafile. &lt;/p&gt;

&lt;p&gt;The seafile container responds to the service. It have a proxy nginx redirecting que request to internal service listen at port 8000. &lt;/p&gt;

&lt;h3&gt;
  
  
  Let's Encrypt
&lt;/h3&gt;

&lt;p&gt;To use Let's Encrypt, you must set this parameters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ports:
      ...
      - "443:443" 
      ...
    environment:
      ...
      - SEAFILE_SERVER_LETSENCRYPT=true 
      - SEAFILE_SERVER_HOSTNAME=your.domain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The domain &lt;em&gt;your.domain.com&lt;/em&gt; must be valid and internet reachable, or the LetsEncrypt handshakes wont work. &lt;/p&gt;

&lt;h3&gt;
  
  
  MariaDB Connection and SeaFile Authentication
&lt;/h3&gt;

&lt;p&gt;You must check the database connection. &lt;/p&gt;

&lt;p&gt;Change the value &lt;em&gt;db_secret&lt;/em&gt; for your mysql connection password. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;MYSQL_ROOT_PASSWORD=db_secret&lt;/em&gt; must be the same value  of &lt;em&gt;DB_ROOT_PASSWD=db_secret&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DB_HOST=db&lt;/em&gt; must be the same of the mariadb service name &lt;em&gt;db&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  db:
   ...
    environment:
      - MYSQL_ROOT_PASSWORD=db_secret 
  seafile:
  ...
    environment:
      - DB_HOST=db
      - DB_ROOT_PASSWD=db_secret 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SeaFile Authentication uses e-mail as login name. &lt;/p&gt;

&lt;p&gt;Change the value &lt;em&gt;a_secret&lt;/em&gt; for your admin password.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  ... 
  seafile:
  ...
    environment:
     - SEAFILE_ADMIN_EMAIL=me@example.com
     - SEAFILE_ADMIN_PASSWORD=a_secret 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Deploy SeaFile
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Docker(19.03+)&lt;/li&gt;
&lt;li&gt;Docker-Compose (2.0+)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deploy:
&lt;/h3&gt;

&lt;p&gt;clone repository&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://gitlab.com/cedon/seafile.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;here two ways to deploy:&lt;/p&gt;

&lt;p&gt;1.official seafile sample docker-compose.yaml file.&lt;/p&gt;

&lt;p&gt;1.1. edit compose file seafile/&lt;a href="https://gitlab.com/cedon/seafile/blob/master/docker-compose.yaml" rel="noopener noreferrer"&gt;docker-compose.yml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1.2. deploy infrastructure&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose -f seafile/docker-compose.yaml up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;2.setting the parameters on &lt;a href="https://docs.docker.com/compose/compose-file/#env_file" rel="noopener noreferrer"&gt;.env files&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;2.1. set the environment parameters on files: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mariadb:&lt;a href="https://gitlab.com/cedon/seafile/blob/master/env/db.env" rel="noopener noreferrer"&gt;env/db.env&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;seafile:&lt;a href="https://gitlab.com/cedon/seafile/blob/master/env/seafile.env" rel="noopener noreferrer"&gt;env/seafile.env&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2.2. deploy infrastructure&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose -f seafile/docker-compose.sec.yaml up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Setting Up the service
&lt;/h2&gt;

&lt;p&gt;After the deploy, you must access System Admin &amp;gt; Settings&lt;/p&gt;

&lt;p&gt;Set the Service URL: &lt;code&gt;http://your.domain.com:8000&lt;/code&gt;&lt;br&gt;
Set the File Server Root: &lt;code&gt;http://your.domain.com/seafhttp&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;SeaFile Project - &lt;a href="http://www.seafile.com" rel="noopener noreferrer"&gt;www.seafile.com&lt;/a&gt;&lt;br&gt;
Cedon's SeaFile Example Repository - &lt;a href="//gitlab.com/cedon/seafile"&gt;gitlab.com/cedon/seafile&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>seafile</category>
      <category>storage</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Autoscaling Group With AWS Elastic Load Balancing</title>
      <dc:creator>Carlos Nogueira</dc:creator>
      <pubDate>Fri, 18 Oct 2019 00:09:56 +0000</pubDate>
      <link>https://dev.to/cedon/autoscaling-group-with-aws-elastic-load-balancing-4pl1</link>
      <guid>https://dev.to/cedon/autoscaling-group-with-aws-elastic-load-balancing-4pl1</guid>
      <description>&lt;p&gt;If you want to deploy an Autoscaling EC2 infrastructure on AWS using ELB, you'll need to follow this steps: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Launch EC2 Instance

&lt;ul&gt;
&lt;li&gt;EC2 Dashboard &amp;gt; Launch Instance&lt;/li&gt;
&lt;li&gt;Configure your web app&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Transform into AMI

&lt;ul&gt;
&lt;li&gt;Select Instance &amp;gt; Action &amp;gt; Image &amp;gt; Create Image&lt;/li&gt;
&lt;li&gt;Instance &amp;gt; Delete EC2 Instantes&lt;/li&gt;
&lt;li&gt;Delete Security Group created with the Instance&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Deploy AMI across different zones

&lt;ul&gt;
&lt;li&gt;Load Balancer &amp;gt; Create Load Balancer &amp;gt; Application Load Balancer&lt;/li&gt;
&lt;li&gt;Select Zones&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Configure Secure Groups

&lt;ul&gt;
&lt;li&gt;Create New Secure Group&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Configure Target Groups

&lt;ul&gt;
&lt;li&gt;Define a Target Group name&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Launch Configurations

&lt;ul&gt;
&lt;li&gt;Choose the AMI created early&lt;/li&gt;
&lt;li&gt;Define Launch Configuration name&lt;/li&gt;
&lt;li&gt;Allow traffic just to the Load Balancer Security Group&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Configure the Autoscaling Group

&lt;ul&gt;
&lt;li&gt;Autoscaling Group &amp;gt; Create Autoscaling Group&lt;/li&gt;
&lt;li&gt;Define Name&lt;/li&gt;
&lt;li&gt;Group Size&lt;/li&gt;
&lt;li&gt;Choose the subnets&lt;/li&gt;
&lt;li&gt;Choose Target Groups&lt;/li&gt;
&lt;li&gt;Health Check Type: ELB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Define the Scaling Policies

&lt;ul&gt;
&lt;li&gt;Create Increase and Decrease Alarms&lt;/li&gt;
&lt;li&gt;Set Notifications&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Autoscaling Group will launch the AMI instances based on the Increase/Decrease alarms and the minimal requirements. &lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;Elastic Load Balancing - &lt;a href="https://aws.amazon.com/elasticloadbalancing/" rel="noopener noreferrer"&gt;https://aws.amazon.com/elasticloadbalancing/&lt;/a&gt;&lt;br&gt;
Elastic Compute Cloud - &lt;a href="https://aws.amazon.com/ec2/" rel="noopener noreferrer"&gt;https://aws.amazon.com/ec2/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>elb</category>
      <category>loadbalacing</category>
    </item>
  </channel>
</rss>
