<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>digital ocean | Webmago Dev</title>
	<atom:link href="https://webmago.dev/category/digital-ocean/feed/" rel="self" type="application/rss+xml" />
	<link>https://webmago.dev</link>
	<description>Creando codigo desde 1990</description>
	<lastBuildDate>Thu, 03 Jul 2025 13:09:56 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Infrastructure as Code con Pulumi: Mejores Prácticas para DevOps y Startups SaaS</title>
		<link>https://webmago.dev/infrastructure-as-code-con-pulumi-mejores-practicas-para-devops-y-startups-saas/</link>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Thu, 03 Jul 2025 13:09:56 +0000</pubDate>
				<category><![CDATA[devops]]></category>
		<category><![CDATA[digital ocean]]></category>
		<category><![CDATA[gcp]]></category>
		<category><![CDATA[pulumi]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[IaC]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=5921</guid>
					<description><![CDATA[<p>En el mundo moderno de la infraestructura cloud, Infrastructure as Code (IaC) se ha convertido en un pilar fundamental para equipos de DevOps, ingenieros de infraestructura y startups SaaS. Entre las herramientas disponibles, Pulumi destaca por su flexibilidad, soporte multi-cloud y capacidad de utilizar lenguajes de programación tradicionales como Python, TypeScript y Go. En este artículo, exploraremos las mejores prácticas [&#8230;]</p>
The post <a href="https://webmago.dev/infrastructure-as-code-con-pulumi-mejores-practicas-para-devops-y-startups-saas/">Infrastructure as Code con Pulumi: Mejores Prácticas para DevOps y Startups SaaS</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<p class="ds-markdown-paragraph">En el mundo moderno de la infraestructura cloud, <strong>Infrastructure as Code (IaC)</strong> se ha convertido en un pilar fundamental para equipos de DevOps, ingenieros de infraestructura y startups SaaS. Entre las herramientas disponibles, <strong>Pulumi</strong> destaca por su flexibilidad, soporte multi-cloud y capacidad de utilizar lenguajes de programación tradicionales como Python, TypeScript y Go.</p>
<p class="ds-markdown-paragraph">En este artículo, exploraremos las <strong>mejores prácticas para implementar IaC con Pulumi</strong>, con ejemplos prácticos en <strong>GCP, AWS y DigitalOcean</strong>, estrategias avanzadas para <strong>Kubernetes</strong> y consideraciones clave en <strong>Disaster Recovery Planning (DRP)</strong>.</p>
<hr />
<h2><strong>1. ¿Por qué Pulumi para IaC?</strong></h2>
<p class="ds-markdown-paragraph">Pulumi ofrece ventajas únicas frente a alternativas como Terraform o CloudFormation:</p>
<p class="ds-markdown-paragraph">✅ <strong>Lenguajes familiares</strong> (Python, TypeScript, Go) en lugar de DSLs propietarios.<br />
✅ <strong>Soporte multi-cloud</strong> (AWS, GCP, Azure, DigitalOcean, Kubernetes).<br />
✅ <strong>Estado de infraestructura gestionado</strong> (Pulumi Service, S3, etc.).<br />
✅ <strong>Integración con CI/CD</strong> nativa.<br />
✅ <strong>Reutilización de código</strong> mediante componentes y librerías.</p>
<h3><strong>Ejemplo: Desplegando un cluster Kubernetes en DigitalOcean con Pulumi (Python)</strong></h3>
<pre><code class="language-python">import pulumi
import pulumi_digitalocean as do
# Crear un cluster Kubernetes en DigitalOcean
cluster = do.KubernetesCluster(
    &quot;saas-cluster&quot;,
    region=&quot;nyc1&quot;,
    version=&quot;1.25.4-do.0&quot;,
    node_pool={
        &quot;name&quot;: &quot;default-pool&quot;,
        &quot;size&quot;: &quot;s-2vcpu-4gb&quot;,
        &quot;node_count&quot;: 3,
    }
)
# Exportar el kubeconfig
pulumi.export(&quot;kubeconfig&quot;, cluster.kube_configs[0].raw_config)</code>

</pre>
<p class="ds-markdown-paragraph">Este código despliega un cluster gestionado en DigitalOcean con tres nodos, listo para integrarse en un pipeline de CI/CD.</p>
<hr />
<h2><strong>2. Mejores Prácticas para IaC con Pulumi</strong></h2>
<h3><strong>🔹 Modularización y Reutilización</strong></h3>
<p class="ds-markdown-paragraph">Evitar scripts monolíticos. En su lugar, estructurar el código en <strong>componentes reutilizables</strong>:</p>
<pre><code class="language-python"># Ejemplo: Módulo para un bucket S3 con políticas de acceso
class SecureBucket(pulumi.ComponentResource):
    def __init__(self, name, **kwargs):
        super().__init__(&quot;custom:SecureBucket&quot;, name, **kwargs)
        
        self.bucket = aws.s3.Bucket(name)
        aws.s3.BucketPolicy(
            f&quot;{name}-policy&quot;,
            bucket=self.bucket.id,
            policy=json.dumps({
                &quot;Version&quot;: &quot;2012-10-17&quot;,
                &quot;Statement&quot;: [{
                    &quot;Effect&quot;: &quot;Deny&quot;,
                    &quot;Principal&quot;: &quot;*&quot;,
                    &quot;Action&quot;: &quot;s3:*&quot;,
                    &quot;Resource&quot;: [self.bucket.arn, f&quot;{self.bucket.arn}/*&quot;],
                    &quot;Condition&quot;: {&quot;Bool&quot;: {&quot;aws:SecureTransport&quot;: False}}
                }]
            })
        )
# Uso del módulo
bucket = SecureBucket(&quot;prod-data-lake&quot;)</code></pre>
<p>&nbsp;</p>
<h3><strong>🔹 Gestión de Estado (State Management)</strong></h3>
<p class="ds-markdown-paragraph">Pulumi guarda el estado de la infraestructura. Opciones recomendadas:</p>
<ul>
<li>
<p class="ds-markdown-paragraph"><strong>Pulumi Service</strong> (gratis para proyectos pequeños).</p>
</li>
<li>
<p class="ds-markdown-paragraph"><strong>Amazon S3 / Google Cloud Storage</strong> (para mayor control).</p>
</li>
</ul>
<p>&nbsp;</p>
<pre><code class="language-bash"># Inicializar un proyecto con backend en S3
pulumi login s3://my-pulumi-state-bucket</code></pre>
<h3><strong>🔹 CI/CD Integrado</strong></h3>
<p class="ds-markdown-paragraph">Ejemplo con GitHub Actions:</p>
<pre><code class="language-bash">name: Deploy Infrastructure
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: pulumi/actions@v3
        with:
          command: up
          stack-name: prod
        env:
          PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}</code></pre>
<p>&nbsp;</p>
<h2><strong>3. Kubernetes con Pulumi: Gestión Eficiente</strong></h2>
<p class="ds-markdown-paragraph">Pulumi permite gestionar <strong>Kubernetes de forma declarativa</strong> sin necesidad de <code>kubectl</code> manual.</p>
<h3><strong>Ejemplo: Despliegue de una App en Kubernetes</strong></h3>
<pre><code class="language-python">import pulumi_kubernetes as k8s
# Crear un Namespace
app_ns = k8s.core.v1.Namespace(&quot;app-ns&quot;)
# Desplegar una aplicación
app = k8s.apps.v1.Deployment(
    &quot;app-deployment&quot;,
    metadata={&quot;namespace&quot;: app_ns.metadata[&quot;name&quot;]},
    spec={
        &quot;replicas&quot;: 3,
        &quot;selector&quot;: {&quot;match_labels&quot;: {&quot;app&quot;: &quot;my-saas&quot;}},
        &quot;template&quot;: {
            &quot;metadata&quot;: {&quot;labels&quot;: {&quot;app&quot;: &quot;my-saas&quot;}},
            &quot;spec&quot;: {
                &quot;containers&quot;: [{
                    &quot;name&quot;: &quot;app&quot;,
                    &quot;image&quot;: &quot;my-registry/my-saas-app:latest&quot;,
                    &quot;ports&quot;: [{&quot;container_port&quot;: 8080}]
                }]
            }
        }
    }
)
# Exponer el servicio
service = k8s.core.v1.Service(
    &quot;app-service&quot;,
    metadata={&quot;namespace&quot;: app_ns.metadata[&quot;name&quot;]},
    spec={
        &quot;selector&quot;: {&quot;app&quot;: &quot;my-saas&quot;},
        &quot;ports&quot;: [{&quot;port&quot;: 80, &quot;target_port&quot;: 8080}],
        &quot;type&quot;: &quot;LoadBalancer&quot;
    }
)
pulumi.export(&quot;service_url&quot;, service.status[&quot;load_balancer&quot;][&quot;ingress&quot;][0][&quot;hostname&quot;])</code></pre>
<p>&nbsp;</p>
<hr />
<h2><strong>4. Disaster Recovery Planning (DRP) con Pulumi</strong></h2>
<p class="ds-markdown-paragraph">Un buen DRP define <strong>RTO (Recovery Time Objective)</strong> y <strong>RPO (Recovery Point Objective)</strong>.</p>
<h3><strong>Visualización de RTO/RPO</strong></h3>
<p class="ds-markdown-paragraph">(Imagen conceptual: Tabla comparando estrategias de backup y replicación)</p>
<div class="markdown-table-wrapper">
<table>
<thead>
<tr>
<th>Estrategia</th>
<th>RTO (Tiempo de recuperación)</th>
<th>RPO (Pérdida de datos máxima)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Backup Diario</td>
<td>Horas</td>
<td>24 horas</td>
</tr>
<tr>
<td>Replicación en Caliente</td>
<td>Minutos</td>
<td>Segundos</td>
</tr>
<tr>
<td>Multi-Región AWS</td>
<td>Minutos</td>
<td>Casi cero</td>
</tr>
</tbody>
</table>
</div>
<h3><strong>Ejemplo: Configuración de DRP en AWS</strong></h3>
<pre><code class="language-python">import pulumi_aws as aws
# Replicación de buckets S3 entre regiones
primary_bucket = aws.s3.Bucket(&quot;primary-bucket&quot;, acl=&quot;private&quot;)
replica_bucket = aws.s3.Bucket(&quot;replica-bucket&quot;, acl=&quot;private&quot;)
aws.s3.BucketReplication(
    &quot;replication&quot;,
    bucket=primary_bucket.id,
    role=replication_role.arn,
    rules=[{
        &quot;status&quot;: &quot;Enabled&quot;,
        &quot;destination&quot;: {
            &quot;bucket&quot;: replica_bucket.arn,
            &quot;storage_class&quot;: &quot;STANDARD&quot;
        }
    }]
)</code></pre>
<h2><strong>5. Conclusión</strong></h2>
<p class="ds-markdown-paragraph">Pulumi es una herramienta poderosa para <strong>automatizar infraestructura cloud</strong> con código real, mejorando la productividad de equipos DevOps y startups SaaS.</p>
<p class="ds-markdown-paragraph">🔹 <strong>Mejores prácticas clave:</strong></p>
<ul>
<li>
<p class="ds-markdown-paragraph">Modularizar el código IaC.</p>
</li>
<li>
<p class="ds-markdown-paragraph">Gestionar el estado de forma segura.</p>
</li>
<li>
<p class="ds-markdown-paragraph">Integrar con CI/CD.</p>
</li>
<li>
<p class="ds-markdown-paragraph">Planificar Disaster Recovery (RTO/RPO).</p>
</li>
</ul>
<p class="ds-markdown-paragraph">¿Listo para probar Pulumi? Comienza con su <a href="https://www.pulumi.com/docs/" target="_blank" rel="noopener noreferrer">documentación oficial</a>.</p>
<hr />
<p class="ds-markdown-paragraph">📢 <strong>¿Quieres más detalles sobre algún tema?</strong> ¡<a title="Contactame" href="https://webmago.dev/#contact" target="_blank" rel="noopener">Contactame</a>!</p>
<p class="ds-markdown-paragraph">#DevOps #InfrastructureAsCode #Pulumi #Kubernetes #CloudComputing #SaaS #DisasterRecovery</p>
<p>&nbsp;</p>The post <a href="https://webmago.dev/infrastructure-as-code-con-pulumi-mejores-practicas-para-devops-y-startups-saas/">Infrastructure as Code con Pulumi: Mejores Prácticas para DevOps y Startups SaaS</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>GitOps con Digital Ocean, Pulumi y ArgoCD</title>
		<link>https://webmago.dev/gitops-con-digital-ocean-pulumi-y-argocd/</link>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Wed, 10 Mar 2021 02:20:41 +0000</pubDate>
				<category><![CDATA[digital ocean]]></category>
		<category><![CDATA[gitops]]></category>
		<category><![CDATA[infraestructura]]></category>
		<category><![CDATA[kubernetes]]></category>
		<category><![CDATA[pulumi]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=796</guid>
					<description><![CDATA[<p>Gitops es un nuevo termino que vendrá a replantear lo que ya conocemos como DevOps, con Gitops la única fuente de verdad será el repositorio en donde reside el código. &#160; Recientemente hemos estado haciendo PoC´s con Pulumi y Digital Ocean así que metimos a un tercero a la ecuación, ArgoCD, una herramienta de Delivery [&#8230;]</p>
The post <a href="https://webmago.dev/gitops-con-digital-ocean-pulumi-y-argocd/">GitOps con Digital Ocean, Pulumi y ArgoCD</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<p>Gitops es un nuevo termino que vendrá a replantear lo que ya conocemos como DevOps, con Gitops la única fuente de verdad será el repositorio en donde reside el código.</p>
<p>&nbsp;</p>
<p>Recientemente hemos estado haciendo PoC´s con <a title="Pulumi" href="https://pulumi.com" target="_blank" rel="noopener noreferrer">Pulumi</a> y <a title="Digital Ocean" href="https://digitalocean.com" target="_blank" rel="noopener noreferrer">Digital Ocean</a> así que metimos a un tercero a la ecuación, <a href="https://argoproj.github.io/argo-cd/">ArgoCD</a>, una herramienta de Delivery para Kubernetes.</p>
<p>&nbsp;</p>
<p>A partir del <a title="Pulumi (IaC) con Digital Ocean" href="https://webmago.dev/pulumi-iac-con-digital-ocean/" target="_blank" rel="noopener noreferrer">PoC</a> hecho con Pulumi y Digital Ocean instalamos ArgoCD en el cluster de Kubernetes creado y vinculamos un único repositorio con dos ramas, <strong><em>master</em></strong> y <em><strong>feature/python-simple-web</strong></em> para dos apps diferentes <strong><em>mypage</em></strong> y <strong><em>simple-web </em></strong>en ArgoCD, lo que hace difiere estas dos ramas son el namespace del proyecto, la imagen del contenedor y la url que <strong>nginx-ingress</strong> deberá administrar.</p>
<p>&nbsp;</p>
<p>Esta nueva herramienta después de hacer todos los ajustes se vuelve divertida y amigable, como primer acercamiento puedo decir que tiene una agradable interface gráfica y que me hace pensar si dejaremos fuera a Pulumi para administrar el estatus deseado de los recursos creados previamente como <em>deployments</em>/<em>services</em>/<em>ingress</em>/<em>configMaps</em> etc, en el cluster.</p>
<p>&nbsp;</p>
<p>A continuación les dejo unas capturas del PoC.</p>
<div id="attachment_802" style="width: 1034px" class="wp-caption aligncenter"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-802" class="size-large wp-image-802" src="https://webmago.dev/buvytsan/2021/03/01-repo-branches-1024x307.png" alt="Branches Repositorio Git" width="1024" height="307" srcset="https://webmago.dev/buvytsan/2021/03/01-repo-branches-1024x307.png 1024w, https://webmago.dev/buvytsan/2021/03/01-repo-branches-300x90.png 300w, https://webmago.dev/buvytsan/2021/03/01-repo-branches-768x230.png 768w, https://webmago.dev/buvytsan/2021/03/01-repo-branches-1536x460.png 1536w, https://webmago.dev/buvytsan/2021/03/01-repo-branches-2048x614.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-802" class="wp-caption-text">Branches Repositorio Git</p></div>
<p>&nbsp;</p>
<div id="attachment_803" style="width: 1034px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-803" class="size-large wp-image-803" src="https://webmago.dev/buvytsan/2021/03/02-argocd-apps-dashboard-1024x602.png" alt="ArgoCD Dashboard Applications" width="1024" height="602" srcset="https://webmago.dev/buvytsan/2021/03/02-argocd-apps-dashboard-1024x602.png 1024w, https://webmago.dev/buvytsan/2021/03/02-argocd-apps-dashboard-300x176.png 300w, https://webmago.dev/buvytsan/2021/03/02-argocd-apps-dashboard-768x451.png 768w, https://webmago.dev/buvytsan/2021/03/02-argocd-apps-dashboard-1536x902.png 1536w, https://webmago.dev/buvytsan/2021/03/02-argocd-apps-dashboard-2048x1203.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-803" class="wp-caption-text">ArgoCD Dashboard Applications</p></div>
<p>&nbsp;</p>
<div id="attachment_805" style="width: 1034px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-805" class="size-large wp-image-805" src="https://webmago.dev/buvytsan/2021/03/04-argocd-app-01-view2-1024x446.png" alt="ArgoCD vista de red del app &quot;mypage&quot;" width="1024" height="446" srcset="https://webmago.dev/buvytsan/2021/03/04-argocd-app-01-view2-1024x446.png 1024w, https://webmago.dev/buvytsan/2021/03/04-argocd-app-01-view2-300x131.png 300w, https://webmago.dev/buvytsan/2021/03/04-argocd-app-01-view2-768x334.png 768w, https://webmago.dev/buvytsan/2021/03/04-argocd-app-01-view2-1536x668.png 1536w, https://webmago.dev/buvytsan/2021/03/04-argocd-app-01-view2-2048x891.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-805" class="wp-caption-text">ArgoCD vista de red del app &#8220;mypage&#8221;</p></div>
<p>&nbsp;</p>
<div id="attachment_804" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-804" class="size-large wp-image-804" src="https://webmago.dev/buvytsan/2021/03/03-argocd-app-01-view1-1024x575.png" alt="ArgoCD vista de arbol del app &quot;mypage&quot;" width="1024" height="575" srcset="https://webmago.dev/buvytsan/2021/03/03-argocd-app-01-view1-1024x575.png 1024w, https://webmago.dev/buvytsan/2021/03/03-argocd-app-01-view1-300x169.png 300w, https://webmago.dev/buvytsan/2021/03/03-argocd-app-01-view1-768x432.png 768w, https://webmago.dev/buvytsan/2021/03/03-argocd-app-01-view1-1536x863.png 1536w, https://webmago.dev/buvytsan/2021/03/03-argocd-app-01-view1-2048x1151.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-804" class="wp-caption-text">ArgoCD vista de arbol del app &#8220;mypage&#8221;</p></div>
<p>&nbsp;</p>
<div id="attachment_807" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-807" class="size-large wp-image-807" src="https://webmago.dev/buvytsan/2021/03/05-argocd-app-02-view2-1024x420.png" alt="ArgoCD vista de red del app &quot;simple'web&quot;" width="1024" height="420" srcset="https://webmago.dev/buvytsan/2021/03/05-argocd-app-02-view2-1024x420.png 1024w, https://webmago.dev/buvytsan/2021/03/05-argocd-app-02-view2-300x123.png 300w, https://webmago.dev/buvytsan/2021/03/05-argocd-app-02-view2-768x315.png 768w, https://webmago.dev/buvytsan/2021/03/05-argocd-app-02-view2-1536x630.png 1536w, https://webmago.dev/buvytsan/2021/03/05-argocd-app-02-view2-2048x840.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-807" class="wp-caption-text">ArgoCD vista de red del app &#8220;simple-web&#8221;</p></div>
<p>&nbsp;</p>
<div id="attachment_806" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-806" class="size-large wp-image-806" src="https://webmago.dev/buvytsan/2021/03/05-argocd-app-02-view1-1024x527.png" alt="ArgoCD vista de arbol del app &quot;simple'web&quot;" width="1024" height="527" srcset="https://webmago.dev/buvytsan/2021/03/05-argocd-app-02-view1-1024x527.png 1024w, https://webmago.dev/buvytsan/2021/03/05-argocd-app-02-view1-300x154.png 300w, https://webmago.dev/buvytsan/2021/03/05-argocd-app-02-view1-768x396.png 768w, https://webmago.dev/buvytsan/2021/03/05-argocd-app-02-view1-1536x791.png 1536w, https://webmago.dev/buvytsan/2021/03/05-argocd-app-02-view1-2048x1055.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-806" class="wp-caption-text">ArgoCD vista de arbol del app &#8220;simple-web&#8221;</p></div>
<p>&nbsp;</p>
<div id="attachment_808" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-808" class="size-large wp-image-808" src="https://webmago.dev/buvytsan/2021/03/06-app-01-liveview-1024x360.png" alt="Vista en vivo de app &quot;mypage&quot;" width="1024" height="360" srcset="https://webmago.dev/buvytsan/2021/03/06-app-01-liveview-1024x360.png 1024w, https://webmago.dev/buvytsan/2021/03/06-app-01-liveview-300x105.png 300w, https://webmago.dev/buvytsan/2021/03/06-app-01-liveview-768x270.png 768w, https://webmago.dev/buvytsan/2021/03/06-app-01-liveview-1536x540.png 1536w, https://webmago.dev/buvytsan/2021/03/06-app-01-liveview-2048x720.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-808" class="wp-caption-text">Vista en vivo de app &#8220;mypage&#8221;</p></div>
<p>&nbsp;</p>
<div id="attachment_810" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-810" class="size-large wp-image-810" src="https://webmago.dev/buvytsan/2021/03/07-app-02-liveview-nodo2-1024x196.png" alt="Vista en vivo de app &quot;simple'web&quot; balance pod 2" width="1024" height="196" srcset="https://webmago.dev/buvytsan/2021/03/07-app-02-liveview-nodo2-1024x196.png 1024w, https://webmago.dev/buvytsan/2021/03/07-app-02-liveview-nodo2-300x57.png 300w, https://webmago.dev/buvytsan/2021/03/07-app-02-liveview-nodo2-768x147.png 768w, https://webmago.dev/buvytsan/2021/03/07-app-02-liveview-nodo2-1536x294.png 1536w, https://webmago.dev/buvytsan/2021/03/07-app-02-liveview-nodo2-2048x391.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-810" class="wp-caption-text">Vista en vivo de app &#8220;simple&#8217;web&#8221; balance pod 2</p></div>
<p>&nbsp;</p>
<div id="attachment_809" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-809" class="size-large wp-image-809" src="https://webmago.dev/buvytsan/2021/03/07-app-02-liveview-nodo1-1024x225.png" alt="Vista en vivo de app &quot;simple'web&quot; balance pod 1" width="1024" height="225" srcset="https://webmago.dev/buvytsan/2021/03/07-app-02-liveview-nodo1-1024x225.png 1024w, https://webmago.dev/buvytsan/2021/03/07-app-02-liveview-nodo1-300x66.png 300w, https://webmago.dev/buvytsan/2021/03/07-app-02-liveview-nodo1-768x169.png 768w, https://webmago.dev/buvytsan/2021/03/07-app-02-liveview-nodo1-1536x338.png 1536w, https://webmago.dev/buvytsan/2021/03/07-app-02-liveview-nodo1-2048x451.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-809" class="wp-caption-text">Vista en vivo de app &#8220;simple&#8217;web&#8221; balance pod 1</p></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Si requieres de mi ayuda para administrar tu infraestructura e implementar un sistema GitOps <a href="https://webmago.dev/#contact">contáctame</a>.</p>
<div class="mceTemp"></div>The post <a href="https://webmago.dev/gitops-con-digital-ocean-pulumi-y-argocd/">GitOps con Digital Ocean, Pulumi y ArgoCD</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Administrando Droplets con Pulumi</title>
		<link>https://webmago.dev/administrando-droplets-con-pulumi/</link>
		
		<dc:creator><![CDATA[webmago]]></dc:creator>
		<pubDate>Fri, 05 Mar 2021 16:41:44 +0000</pubDate>
				<category><![CDATA[development]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[digital ocean]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[infraestructura]]></category>
		<category><![CDATA[pulumi]]></category>
		<category><![CDATA[IaC]]></category>
		<guid isPermaLink="false">https://webmago.dev/?p=788</guid>
					<description><![CDATA[<p>Un Droplet es el nombre que Digital Ocean le da a sus maquinas virtuales, es muy probable que algunas aplicaciones requieran de un arquitectura que involucre 1 o mas Droplets y que estos se encuentren balanceados. &#160; Usando código en Typescript trabaje en un PoC para vincular 3 Droplets y balancear sus cargas, para ello [&#8230;]</p>
The post <a href="https://webmago.dev/administrando-droplets-con-pulumi/">Administrando Droplets con Pulumi</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></description>
										<content:encoded><![CDATA[<p>Un Droplet es el nombre que <a title="Digital Ocean" href="https://digitalocean.com" target="_blank" rel="noopener noreferrer">Digital Ocean</a> le da a sus maquinas virtuales, es muy probable que algunas aplicaciones requieran de un arquitectura que involucre 1 o mas Droplets y que estos se encuentren balanceados.</p>
<p>&nbsp;</p>
<p>Usando código en Typescript trabaje en un PoC para vincular 3 Droplets y balancear sus cargas, para ello hice uso de <a title="Pulumi" href="https://pulumi.com" target="_blank" rel="noopener noreferrer">Pulumi</a> para generar la arquitectura en donde un balanceador de carga recibirá las peticiones y las dirigirá hacia los droplets, a su vez un firewall evitara accesos a puertos no solicitados.</p>
<p>&nbsp;</p>
<p>En un post <a title="Pulumi (IaC) con Digital Ocean" href="https://webmago.dev/pulumi-iac-con-digital-ocean/" target="_blank" rel="noopener noreferrer">previo</a> hable de <a title="Pulumi" href="https://pulumi.com" target="_blank" rel="noopener noreferrer">Pulumi</a> con <a title="Digital Ocean" href="https://digitalocean.com" target="_blank" rel="noopener noreferrer">Digital Ocean</a>, con el que trabaje en un PoC y Kubernetes. Para este PoC me base en este <a title="Pulumi DigitalOcean Droplets" href="https://github.com/pulumi/examples/tree/master/digitalocean-ts-loadbalanced-droplets" target="_blank" rel="noopener noreferrer">código</a>  al cual le hice algunas adecuaciones para instalar docker y ejecutar el contenedor de <a title="Codigo Simple Web en Python" href="https://github.com/yeasy/simple-web" target="_blank" rel="noopener noreferrer">Simple Web</a> y validar el balanceo a través de los 3 Droplets creados.</p>
<p>&nbsp;</p>
<p>En la primer creación del Load Balancer, el verificador de salud lo habia definido para revisar el protocolo TCP en el puerto 80, esto genero un fallo general debido al uso del contenedor con python, por lo que procedí a ajustarlo para revisar el protocolo HTTP en el codigo de Typescript en lugar de hacerlo en el panel administrativo de Digital Ocean obteniendo así el estado de salud satisfactorio.</p>
<p>Cabe señalar que existen algunos glitches que <a title="Pulumi" href="https://pulumi.com" target="_blank" rel="noopener noreferrer">Pulumi</a> deberá resolver como en el caso de actualizar el Userdata de los Droplets se generan errores en el recurso del Firewall y Load Balancer.</p>
<p>&nbsp;</p>
<p>Les dejo a continuación unas capturas del PoC.</p>
<div id="attachment_790" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-790" class="size-large wp-image-790" src="https://webmago.dev/buvytsan/2021/03/pulumi-up-1024x865.png" alt="Pulumi Stack" width="1024" height="865" srcset="https://webmago.dev/buvytsan/2021/03/pulumi-up-1024x865.png 1024w, https://webmago.dev/buvytsan/2021/03/pulumi-up-300x253.png 300w, https://webmago.dev/buvytsan/2021/03/pulumi-up-768x649.png 768w, https://webmago.dev/buvytsan/2021/03/pulumi-up-1536x1298.png 1536w, https://webmago.dev/buvytsan/2021/03/pulumi-up.png 1664w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-790" class="wp-caption-text">Pulumi Stack</p></div>
<p>&nbsp;</p>
<div id="attachment_793" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-793" class="size-large wp-image-793" src="https://webmago.dev/buvytsan/2021/03/do-vpc-1024x455.png" alt="DO VPC creado" width="1024" height="455" srcset="https://webmago.dev/buvytsan/2021/03/do-vpc-1024x455.png 1024w, https://webmago.dev/buvytsan/2021/03/do-vpc-300x133.png 300w, https://webmago.dev/buvytsan/2021/03/do-vpc-768x341.png 768w, https://webmago.dev/buvytsan/2021/03/do-vpc-1536x682.png 1536w, https://webmago.dev/buvytsan/2021/03/do-vpc-2048x910.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-793" class="wp-caption-text">DO VPC creado</p></div>
<p>&nbsp;</p>
<div id="attachment_792" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-792" class="size-large wp-image-792" src="https://webmago.dev/buvytsan/2021/03/do-droplets-1024x332.png" alt="DO DROPLETS creados" width="1024" height="332" srcset="https://webmago.dev/buvytsan/2021/03/do-droplets-1024x332.png 1024w, https://webmago.dev/buvytsan/2021/03/do-droplets-300x97.png 300w, https://webmago.dev/buvytsan/2021/03/do-droplets-768x249.png 768w, https://webmago.dev/buvytsan/2021/03/do-droplets-1536x498.png 1536w, https://webmago.dev/buvytsan/2021/03/do-droplets-2048x664.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-792" class="wp-caption-text">DO DROPLETS creados</p></div>
<p>&nbsp;</p>
<div id="attachment_791" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-791" class="size-large wp-image-791" src="https://webmago.dev/buvytsan/2021/03/do-lb-1024x329.png" alt="DO LB creados" width="1024" height="329" srcset="https://webmago.dev/buvytsan/2021/03/do-lb-1024x329.png 1024w, https://webmago.dev/buvytsan/2021/03/do-lb-300x96.png 300w, https://webmago.dev/buvytsan/2021/03/do-lb-768x246.png 768w, https://webmago.dev/buvytsan/2021/03/do-lb-1536x493.png 1536w, https://webmago.dev/buvytsan/2021/03/do-lb-2048x657.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-791" class="wp-caption-text">DO LB creado</p></div>
<p>&nbsp;</p>
<div id="attachment_789" style="width: 1034px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-789" class="size-large wp-image-789" src="https://webmago.dev/buvytsan/2021/03/do-fw-1024x333.png" alt="DO FW creado" width="1024" height="333" srcset="https://webmago.dev/buvytsan/2021/03/do-fw-1024x333.png 1024w, https://webmago.dev/buvytsan/2021/03/do-fw-300x97.png 300w, https://webmago.dev/buvytsan/2021/03/do-fw-768x250.png 768w, https://webmago.dev/buvytsan/2021/03/do-fw-1536x499.png 1536w, https://webmago.dev/buvytsan/2021/03/do-fw-2048x665.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><p id="caption-attachment-789" class="wp-caption-text">DO FW creado</p></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="style-80 style-local-23-m39 position-relative" data-colibri-id="14-m39">
<div class="h-global-transition-all colibri-post-content">
<div class="style-80 style-local-23-m39 position-relative" data-colibri-id="14-m39">
<div class="h-global-transition-all colibri-post-content">
<p>Si requieres de mi ayuda para administrar tu infraestructura <a href="https://webmago.dev/#contact">contáctame</a>.</p>
</div>
</div>
</div>
</div>The post <a href="https://webmago.dev/administrando-droplets-con-pulumi/">Administrando Droplets con Pulumi</a> first appeared on <a href="https://webmago.dev">Webmago Dev</a>.]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
