

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Paso 2.5: Implementar una aplicación
<a name="gettingstarted-windows-deploy"></a>

**importante**  
El AWS OpsWorks Stacks servicio llegó al final de su vida útil el 26 de mayo de 2024 y se ha desactivado tanto para los clientes nuevos como para los existentes. Recomendamos encarecidamente a los clientes que migren sus cargas de trabajo a otras soluciones lo antes posible. Si tienes preguntas sobre la migración, ponte en contacto con el AWS Support equipo en [AWS Re:post](https://repost.aws/) o a través de Premium [AWS Support](https://aws.amazon.com/support).

La instalación de IIS crea un directorio `C:\inetpub\wwwroot` para el código de la aplicación y los archivos relacionados. El siguiente paso consiste en instalar una aplicación en dicho directorio. En este ejemplo, instalará una página de inicio HTML estática, `default.html`, en `C:\inetpub\wwwroot`. Puede ampliar fácilmente el sistema general para administrar situaciones más complejas, por ejemplo, las aplicaciones ASP.NET.

Puede incluir los archivos de la aplicación en el libro de recetas para que `install.rb` los copie en `C:\inetpub\wwwroot`. Para ver ejemplos prácticos, consulte [Ejemplo 6: Creación de archivos](cookbooks-101-basics-files.md). Sin embargo, este sistema no es ni muy flexible ni eficaz, y suele ser mejor separar el desarrollo del libro de recetas del desarrollo de las aplicaciones.

La solución idónea es disponer de una receta de implementación independiente que recupere el código de aplicación y los archivos relacionados de un repositorio (el repositorio que prefiera, no solo el repositorio del libro de recetas) y lo instale en cada instancia de servidor de IIS. Este sistema separa el desarrollo del libro de recetas del desarrollo de aplicaciones y, cuando se necesita actualizar la aplicación, permite ejecutar de nuevo la receta de implementación sin necesidad de actualizar los libros.

En este tema se muestra cómo implementar una receta sencilla que implementa `default.htm` en el servidor de IIS. Puede ampliar fácilmente este ejemplo para aplicaciones más complejas.

**Topics**
+ [Crear la aplicación y almacenarla en un repositorio](#w2ab1c14c47c17c23c25c15)
+ [Implementar una receta que implemente la aplicación](#w2ab1c14c47c17c23c25c17)
+ [Actualizar los libros de recetas de la instancia](#w2ab1c14c47c17c23c25c19)
+ [Añadir la receta a la capa de IIS personalizada](#w2ab1c14c47c17c23c25c21)
+ [Añadir una aplicación](#w2ab1c14c47c17c23c25c23)
+ [Implementar y abrir la aplicación](#w2ab1c14c47c17c23c25c25)

## Crear la aplicación y almacenarla en un repositorio
<a name="w2ab1c14c47c17c23c25c15"></a>

Puede utilizar el repositorio que prefiera para las aplicaciones. Para simplificar, en este ejemplo se almacena `default.htm` en un bucket de S3 público.

**Para crear la aplicación**

1. Cree un directorio denominado `iis-application` en una ubicación cómoda dentro de la estación de trabajo.

1. Añada un archivo `default.htm` a `iis-application` con el contenido siguiente.

   ```
   <!DOCTYPE html>
   <html>
     <head>
       <title>IIS Example</title>
     </head>
     <body>
       <h1>Hello World!</h1>
     </body>
   </html>
   ```

1. [Cree un bucket de S3](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html), [cargue el archivo `default.htm` en el bucket](https://docs.aws.amazon.com/AmazonS3/latest/gsg/PuttingAnObjectInABucket.html) y registre la URL para usarla después. Para simplificar, [publique el archivo](https://docs.aws.amazon.com/AmazonS3/latest/gsg/OpeningAnObject.html). 
**nota**  
Esta es una aplicación muy sencilla, pero puede ampliar sus principios básicos para gestionar aplicaciones de producción.  
Con aplicaciones más complejas con muchos archivos, es más sencillo crear un archivo.zip de `iis-application` y cargarlo en el bucket de S3.  
Después, puede descargar el archivo .zip y extraer su contenido en el directorio adecuado. No es necesario descargar varios archivos, crear una estructura de directorios, etcétera.
Con una aplicación de producción, probablemente le interese mantener los archivos como privados. Para ver un ejemplo de cómo hacer que una receta descargue archivos de un bucket de S3 privado, consulte [Uso del SDK para Ruby en una instancia OpsWorks de Stacks Windows](cookbooks-101-opsworks-s3-windows.md).
Puede almacenar la aplicación en cualquier repositorio adecuado.  
Normalmente, la aplicación se descarga utilizando la API pública de un repositorio. En este ejemplo se utiliza la API de Amazon S3. [Si, por ejemplo, guardas tu aplicación GitHub, puedes usar la GitHub API.](https://developer.github.com/guides/getting-started/)

## Implementar una receta que implemente la aplicación
<a name="w2ab1c14c47c17c23c25c17"></a>

Añada una receta llamada `deploy.rb` al directorio `iis-cookbook` `recipes`, con el contenido siguiente.

```
chef_gem "aws-sdk-s3" do
  compile_time false
  action :install
end

ruby_block "download-object" do
  block do
    require 'aws-sdk-s3'

    #1  
    # Aws.config[:ssl_ca_bundle] = 'C:\ProgramData\Git\bin\curl-ca-bundle.crt'
    Aws.use_bundled_cert!

    #2  
    query = Chef::Search::Query.new
    app = query.search(:aws_opsworks_app, "type:other").first
    s3region = app[0][:environment][:S3REGION]
    s3bucket = app[0][:environment][:BUCKET]
    s3filename = app[0][:environment][:FILENAME]

    #3  
    s3_client = Aws::S3::Client.new(region: s3region)
    s3_client.get_object(bucket: s3bucket,
                         key: s3filename,
                         response_target: 'C:\inetpub\wwwroot\default.htm')
  end 
  action :run
end
```

En este ejemplo se utiliza [SDK for Ruby v2](https://docs.aws.amazon.com/sdkforruby/api/index.html) para descargar el archivo. Sin embargo, OpsWorks Stacks no instala este SDK en las instancias de Windows, por lo que la receta comienza con [https://docs.chef.io/chef/resources.html#chef-gem](https://docs.chef.io/chef/resources.html#chef-gem)Resource, que se encarga de esa tarea.

**nota**  
El recurso `chef_gem` instala gemas en la versión Ruby dedicada de Chef, que es la versión que usan las recetas. Si desea instalar una gema en una versión Ruby para todo el sistema, utilice el recurso [gem\$1package](https://docs.chef.io/chef/resources.html#gem-package).

La mayor parte de la receta es un recurso [https://docs.chef.io/chef/resources.html#ruby-block](https://docs.chef.io/chef/resources.html#ruby-block) que ejecuta un bloque de código Ruby que utiliza SDK para Ruby para descargar `default.htm`. El código de `ruby_block` se puede dividir en las siguientes secciones, que corresponden a los comentarios numerados en el ejemplo de código. 

**1: Especificar un paquete de certificados**  
Amazon S3 utiliza SSL, por lo que necesita un certificado adecuado para descargar los objetos de un bucket de S3. El SDK para Ruby v2 no incluye un paquete de certificados, por lo que debes proporcionar uno y configurar el SDK para que Ruby lo use. OpsWorks Stacks no instala un paquete de certificados directamente, pero sí instala Git, que incluye un paquete de certificados (`curl-ca-bundle.crt`). Para mayor comodidad, en este ejemplo se configura SDK para Ruby para usar el paquete de certificados de Git para SSL. También puede instalar su propio paquete y configurar el SDK en consecuencia.

**2: Recuperar los datos del repositorio**  
Para descargar un objeto de Amazon S3, necesita la región de AWS, el nombre del bucket y el nombre de clave. Como se describe más adelante, en este ejemplo se proporciona esta información asociando un conjunto de variables de entorno con la aplicación. Cuando implementas una aplicación, OpsWorks Stacks agrega un conjunto de atributos al objeto de nodo de la instancia. Estos atributos son básicamente una tabla hash que contiene la configuración de las aplicaciones, incluidas las variables de entorno. Los atributos de aplicación para esta aplicación tendrán un aspecto parecido al siguiente, en formato JSON.   

```
{
  "app_id": "8f71a9b5-de7f-451c-8505-3f35086e5bb3",
  "app_source": {
      "password": null,
      "revision": null,
      "ssh_key": null,
      "type": "other",
      "url": null,
      "user": null
  },
  "attributes": {
      "auto_bundle_on_deploy": true,
      "aws_flow_ruby_settings": {},
      "document_root": null,
      "rails_env": null
  },
  "data_sources": [{"type": "None"}],
  "domains": ["iis_example_app"],
  "enable_ssl": false,
  "environment": {
      "S3REGION": "us-west-2",
      "BUCKET": "windows-example-app",
      "FILENAME": "default.htm"
  },
  "name": "IIS-Example-App",
  "shortname": "iis_example_app",
  "ssl_configuration": {
      "certificate": null,
      "private_key": null,
      "chain": null
  },
  "type": "other",
  "deploy": true
}
```
Las variables de entorno de la aplicación se almacenan en el atributo `[:environment]`. Para recuperarlas, utilice una consulta de búsqueda de Chef que recupere la tabla hash de la aplicación, que se encuentra en el nodo `aws_opsworks_app`. Esta aplicación se definirá como de tipo `other` para que se busquen aplicaciones de ese tipo. La receta aprovecha el hecho de que en esta instancia solo haya una aplicación, ya que la tabla hash que nos interesa es justo `app[0]`. Para mayor comodidad, la receta asigna después la región, el bucket y los nombres de archivo a variables.  
Para obtener más información sobre el uso de la búsqueda de Chef, consulte [Obtención de valores de atributo con la búsqueda de Chef](cookbooks-101-opsworks-opsworks-stack-config-search.md).

**3: Descargar el archivo**  
La tercera parte de la receta crea un [objeto cliente de S3](https://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html) y utiliza su método `[get\$1object](https://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html#get_object-instance_method)` para descargar `default.htm` en el directorio `C:\inetpub\wwwroot` de la instancia. 

**nota**  
Una receta es una aplicación de Ruby, por tanto, el código Ruby no tiene que estar necesariamente en un `ruby_block`. No obstante, el código del cuerpo de la receta se ejecuta en primer lugar, seguido en orden por los recursos. En este ejemplo, si pone el código de descarga en el cuerpo de la receta, dará error, porque el recurso `chef_gem` aún no habrá instalado . El código del recurso `ruby_block` se ejecuta cuando se ejecuta el recurso, después de que el recurso `chef_gem` haya instalado SDK para Ruby.

## Actualizar los libros de recetas de la instancia
<a name="w2ab1c14c47c17c23c25c19"></a>

OpsWorks Stacks instala automáticamente libros de cocina personalizados en las instancias nuevas. Pero está trabajando con una instancia existente, por lo que debe actualizar el libro de recetas manualmente.

**Para actualizar los libros de recetas de la instancia**

1. Cree un archivo de almacenamiento `.zip` de `iis-cookbook` y cárguelo en el bucket de S3.

   Este archivo sobrescribe el libro de recetas existente, pero la URL sigue siendo la misma, por lo que no es necesario actualizar la configuración de la pila.

1. Si la instancia no está online, reiníciela.

1. Una vez que la instancia está online, elija **Stack (Pila)** en el panel de navegación y, a continuación, elija **Run Command (Ejecutar comando)**.

1. Para **Command (Comando)**, elija [Update Custom Cookbooks (Actualizar libros de recetas personalizados)](workingstacks-commands.md). Este comando instala en la instancia el libro de recetas actualizado.

1. Elija **Update Custom Cookbooks (Actualizar libros de recetas personalizados)**. El comando podría tardar varios minutos en finalizar.

## Añadir la receta a la capa de IIS personalizada
<a name="w2ab1c14c47c17c23c25c21"></a>

Al igual que con `install.rb`, la mejor forma de administrar la implementación es asignar `deploy.rb` al evento del ciclo de vida adecuado. Por lo general, las recetas de implementación se asignan al evento de implementación (Deploy) y se denominan colectivamente recetas de implementación. Al asignar una receta al evento de implementación no se activa el evento. En lugar de esto:
+ En el caso de las instancias nuevas, OpsWorks Stacks ejecuta automáticamente las recetas de implementación una vez finalizadas las de configuración, por lo que las nuevas instancias tienen automáticamente la versión actual de la aplicación.
+ Con las instancias online, utilice un [comando deploy](workingapps-deploying.md) para instalar manualmente las aplicaciones nuevas o las actualizadas.

  Este comando activa un evento de implementación en las instancias de la pila que ejecuta las recetas de implementación.

**Para asignar deploy.rb al evento de implementación de la capa**

1. Selecciona **Capas** en el panel de navegación y, a continuación, selecciona **Recetas** en **Capa IISExample**.

1. En **Custom Chef Recipes (Recetas de Chef personalizadas)**, añada **iis-cookbook::deploy** al cuadro de recetas **Deploy (Implementar)** y elija **\$1** para añadir la receta a la capa.

1. Seleccione **Save (Guardar)** para guardar la nueva configuración. Las recetas de implementación personalizadas incluirán ahora `iis-cookbook::deploy`.

## Añadir una aplicación
<a name="w2ab1c14c47c17c23c25c23"></a>

La última tarea consiste en añadir una aplicación a la pila para que represente tu aplicación en el entorno de OpsWorks Stacks. Las aplicaciones incluyen metadatos, como el nombre visible de la aplicación y los datos necesarios para descargarla desde su repositorio.

**Para añadir la aplicación a la pila**

1. Elija **Apps (Aplicaciones)** en el panel de navegación y, a continuación, elija **Add an app (Añadir una aplicación)**.

1. Configure la aplicación con las siguientes opciones.
   + **Nombre**: I**IIS-Example-App**
   + **Tipo de repositorio**: **otro**
   + **Environment Variables**: añada las tres variables de entorno siguientes:
     + **S3REGION**: la región del bucket (en este caso, `us-west-1`).
     + **BUCKET**: el nombre del bucket, por ejemplo `windows-example-app`.
     + **FILENAME**: el nombre del archivo: **default.htm**.

1. Acepte los valores predeterminados para el resto de la configuración y, a continuación, elija **Add App (Añadir aplicación)** para añadir la aplicación a la pila.

**nota**  
En este ejemplo se utilizan variables de entorno para proporcionar los datos de descarga. Un enfoque alternativo consiste en utilizar un tipo de repositorio de S3 Archive y proporcionar la URL del archivo. OpsWorks Stacks añade la información, junto con los datos opcionales, como tus credenciales de AWS, al `app_source` atributo de la aplicación. La receta de implementación debe recuperar la URL de los atributos de la aplicación y analizarla para extraer la región, el nombre del bucket y el nombre del archivo.

## Implementar y abrir la aplicación
<a name="w2ab1c14c47c17c23c25c25"></a>

OpsWorks Stacks implementa automáticamente las aplicaciones en las nuevas instancias, pero no en las instancias en línea. Dado que la instancia ya se está ejecutando, debe implementar la aplicación manualmente.

**Para implementar la aplicación**

1. Elija **Apps (Aplicaciones)** en el panel de navegación y, a continuación, elija **deploy (implementar)** en la columna **Actions (Acciones)** de la aplicación.

1. **Command (Comando)** debe establecerse en **Deploy (Implementar)**. Elija **Deploy (Implementar)** en la parte inferior derecha de la página **Deploy App (Implementar aplicación)**. El comando podría tardar varios minutos en finalizar.

   Una vez finalizada la implementación, vuelva a la página **Apps (Aplicaciones)**. El indicador **Status (Estado)** muestra **successful (correcto)** en verde y junto al nombre de la aplicación habrá una marca de verificación verde que indica que la implementación se ha realizado correctamente.

**nota**  
Las aplicaciones de Windows son siempre del tipo **Other (Otro)**. Por tanto, al implementarse la aplicación, ocurre lo siguiente:  
Se agregan los datos de la aplicación a los [atributos de configuración e implementación de la pila](workingcookbook-json.md), como se ha descrito anteriormente.
Se activa un evento de implementación en las instancias de la pila que ejecuta las recetas de implementación personalizadas.

**nota**  
Para obtener más información sobre cómo solucionar implementaciones o aplicaciones fallidas, consulte [Depuración de recetas](troubleshoot-debug.md).

La aplicación ya está instalada. Puede abrirla eligiendo **Instances (Instancias)** en el panel **Navigation (Navegación)** y, después, la dirección IP pública de la instancia. Esto envía una solicitud HTTP a la instancia, y debería ver algo parecido a lo siguiente en el navegador.

![\[Text displaying "Hello World!" in large, bold font against a white background.\]](http://docs.aws.amazon.com/es_es/opsworks/latest/userguide/images/windows-iis-app.png)
