<?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: Jose Ordoñez</title>
    <description>The latest articles on DEV Community by Jose Ordoñez (@josema88).</description>
    <link>https://dev.to/josema88</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%2F291208%2F4a06ba2a-8fdc-4c56-8adf-9af222224b5c.jpg</url>
      <title>DEV Community: Jose Ordoñez</title>
      <link>https://dev.to/josema88</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/josema88"/>
    <language>en</language>
    <item>
      <title>Lo que necesitas saber para construir tu primer RESTful API</title>
      <dc:creator>Jose Ordoñez</dc:creator>
      <pubDate>Thu, 10 Nov 2022 23:11:02 +0000</pubDate>
      <link>https://dev.to/josema88/lo-que-necesitas-saber-para-construir-tu-primer-restful-api-353k</link>
      <guid>https://dev.to/josema88/lo-que-necesitas-saber-para-construir-tu-primer-restful-api-353k</guid>
      <description>&lt;p&gt;Usualmente este tipo de APIs sirven para exponer los datos de un sistema o aplicación, por lo tanto un CRUD puede ser expuesto por medio de REST en donde hay que olvidarse del estándar SOAP. Para crear una RESTful API primero necesitas conocer las bases de una Arquitectura Orientada a Recursos y entender cómo debes exponer, actualizar y crear los recursos de tu aplicación. Para iniciar con REST deberás considerar los siguientes puntos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manipulación de los recursos en REST
&lt;/h2&gt;

&lt;p&gt;A diferencia de SOAP en donde hay diferentes alternativas de protocolos a utilizar, en REST no invertimos esfuerzos en tomar esta decisión ya que HTTP(S) es el protocolo utilizado. Para obtener un simple dato no necesitamos enviar un XML al servidor (como SOAP). Es suficiente realizar una petición GET a una URL por medio de HTTP, en donde la mayoría de veces no enviamos datos en este tipo de acciones, salvo algunos casos en donde es requerido por cuestiones de seguridad por mencionar alguno. En REST se puede utilizar XML o JSON para intercambiar datos aunque JSON es el más utilizado.&lt;/p&gt;

&lt;p&gt;Por ejemplo para obtener la lista de productos basta con realizar un HTTP GET al recurso productos:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/productos -&amp;gt; https://host/api/productos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WcfcbGA8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.jmordonez.com/uploads/rest-api.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WcfcbGA8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.jmordonez.com/uploads/rest-api.png" alt="" width="880" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  REST utiliza métodos HTTP
&lt;/h2&gt;

&lt;p&gt;En REST se utilizan los métodos GET, PUT, POST, DELETE entre otros para indicar el tipo de operación que se desea realizar sobre el recurso.&lt;/p&gt;

