<?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>Terraform archivos - Geko Cloud</title>
	<atom:link href="https://geko.cloud/es/etiqueta/terraform/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Servicios de consultoría cloud y devops</description>
	<lastBuildDate>Thu, 04 Nov 2021 08:40:35 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>

<image>
	<url>https://geko.cloud/wp-content/uploads/2021/08/cropped-geko-fav-150x150.png</url>
	<title>Terraform archivos - Geko Cloud</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Una vista rápida de los módulos de Terraform</title>
		<link>https://geko.cloud/es/una-vista-rapida-de-los-modulos-de-terraform/</link>
					<comments>https://geko.cloud/es/una-vista-rapida-de-los-modulos-de-terraform/#respond</comments>
		
		<dc:creator><![CDATA[Jose Luis Sánchez]]></dc:creator>
		<pubDate>Mon, 18 Jan 2021 17:35:09 +0000</pubDate>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Terraform]]></category>
		<guid isPermaLink="false">https://geko2.factoryfy.com/?p=3446</guid>

					<description><![CDATA[<p>Introducción Los módulos en Terraform son una colección de recursos que se pueden vincular o simplemente crear individualmente. Cuando llamamos a un módulo, estamos llamando a un archivo con una serie de recursos y algunos parámetros, los cuales necesitamos especificar o bien en el propio recurso o en otro archivo que almacene nuestras variables. ¿Por [&#8230;]</p>
<p>La entrada <a href="https://geko.cloud/es/una-vista-rapida-de-los-modulos-de-terraform/">Una vista rápida de los módulos de Terraform</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introducción</h2>
<p>Los módulos en <strong>Terraform</strong> son una colección de recursos que se pueden vincular o simplemente crear individualmente. Cuando llamamos a un módulo, estamos llamando a un archivo con una serie de recursos y algunos parámetros, los cuales necesitamos especificar o bien en el propio recurso o en otro archivo que almacene nuestras variables.</p>
<h2>¿Por qué usar Terraform?</h2>
<ul>
<li>Es una herramienta muy útil para desarrollar, cambiar y tener un <em>versioning</em> de nuestra infraestructura de manera eficiente y segura.</li>
<li>Es una herramienta que permite definir infraestructura como código y habilita cambiar y hacer un seguimiento de la infraestructura con facilidad.</li>
<li>Es independiente de la plataforma o ‘<em>cloud agnostic</em>’ y permite trabajar con múltiples <strong>proveedores cloud</strong>.</li>
</ul>
<h3>¿Qué necesitamos para este lab?</h3>
<ul>
<li><strong>Terraform</strong> instalado. En este caso, ejecutamos la v.0.12.7.</li>
<li>En nuestro caso, utilizamos <strong>AWS</strong> como nuestro proveedor de servicios en la nube, por lo que necesitamos un usuario con acceso mediante programación. También necesitamos dar acceso a este usuario con la Política de IAM adecuada.</li>
<li>Tu editor de código preferido.</li>
</ul>
<p>¡Empecemos!</p>
<p>Por lo general, primero deberíamos configurar un módulo <strong>Terraform</strong> con nuestros parámetros requeridos o simplemente obtener algún módulo oficial de la red. En nuestro caso, estamos usando un módulo propio con un <strong>Bucket S3</strong> y su propia política y, por lo tanto, especificamos qué parámetros queremos en nuestro módulo.</p>
<div class="wp-block-codemirror-blocks code-block">
<pre class="CodeMirror" data-setting="{">resource "aws_s3_bucket" "this" {
  bucket            = var.bucket_name
  acl               = var.type_acl
  force_destroy     = var.destroy

  tags = {
    Name            = var.tag_name
  }
  versioning {
    enabled         = var.versioning
  } 
}

resource "aws_s3_bucket_policy" "this" {
  bucket = var.bucket_name
  policy = templatefile("${path.module}/templates/s3_origin_access_identity.json", {
    origin_access_identity_arn         = aws_cloudfront_origin_access_identity.this.iam_arn,
    origin_access_identity_bucket_name = var.bucket_name
  })
}</pre>
</div>
<p>Como veis, hay algunos valores que los introducimos con variables por lo tanto, necesitaremos un fichero llamado «variables.tf» en el cuál introduciremos los valores.</p>
<p>En la misma carpeta que tenemos nuestro archivo “main.tf”, creamos nuestro fichero “variables.tf”:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">### S3 VARIABLES

variable "bucket_name"      { }
variable "tag_name"         { }
variable "type_acl"         { }
variable "versioning"       { }
variable "destroy"          { }
variable "aliases"          { }
variable "certificate_arn"  { }</pre>
</div>
<p>En este caso particular, puede que os preguntéis por qué estas variables no tienen ningún valor almacenado. Y la respuesta es que estamos usando un archivo principal llamado «terragrunt.hcl» el cuál almacenará todos nuestros valores cuando llamemos al módulo.</p>
<p>Otra cosa que puede resultar confusa es cómo especificar la política del <strong>Bucket</strong>. Podemos especificarla o bien con un archivo heredoc (EOF) o directamente con una función de <strong>Terraform</strong> llamada «templatefile».</p>
<p>El primer ejemplo está en la <a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs">documentación oficial de Terraform</a>, una web que os sugiero visitar para entender el verdadero poder de los módulos y sus recursos.</p>
<p>En nuestro caso usamos el segundo ejemplo y necesitamos que en la misma carpeta, haya otra llamada «templates» y dentro de ella, la política del <strong>Bucket</strong> como un archivo JSON.</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">{
    "Version": "2012-10-17",
    "Id": "PolicyForCloudFrontPrivateS3Content",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "${origin_access_identity_arn}"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::${origin_access_identity_bucket_name}/*"
        }
    ]
  }</pre>
</div>
<p>Como seguramente os habréis dado cuenta, hemos introducido varias variables ${origin_access_identity_arn} y ${origin_access_identity_bucket_name} y eso es porque así, introduciremos los valores desde fuera de esa política, desde el propio archivo &#8216;main.tf».</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">policy = templatefile("${path.module}/templates/s3_origin_access_identity.json", {
    origin_access_identity_arn         = aws_cloudfront_origin_access_identity.this.iam_arn,
    origin_access_identity_bucket_name = var.bucket_name
  })</pre>
</div>
<p>Así, introducimos el <em>arn </em>llamando a otro recurso llamado «<em>aws_cloudfront_origin_access_identity»</em> y el nombre del bucket lo introducimos como hemos visto antes con nuestro archivo de variables.</p>
<p>Ahora solo necesitamos especificar el proveedor de <strong>Terraform</strong> y llamar al módulo con otro archivo que llamaremos «provider.tf» con los valores que hemos especificado:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">provider "aws" {
  region     = var.region
  version    = "~&gt; 2.0"
}

provider "aws" {
  alias  = "aws_us_east_1"
  region = "us-east-1"
}
module "s3" {
    source               = "../../../../../../modules/s3-cloudfront/"
    bucket_name          = var.bucket_name
    tag_name             = var.tag_name
    type_acl             = var.type_acl
    versioning           = var.versioning
    destroy              = var.destroy
    aliases              = var.aliases
    certificate_arn      = var.certificate_arn    
}</pre>
</div>
<p>Y por último, desplegar nuestro módulo con los comandos <strong>terraform init</strong>, <strong>terraform plan</strong> y <strong>terraform apply</strong>.</p>
<h2 class="western"><span style="color: #404040;"><span style="font-family: Open Sans, sans-serif;"><span style="font-size: xx-large;">Conclusión</span></span></span></h2>
<p>En este post, hemos visto como <strong>desplegar un Bucket S3</strong> con su respectiva política con <strong>Terraform</strong>. Os sugiero que visitéis la documentación oficial de <strong>Terraform</strong> para seguir aprendiendo sobre los módulos, recursos y sus parámetros.</p>
<p>También os invito a <a href="https://geko.cloud/es/contacto/">contactar con nosotros</a> en caos de que necesitéis información acerca del mundo <a href="https://geko.cloud/es/devops/">DevOps</a> y no dudéis en seguir nuestro <a href="https://geko.cloud/es/blog/labs/">blog</a> para descubrir otros posts útiles.</p>
<p><a href="https://geko.cloud/es/contacto/"><img decoding="async" class="aligncenter wp-image-3265" src="https://geko2.factoryfy.com/wp-content/uploads/geko-1-150x150.png" alt="" width="82" height="82" /></a></p>
<p>La entrada <a href="https://geko.cloud/es/una-vista-rapida-de-los-modulos-de-terraform/">Una vista rápida de los módulos de Terraform</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://geko.cloud/es/una-vista-rapida-de-los-modulos-de-terraform/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Actualización del módulo Terraform en los clústeres públicos de GKE</title>
		<link>https://geko.cloud/es/actualizacion-modulo-terraform-clusteres-publicos-gke/</link>
					<comments>https://geko.cloud/es/actualizacion-modulo-terraform-clusteres-publicos-gke/#respond</comments>
		
		<dc:creator><![CDATA[Geko Cloud]]></dc:creator>
		<pubDate>Wed, 13 May 2020 06:24:40 +0000</pubDate>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[GKE]]></category>
		<category><![CDATA[Google Cloud]]></category>
		<category><![CDATA[Terraform]]></category>
		<guid isPermaLink="false">https://geko2.factoryfy.com/?p=1831</guid>

					<description><![CDATA[<p>Introducción De vez en cuando, Google introduce nuevas características y cambios que a veces también obligan a los módulos de Terraform a actualizarse. En Geko, estábamos usando el módulo GKE para la implementación y administración de clústeres públicos en la versión 5.x. Hace unos días, cuando planeamos actualizar algunos parámetros, descubrimos que Google había eliminado [&#8230;]</p>
<p>La entrada <a href="https://geko.cloud/es/actualizacion-modulo-terraform-clusteres-publicos-gke/">Actualización del módulo Terraform en los clústeres públicos de GKE</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Introducción</h3>
<p>De vez en cuando, Google introduce nuevas características y cambios que a veces también obligan a los <a href="https://www.terraform.io/docs/configuration/modules.html">módulos de Terraform</a> a actualizarse. En <strong><a href="http://geko.cloud/es">Geko</a></strong>, estábamos usando el módulo <a href="https://registry.terraform.io/modules/terraform-google-modules/kubernetes-engine/google/5.1.1/submodules/beta-public-cluster">GKE para la implementación y administración de clústeres públicos en la versión 5.x</a>. Hace unos días, cuando planeamos actualizar algunos parámetros, descubrimos que Google había eliminado la compatibilidad con el panel de control de Kubernetes. Estaba completamente en desuso y el módulo estaba fallando debido a ello, por lo que nos vimos obligados a actualizar el módulo para cumplir con las nuevas condiciones. Hubo hasta 3 actualizaciones de versiones principales disponibles, por lo que decidimos probarlo y usar la última. Sin embargo, no era una solución independiente, ya que requería gestionar las incoherencias del estado de Terraform.</p>
<p>El objetivo de este laboratorio es aprender cómo actualizar el módulo oficial Terraform destinado a implementar y administrar un clúster GKE público. Nos ocuparemos especialmente de los cambios de ruptura del módulo (<a href="https://registry.terraform.io/modules/terraform-google-modules/kubernetes-engine/google/8.1.0/submodules/beta-public-cluster">kubernetes-engine.beta-public-cluster</a>), y lograremos obtener el estado consistente que teníamos antes de la falla que precedió a la actualización.</p>
<p><strong>Tiempo estimado para terminar este laboratorio:</strong> ~ 20 minutos</p>
<h3>1. Eliminar los recursos anteriores</h3>
<p><strong>¡Se recomienda encarecidamente realizar una copia de seguridad de archivos tfstate antes de continuar!</strong></p>
<p>Es especialmente importante eliminar todos los recursos conflictivos del tfstate de Terraform ya que están vinculados entre ellos como dependencias. El objetivo aquí es eliminar cualquier enlace obsoleto antes de importarlo nuevamente desde la «imagen» actual que ya se ha desplegado.</p>
<p>Los componentes principales en un clúster de Kubernetes son las redes (y subredes), el grupo de nodos y el clúster en sí. Centrémonos en ellos.</p>
<div class="wp-block-codemirror-blocks code-block">
<pre class="CodeMirror" data-setting="{">terraform state rm module.gke.google_container_cluster.primary
terraform state rm module.gke.google_container_node_pool.pools[0]
terraform state rm module.vpc.google_compute_network.network
terraform state rm module.vpc.google_compute_subnetwork.subnetwork[0]
terraform state rm module.vpc.google_compute_subnetwork.subnetwork[1]</pre>
</div>
<h3>2. Actualizar versiones</h3>
<p>Una vez eliminados los estados anteriores, el siguiente paso es configurar la última versión los módulos requeridos. Para el módulo GKE, la última versión disponible a fecha de hoy es 8.1.0, pero se permite aplicar automáticamente actualizaciones menores («~&gt;»).</p>
<h5>Actualizar el módulo clúster GKE</h5>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{"> module "gke" {
   source  = "terraform-google-modules/kubernetes-engine/google//modules/beta-public-cluster"
-  version = "~&gt; 5.0"
+  version = "~&gt; 8.1"
</pre>
</div>
<h5>Actualizar el módulo VPC</h5>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{"> module "vpc" {
-  source  = "github.com/terraform-google-modules/terraform-google-network?ref=v1.1.0"
+  source  = "github.com/terraform-google-modules/terraform-google-network?ref=v2.3.0"</pre>
</div>
<h5>Comprobar los nuevos recursos</h5>
<p>Para saber si los nuevos recursos han experimentado un cambio de nombre (debido a la actualización de los módulos), se recomienda encarecidamente lanzar un <a href="https://www.terraform.io/docs/commands/plan.html">plan de Terraform.</a></p>
<p>En este caso, se ha encontrado que la jerarquía interna de algunos módulos y también los índices de la lista han cambiado.</p>
<div class="wp-block-codemirror-blocks code-block">
<pre class="CodeMirror" data-setting="{">  module.gke.google_container_cluster.primary
  
<b>-</b> module.gke.google_container_node_pool.pools[0]
<b>+</b> module.gke.google_container_node_pool.pools["default-node-pool"]

  module.vpc.google_compute_network.network
  
<b>-</b> module.vpc.google_compute_subnetwork.subnetwork[0]
<b>+</b> module.vpc.module.subnets.google_compute_subnetwork.subnetwork["southamerica-east1/my-cluster-public"]

<b>-</b> module.vpc.google_compute_subnetwork.subnetwork[1]
<b>+</b> module.vpc.module.subnets.google_compute_subnetwork.subnetwork["southamerica-east1/my-cluster-private"]</pre>
</div>
<h3>3. Importar los nuevos recursos</h3>
<p>Ten en cuenta que la zona/región depende del tipo de clúster. Si es de zona, debe usar la zona maestra (por ejemplo, southamerica-east1-a). Por otro lado, si se trata de un clúster regional, debe usar la región (por ejemplo, southamerica-east1). El siguiente ejemplo supone un clúster regional ubicado en southamerica-east1, en el proyecto «my-project» y con el nombre de clúster «my-cluster». Los nombres de red se configuraron de acuerdo con el nombre del clúster, simplemente agregando los sufijos «private» y «public» a las subredes para diferenciarlos adecuadamente.</p>
<p><strong>Ten en cuenta también la nueva jerarquía de módulos e indexación.</strong></p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{"># Global vars
REGION="southamerica-east1"
PROJECT="my-project"
CLUSTER="my-cluster"

# Cluster
CLUSTER_LOCAL="module.gke.google_container_cluster.primary"
CLUSTER_REMOTE="${PROJECT}/${REGION}/${CLUSTER}"
terraform import $CLUSTER_LOCAL $CLUSTER_REMOTE

# Node pool
POOL_LOCAL="module.gke.google_container_node_pool.pools["default-node-pool"]"
POOL_REMOTE="${CLUSTER_REMOTE}/default-node-pool"
terraform import $POOL_LOCAL $POOL_REMOTE

# Subnetworks
BASE_SUBNET_LOCAL="module.vpc.module.subnets.google_compute_subnetwork.subnetwork"

## Public
PUBLIC_SUBNET_LOCAL="${BASE_SUBNET_LOCAL}["${REGION}/${CLUSTER}-public"]"
PUBLIC_SUBNET_REMOTE="${CLUSTER_REMOTE}-public"
terraform import $PUBLIC_SUBNET_LOCAL $PUBLIC_SUBNET_REMOTE

## Private
PRIVATE_SUBNET_LOCAL="${BASE_SUBNET_LOCAL}["${REGION}/${CLUSTER}-private"]"
PRIVATE_SUBNET_REMOTE="${CLUSTER_REMOTE}-private"
terraform import $PRIVATE_SUBNET_LOCAL $PRIVATE_SUBNET_REMOTE

# Network
NETWORK_LOCAL="module.vpc.module.vpc.google_compute_network.network"
NETWORK_REMOTE="${PROJECT}/${CLUSTER}"
terraform import $NETWORK_LOCAL $NETWORK_REMOTE</pre>
</div>
<h3> 4. Actualizar parámetros</h3>
<p>Es muy probable que encuentres que, después de lanzar un plan de Terraform, el recurso <em><strong>google_container_cluster</strong></em> todavía necesite actualizarse debido a un cambio en el parámetro de subred. Las nuevas claves de subred han hecho que los índices cambien su orden. Simplemente edita el módulo GKE para reemplazar el parámetro <em>subnetwork </em>como se muestra a continuación.</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{"><b>-</b> subnetwork = module.vpc.subnets_names[<b>0</b>]
<b>+</b> subnetwork = module.vpc.subnets_names[<b>1</b>]</pre>
</div>
<h3>Conclusión</h3>
<p>Como habrás visto anteriormente, a veces, al depender de terceros, puede suceder que se introduzca un cambio importante y tengas problemas para recuperar el servicio nuevamente. Además de esto, la solución podría introducir daños colaterales que requerirán subsoluciones adicionales. En este caso particular con respecto a Terraform, lidiar con estados inconsistentes no es realmente común ni recomendado, pero es el único método que tiene disponible para resolverlos en su conjunto de herramientas.</p>
<hr />
<p>Espero que hayas disfrutado de este post y te animo a que <a href="https://geko.cloud/es/blog/">revises nuestro blog para leer otrosposts</a> que puedan ser de tu interés. <a href="https://geko.cloud/es/contacto/">No dudes en contactarnos</a> si deseas que te ayudemos en tus proyectos.</p>
<p>¡Nos vemos en la próxima entrada!</p>
<p>La entrada <a href="https://geko.cloud/es/actualizacion-modulo-terraform-clusteres-publicos-gke/">Actualización del módulo Terraform en los clústeres públicos de GKE</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://geko.cloud/es/actualizacion-modulo-terraform-clusteres-publicos-gke/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