&lt;p&gt;GET: Se utiliza para obtener una representación de un recurso.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /api/productos - obtiene una lista de productos 
GET /api/productos/{idProducto} - obtiene los datos de un producto específico
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;POST: Se utiliza para crear una entidad a un recurso específico. En esta acción se debe adjuntar el JSON con los datos dentro del “Body” de la petición HTTP.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/productos - crea un producto nuevo
{
 "idProducto": "23",
 "nombre": "iPhone 11 Pro 256 GB",
 "descripcion": "Teléfono inteligente de Apple ",
 "precio": 1000.00,
 "rating": 4
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;PUT: Se utiliza para actualizar una entidad de un recurso específico. En esta acción se debe adjuntar el JSON con los datos dentro del “Body” de la petición HTTP.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PUT /api/productos/23 - actualiza los datos de un producto específico
{
 "nombre": "iPhone 11 Pro 256 GB",
 "descripcion": "Teléfono inteligente de Apple ",
 "precio": 850.00,
 "rating": 4
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;DELETE: Se utiliza para eliminar una entidad de un recurso específico. En esta acción se debe adjuntar en la url valor que identifica a la entidad dentro del recurso.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DELETE /api/productos/23 - elimina el producto específico basado en el id adjunto en la URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Si te fijas bien, en REST las URLs no contienen verbos o acciones ya que el verbo HTTP nos indica la acción del recurso y el recurso está especificado dentro de la URL.&lt;/p&gt;

&lt;p&gt;Tomando en cuenta lo anterior algo que NO deberías hacer es exponer tus recursos como:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/ObtenerProductos
POST /api/ActualizarProductos
POST /api/CrearProductos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Se recomienda que dentro de la URL no especifiques acciones o verbos como “CrearProductos”, “ObtenerUsuario” ya que por ser una arquitectura orientada a recursos estos recursos deben de ser accesibles y manipulables por medio de la URL y el verbo HTTP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Los códigos de estado de respuestas HTTP
&lt;/h2&gt;

&lt;p&gt;Un servicio REST debe de responder con códigos HTTP dependiendo de lo que quiera comunicarle al cliente. Esto permite que el cliente que consume el REST API pueda manejar diferentes escenarios de una mejor manera y que esto no impacte negativamente en la experiencia del usuario. Los más utilizados son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;200-299:&lt;/strong&gt; Indican buenas noticias, ya que la petición fue aceptada.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;200 OK:&lt;/strong&gt; Indica que la operación fue realizada correctamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;201 Created:&lt;/strong&gt; Indica que la operación se realizó correctamente, se utiliza para indicar que se creó un recurso en un POST.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;300-399: Indican redireccionamiento de una página a otra.&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;301 Moved Permanently: Indica redireccionamiento permanente.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;302 Found: Indica redireccionamiento temporal, se diferencia del 301 en que toda las caracteristicas del SEO no se transportan a la nueva URL.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;400-499:&lt;/strong&gt; Indican que el cliente que hizo la petición no está en la capacidad de resolverla.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;400 Bad Request:&lt;/strong&gt; Indica que los datos dentro de la petición no eran los correctos, se utiliza en POST y PUT cuando no se cumple una validación o formato.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;404 Not Found&lt;/strong&gt;: Indica que el recurso solicitado no fue encontrado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;401 Unauthorized:&lt;/strong&gt; Indica que el cliente no está autorizado a acceder al recurso por lo que es necesario identificarse antes de realizar la operación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;403 Forbidden:&lt;/strong&gt; Indica que el cliente no tiene permisos, en este caso el cliente ya se identificó pero no tiene el permiso para acceder al recurso.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;500-599:&lt;/strong&gt; Indican el registro de errores en el servidor al que se hizo la petición.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;500 Internal Server Error:&lt;/strong&gt; Indica que algo falló y no está relacionado con ninguno de los errores mencionados anteriormente, por lo general esta respuesta es cuando algo falla de manera imprevista.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;501 Not Implemented:&lt;/strong&gt; Indica que la peticion hecha por medio del verbo no ha sido implementada o simplemente el servidor no tiene la capacidad para resolverla.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;502 Bad Gateway:&lt;/strong&gt; Indica que el servidor esta actuando como puerta de enlace o proxy y recibió una respuesta no válida del servidor original.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;503 Service Unavailable:&lt;/strong&gt; Indica que el servidor que está actuando como puerta de enlace o proxy recibió una respuesta no válida del servidor original, comunmente porque no esta disponible o esta caído.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lenguajes y frameworks para construir una REST API
&lt;/h2&gt;

&lt;p&gt;Para desarrollar tu primer REST API necesitas un lenguaje utilizado en backend, además puedes considerar un framework para facilitarte el proceso. Entre los más populares están:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lenguaje&lt;/th&gt;
&lt;th&gt;Frameworks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td&gt;ASP.NET Core/5/6/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Spring Boot, Quarkus, TomEE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;Express, NestJS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Flask, Django&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Claro que existen más lenguajes y frameworks que podrías considerar, la elección de qué tecnología utilizar dependerá de factores como: experiencia previa en el lenguaje, lenguajes conocidos por tu equipo de trabajo, documentación disponible, ecosistema y restricciones de tu entorno, herramientas para el desarrollo, etc.&lt;/p&gt;

&lt;p&gt;Al final la decisión será tuya o de tu equipo, elije la tecnología que cumpla con diferentes criterios previamente definidos. También puedes considerar solo el hecho de que quieres aprender algo nuevo, entonces debes buscar recursos para aprender como: documentación, libros, tutoriales y cursos en línea.&lt;/p&gt;

&lt;p&gt;Con esta información en cuenta ya estás listo para empezar a construir tu primer REST API.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
      <category>spanish</category>
    </item>
    <item>
      <title>¿Por qué deberías considerar las RESTful APIs para la arquitectura de tu aplicación?</title>
      <dc:creator>Jose Ordoñez</dc:creator>
      <pubDate>Thu, 10 Nov 2022 23:02:22 +0000</pubDate>
      <link>https://dev.to/josema88/por-que-deberias-considerar-las-restful-apis-para-la-arquitectura-de-tu-aplicacion-32d7</link>
      <guid>https://dev.to/josema88/por-que-deberias-considerar-las-restful-apis-para-la-arquitectura-de-tu-aplicacion-32d7</guid>
      <description>&lt;p&gt;Acrónimos que encontrarás en la lectura:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Acrónimo&lt;/th&gt;
&lt;th&gt;Significado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SOA&lt;/td&gt;
&lt;td&gt;Service Oriented Architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOAP&lt;/td&gt;
&lt;td&gt;Simple Object Access Protocol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROA&lt;/td&gt;
&lt;td&gt;Resource Oriented Architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REST&lt;/td&gt;
&lt;td&gt;Representational State Transfer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A lo largo del tiempo se han desarrollado estándares para el diseño y desarrollo de servicios web que permitan integrar diferentes sistemas y garantizar la interoperabilidad.&lt;/p&gt;

&lt;p&gt;Los servicios web pueden clasificarse por su tipo de arquitectura entre los que destacan SOA y ROA. El framework basado en SOA es SOAP el cual sienta su base en servicios web, mientras que el framework basado en ROA es REST que también sienta su base en servicios web (Wagh y Thool, 2012).&lt;/p&gt;

&lt;p&gt;Algunos expertos dicen que SOAP no está hecho para dispositivos móviles de recursos limitados. Los mensajes de SOAP tienen una carga pesada, por el contrario los mensajes del framework REST son de carga ligera por lo que lo hace el más adecuado para utilizarlo en dispositivos y redes móviles.&lt;/p&gt;

&lt;p&gt;En la última década, se ha popularizado un estilo de arquitectura Software REST. Los Servicios Web que funcionan bajo REST (servicios Web RESTful) se presentan como una alternativa prometedora distinta a los servicios basados en SOAP por su simplicidad y naturaleza liviana, además de la capacidad de transmitir datos directamente sobre HTTP.&lt;/p&gt;

&lt;p&gt;Para brindar escalabilidad e interoperabilidad a una plataforma es clave implementar una herramienta tecnológica que tenga la capacidad de ser reutilizada dentro de otra plataforma tecnológica que se requiera. Una arquitectura de software orientada a la recuperación de recursos como REST permite que una aplicación pueda ser invocada como servicio brindando la capacidad de poder acceder a sus funciones desde otra plataforma.&lt;/p&gt;

&lt;p&gt;Sin importar el lenguaje de programación o framework en que sea desarrollado, un REST API permite comunicar diferentes sistemas y plataformas gracias al uso de HTTP. En la actualidad estas arquitecturas se pueden implementar tanto en infraestructura “On-Premise” como en una nube pública como Azure, AWS o GCP e incluso en un modelo híbrido que combine los 2 enfoques.&lt;/p&gt;

&lt;p&gt;REST se coloca como una alternativa idónea si se desea implementar una aplicación multiplataforma, ya que tiene potencial para crear aplicaciones escalables así como la característica del escaso uso de recursos, características esenciales para el desempeño de una aplicación web y/o móvil.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referencias&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Wagh, K., &amp;amp; Thool, R. (2012). A comparative study of soap vs rest web services provisioning techniques for mobile host. Journal of Information Engineering and Applications, 2(5), 12-16&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Why should you consider REST APIs for your application architecture?</title>
      <dc:creator>Jose Ordoñez</dc:creator>
      <pubDate>Fri, 10 Jul 2020 07:21:52 +0000</pubDate>
      <link>https://dev.to/josema88/why-should-you-consider-rest-apis-for-your-application-architecture-519m</link>
      <guid>https://dev.to/josema88/why-should-you-consider-rest-apis-for-your-application-architecture-519m</guid>
      <description>&lt;p&gt;Over time, standards for the design and development of web services came out in order to allow the integration of different systems and guarantee interoperability.&lt;/p&gt;

&lt;p&gt;Web services can be classified by their type of architecture, among which SOA (Software Oriented Architecture) and ROA (Resource Oriented Architecture) stand out. The SOA-based framework is SOAP which lays its foundation on web services, while the ROA-based framework is REST which also lays its foundation on resources web services (Wagh and Thool, 2012).&lt;/p&gt;

&lt;p&gt;Some experts say SOAP is not made for mobile devices with limited resources. SOAP messages have a heavy load, on the contrary, the messages of the REST framework are light load, which makes it the most suitable for use on mobile devices and networks.&lt;/p&gt;

&lt;p&gt;In the last decade, a Software REST architecture style has become popular. RESTful Web Services are presented as a great alternative to SOAP-based services due to their simplicity and light nature, as well as the ability to transmit data directly over HTTP.&lt;/p&gt;

&lt;p&gt;To provide scalability and interoperability to a platform, it is very important to implement a technological tool that can be reused within any other technological platform required. A software architecture oriented to the resources' recovery such as REST allows an application to be invoked as a service providing the ability to access its functions from another platform.&lt;/p&gt;

&lt;p&gt;Regardless of the programming language or framework in which it is developed, a REST API allows us to communicate different systems and platforms thanks to the use of HTTP. Currently, these architectures can be implemented both in “On-Premise” infrastructure and in a public cloud such as Azure, AWS, or GCP and even in a hybrid model that combines the 2 approaches.&lt;/p&gt;

&lt;p&gt;REST is positioned as an ideal alternative if you want to implement a cross-platform application since it has the potential to create scalable applications as well as the characteristic of low use of resources, essential characteristics for the performance of a web and/or mobile application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Wagh, K., &amp;amp; Thool, R. (2012). A comparative study of soap vs rest web services provisioning techniques for mobile host. Journal of Information Engineering and Applications, 2(5), 12-16&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>api</category>
      <category>rest</category>
      <category>webdev</category>
    </item>
    <item>
      <title>6 Things you can do to become a better software developer</title>
      <dc:creator>Jose Ordoñez</dc:creator>
      <pubDate>Sun, 16 Feb 2020 20:04:20 +0000</pubDate>
      <link>https://dev.to/josema88/6-things-you-can-do-to-become-a-better-software-developer-3ck2</link>
      <guid>https://dev.to/josema88/6-things-you-can-do-to-become-a-better-software-developer-3ck2</guid>
      <description>&lt;p&gt;Months ago I was wondering about the journey that I had along with my career as a software developer and I could say that I’m “lucky” or “blessed” but I don’t trust in luck, I think you can build your destiny based on all the decisions that you make. So in these past years since I began my journey as a developer, I took some decisions and I always been trying to do some things that helped me a lot to improve my skills in this field. I would like to share with you 6 things that I applied and helped me to improve myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Read Books/magazines/blogs
&lt;/h2&gt;

&lt;p&gt;I'm not a great reader, I have difficulties focusing while I'm reading but I think read is very important. Since I don't have a reading habit I just read some books so far, I'm not the one that reads tons of books but I have to admit that read books help you to grow and learn new things. I'm a person that maybe doesn't reads a lot of books but reads a lot of articles in magazines and blogs, I invest at least 30 minutes every day (I try) reading blogs or articles. This practice helped me to discover new alternatives to do my job, new techs, new frameworks that at some point I've been using and helped me to improve my job. You can start investing some minutes to read about a topic that you want to specialize in or a topic that you want to learn. In my case each day I try to read one article about a tech or a stack that I'm familiar with (backend or DevOps) and also I read one article about some tech or stack that I want to learn (frontend and product management).&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Read other's code (especially Open Source projects)
&lt;/h2&gt;

&lt;p&gt;During my career and different jobs, I've been working on projects that are already built so I've faced code written by other developers, which was great no matter if that code was bad or well built. Reading other's code allows you to gain new knowledge. Maybe you can learn new design patterns, code standards and sometimes you learn how not to code. I also recommend reading the code from Open Source projects, if you use some libraries or tools that you like maybe you can spend some time reading the code and its documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Develop a personal project
&lt;/h2&gt;

&lt;p&gt;You may have all the theory inside your head but the only way you can prove your value is by demonstrating what you've learned. As a Developer build things will help you to improve your skills, in software development the "practice makes perfect". You can develop an App or Tool to learn a new language, framework, or design pattern, from my perspective there is no better way to learn than put it into practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Know SW architecture and Design Patterns (before knowing a lot of programming languages).
&lt;/h2&gt;

&lt;p&gt;I think is great to learn different programming languages. When you see that developer that knows 5 different programming languages you just think it is awesome that someone takes its time to learn different programming languages. You think that Dev is a superhero, the disappointment comes when you read that developer’s code or you watch him submitting bugs to production. So I think that if you don’t know good coding standards, coding principles, software architecture approaches, and design patterns you will make the same mistakes in every programming language. I could say that those aspects are agnostic to programming languages and a good developer should focus on polish those aspects before getting obsessed to learn a lot of programming languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Listen to experienced professionals
&lt;/h2&gt;

&lt;p&gt;In every job that I had, I always tried to listen to the experienced co-workers and that is something that I didn’t regret it, we can learn a lot about the experiences (bad or good) from others. You know, listen to the difficulties of others can help you to avoid the same difficulties to you, and listen to the achievements and success of others can inspire you to do great things. So always try to accept advice or a critic, listen to what the others have to say because sometimes they are spending some of their time to help you to be better.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Teach or mentor others
&lt;/h2&gt;

&lt;p&gt;Now on the other side, I also try to be someone that helps the less experienced to improve. This is not rocket science, this is about to guide or help others when they need it. In a situation when you’re teaching or mentoring I think that your technical skills could increase. In my particular case, I experienced the “learning by teaching” and it’s doubly satisfying.&lt;/p&gt;

&lt;p&gt;Well, those are the “tips” that I can share with you so far, maybe some of them are obvious but the key is to just do it. If you have more tips or comments you can share with us.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Deploying Infrastructure to Azure with Terraform and Azure DevOps</title>
      <dc:creator>Jose Ordoñez</dc:creator>
      <pubDate>Sun, 16 Feb 2020 01:23:46 +0000</pubDate>
      <link>https://dev.to/josema88/deploying-infrastructure-to-azure-with-terraform-and-azure-devops-i8o</link>
      <guid>https://dev.to/josema88/deploying-infrastructure-to-azure-with-terraform-and-azure-devops-i8o</guid>
      <description>&lt;p&gt;At this tutorial we’ll build an automated pipeline that allows to create infrastructure in Azure cloud using IaC concept with tools such as Terraform and Azure DevOps.&lt;/p&gt;

&lt;p&gt;We will be able to create a PaaS Azure Resource called &lt;a href="https://azure.microsoft.com/en-us/services/app-service/"&gt;App Service&lt;/a&gt;. This Azure resource allows to deploy a web app, for this sample a .net web app.&lt;/p&gt;

&lt;p&gt;For this tutorial you can use the files from this &lt;a href="https://github.com/josema88/IaCWithAzure"&gt;repo&lt;/a&gt;, you can fork it to your account if you want. Within those files is a folder called Terraform and a file called &lt;a href="https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Terraform/appService.tf"&gt;appService.tf&lt;/a&gt; that contains infrastructure’s definition that will be deployed on Azure. The file contains the definition for the following Azure resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource Group&lt;/li&gt;
&lt;li&gt;App Service Plan&lt;/li&gt;
&lt;li&gt;App Service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each resource has its required configurations such as the name and other parameters. If you use the terraform file from this repo you should change the name for your App Service resource since this should be a unique name within azure cloud.&lt;/p&gt;

&lt;h1&gt;
  
  
  Requirements
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Install &lt;a href="https://docs.bitnami.com/azure/faq/administration/install-az-cli/"&gt;Azure CLI&lt;/a&gt; (if you want to test from your computer)&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://learn.hashicorp.com/terraform/getting-started/install.html"&gt;Terraform&lt;/a&gt; (if you want to test from your computer)&lt;/li&gt;
&lt;li&gt;Create an Azure account.&lt;/li&gt;
&lt;li&gt;Create an Azure DevOps account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To be honest with you for this tutorial you don’t even need Azure cli or Terraform installed on your machine since Azure DevOps will do the magic.&lt;/p&gt;

&lt;h1&gt;
  
  
  Create Azure DevOps Project
&lt;/h1&gt;

&lt;p&gt;If you already have an account you can skip this section. In order to create an Azure Pipeline you must create your Azure DevOps project that will contain the automated pipelines that deploy the infraestructure to the cloud.&lt;/p&gt;

&lt;h4&gt;
  
  
  Create New Organization
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Open &lt;a href="https://dev.azure.com"&gt;https://dev.azure.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a new organization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5MY6oPJ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5MY6oPJ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps1.png" alt="AzDevops1" width="880" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--62Wh6rII--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--62Wh6rII--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps2.png" alt="AzDevops2" width="880" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Create Project
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Create the first project - name it, in my case &lt;code&gt;AzBootCamp2019&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Authorize your Azure Cloud subscription
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Add a service connection for your Azure Subscription
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gNKqBuIo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps3.png" alt="AzDevops3" width="880" height="531"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Create Automated Pipeline
&lt;/h1&gt;

&lt;p&gt;After you create your organization and project within Azure Devops you can proceed now to create your automated pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a Release Pipeline
&lt;/h3&gt;

&lt;p&gt;This pipeline will allow us to set different required steps that execute our different tasks to deploy the infrastrucuture to the cloud.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new Release Pipeline
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XZWdngSq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps4.png" alt="AzDevops4" width="880" height="533"&gt;
&lt;/li&gt;
&lt;li&gt;Add an artifact, in this case your Github repo where your terraform code is hosted. You should add a new connection to your github in services management.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qx1aYfJm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps5.png" alt="AzDevops5" width="880" height="535"&gt;
&lt;/li&gt;
&lt;li&gt;Add a stage, e.g.: Dev or Prod. This stage should be an empty job.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qolW68vX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps6.png" alt="AzDevops6" width="880" height="533"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--276gE8Zi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps7.png" alt="AzDevops7" width="880" height="533"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cjCpOodp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps8.png" alt="AzDevops8" width="880" height="532"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Select an Ubuntu OS Agent
&lt;/h4&gt;

&lt;p&gt;For this sample you should use an agent that runs with Ubuntu OS since the scripts are written in bash.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oLKTrWk1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oLKTrWk1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps18.png" alt="AzDevops18" width="880" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Create Pipeline variables
&lt;/h4&gt;

&lt;p&gt;These pipeline variables will be used in order to parametrize names for some resources and avoid the hardcoding within the scripts. These variables will be used to create the Azure resources that will store the Terraform Backend. The variable "TerraformStorageAccount" refers to the name that you will set to the storage account in Azure that will stores the Terraform Backend, this variable should be different for any implementation since this should be a unique name within Azure Cloud. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a2FalHEx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a2FalHEx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps11.png" alt="AzDevops11" width="880" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Terraform Backend
&lt;/h3&gt;

&lt;p&gt;By default, Terraform stores state locally in a file named terraform.tfstate. When working with Terraform in a team, use of a local file Isn’t a great idea. You can use the remote state that allows Terraform to writes the state data in a remote data store that you can specify. For this sample we will use a Terraform CLI task that allows to create an Azure storage account and storage container to store Terraform state if this not exists yet. For more information on Terraform remote state click &lt;a href="https://www.terraform.io/docs/state/remote.html"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Terraform Cycle
&lt;/h3&gt;

&lt;p&gt;When running Terraform in automation, the focus is usually on the core plan/apply cycle. The main Terraform workflow is the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m5JiuthX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/terraformworkflow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m5JiuthX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/terraformworkflow.png" alt="TFcycle" width="578" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;i. Initialize the Terraform working directory.&lt;/p&gt;

&lt;p&gt;ii. Produce a plan for changing resources to match the current configuration.&lt;/p&gt;

&lt;p&gt;iii. Apply the changes described by the plan.&lt;/p&gt;

&lt;p&gt;The following tasks will allow you to implement the terraform cycle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Task - Terraform Init
&lt;/h3&gt;

&lt;p&gt;First you should install the extension in order to use the terraform task, for this tutorial we use an specific extension, select the extension created by Charles Zipp. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JUIFSC5q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JUIFSC5q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps14.png" alt="AzDevops14" width="880" height="531"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fCRSmRZ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fCRSmRZ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps15.png" alt="AzDevops15" width="880" height="532"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EPaE7Arr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EPaE7Arr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps16.png" alt="AzDevops16" width="880" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the extension is installed in your Azure DevOps you can add the task for Terraform Install, this task will guarantee that the agent that runs the command has Terraform installed.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZB9FJkNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZB9FJkNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps17.png" alt="AzDevops17" width="880" height="536"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---y_xgTG4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps17_1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---y_xgTG4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps17_1.png" alt="AzDevops17" width="880" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add Terraform CLI task to perform the Init Stage, you should select the command “Init” and for the Configuration directory you should point to the artifact configured before (repo and folder that contains the terraform files). &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x_QL_f2_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps20.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x_QL_f2_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps20.png" alt="AzDevops20" width="880" height="531"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jvHnBfPJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps21.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jvHnBfPJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps21.png" alt="AzDevops21" width="880" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configure the Azure Resource Manager section in order to set the Terraform Backend that will be located in azure, we should use the Pipeline variables configured previously.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EixuVOGj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EixuVOGj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps22.png" alt="AzDevops22" width="880" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This task runs terraform init command. The terraform init command looks through all of the *.tf files in the current working directory and automatically downloads any of the providers required for them. In this example, it will download Azure provider as we are going to deploy Azure resources. For more information about terraform init command click &lt;a href="https://www.terraform.io/docs/commands/init.html"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Task - Terraform Plan
&lt;/h3&gt;

&lt;p&gt;Add Terraform CLI task like the init task, but for this one you should select the command “Plan”. You should set the Configuration Directory like the previous task. Also set the "Environment Azure Subscription" that should point to your Azure service connection configured before, you should authorize the connection if necessary. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--74Agbkvn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps23.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--74Agbkvn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps23.png" alt="AzDevops23" width="880" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The terraform plan command is used to create an execution plan. Terraform determines what actions are necessary to achieve the desired state specified in the configuration files. This is a dry run and shows which actions will be made. For more information about terraform plan command click &lt;a href="https://www.terraform.io/docs/commands/plan.html"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Task - Terraform Apply
&lt;/h3&gt;

&lt;p&gt;Add Terraform CLI task like previous tasks, but for this one you should select the command “Apply”. You should set the Configuration Directory like the previous task. Also set the "Environment Azure Subscription" that should point to your Azure service connection configured before. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2SY7TX3Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2SY7TX3Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps24.png" alt="AzDevops24" width="880" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This task will run the terraform apply command to deploy the resources to Azure Cloud.&lt;/p&gt;

&lt;h3&gt;
  
  
  Save your Pipeline
&lt;/h3&gt;

&lt;p&gt;Once the pipeline configuration is completed set a Name on it and save changes.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uYk7WSJX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uYk7WSJX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps25.png" alt="AzDevops25" width="880" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Launch your Pipeline
&lt;/h3&gt;

&lt;p&gt;Here we go, the Pipeline is now available! So now we can Create a Release, this action will start the execution of the pipeline and its tasks. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GweN4Ixu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps26.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GweN4Ixu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps26.png" alt="AzDevops26" width="880" height="532"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lJuxO4Fc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lJuxO4Fc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps27.png" alt="AzDevops27" width="880" height="531"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5EFRxgrM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps28.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5EFRxgrM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps28.png" alt="AzDevops28" width="880" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the pipeline’s execution is completed you will be able the see the new infraestructure created in Azure. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wxvi7eV5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wxvi7eV5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps29.png" alt="AzDevops29" width="880" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--__J_jrvi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--__J_jrvi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps30.png" alt="AzDevops30" width="880" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within the RG for the App Service you will see the new infrastructure.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--THBaVhQf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps31.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--THBaVhQf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/josema88/IaCWithAzure/master/Images/AzDevOps31.png" alt="AzDevops31" width="880" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So we have an Azure App Service created that can be able to host a web app (.net for this tutorial). If you want to deploy an App Service with more compute capacity or different Runtime (maybe Docker) you can easily do that changing your infrastructure definitions on the .tf file.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>azure</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
