Infraestrucutra como código: CloudFormation

Despliegue usando CloudFormation

Despliegue de una aplicación web con CloudFormation

Despliegue de una web estática en EC2 con NGINX usando CloudFormation

Requisitos

  • Instalar AWS CLI

Creación de la plantilla

Podemos tenerla en S3 o en local. En este caso la tendremos en local.

AWSTemplateFormatVersion: '2010-09-09'
Description: |
  Esta plantilla crea un grupo de seguridad con los puertos 22, 80 y 443 abiertos,
  crea una instancia EC2 con la AMI Amazon Linux 2023 y le asocia el grupo de seguridad.
  También crea una IP elástica y la asocia a la instancia EC2 mediante el recurso AWS::EC2::EIP.
  Configura nginx en la instancia EC2 y despliega una web estática en el directorio /usr/share/nginx/html. La web está en un recurso compartido en drive.google.com.
  En el output muestra la IP pública de la instancia EC2 (la IP elástica).  
Resources:
  MySecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: sg_web-nginx
      GroupDescription: Grupo de seguridad del web-nginx
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-04cb4ca688797756f
      InstanceType: t2.small
      SecurityGroups:
        - !Ref MySecurityGroup
      KeyName: vockey
      Tags:
        - Key: Name
          Value: nginx-user-data
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash -xe
            dnf update -y
            dnf install nginx -y
            dnf install unzip -y
            systemctl start nginx
            systemctl enable nginx  
            cd /usr/share/nginx/html
            curl -L -o airspace.zip  "https://drive.google.com/uc?export=download&id=1CXihQ2U-EFzHaO3OnggQ6qkkxdC-ibsp"
            unzip airspace.zip
            # extracción de archivos: están en la carpeta airspace.com
            cd airspace.com
            mv * ..
            cd ..
            rm -r airspace.com/
            rm airspace.zip 
  MyEIP:
    Type: AWS::EC2::EIP
    Properties:
      InstanceId: !Ref MyEC2Instance

Outputs:
  Website:
    Description: The Public IP for the EC2 Instance (Elasic IP)
    Value: !Sub 'http://${MyEIP.PublicIp}'

Despliegue de la plantilla

Recuerda que tienes que tener instalado AWS CLI

Conecta con el Learner Lab (Start Lab) y configura las credenciales de AWS CLI (AWS Details -> AWS CLI -> Show)

Descarga el archivo nginx-user-data.yml con la plantilla anterior y ejecuta el siguiente comando:

$ aws cloudformation create-stack --stack-name nginx-user-data --template-body file://nginx-user-data.yml

Comprobación del despliegue

$ aws cloudformation describe-stacks --stack-name nginx-user-data

Cuando se haya desplegado podremos comprobar que la web está desplegada en la IP pública de la instancia EC2 (la IP elástica que muestra el output del comando anterior).

Eliminación de la pila

$ aws cloudformation delete-stack --stack-name nginx-user-data

Propuestas

  • Configurar https con certbot automatizado.
  • Desplegar varias páginas en nginx para diferentes dominios.
Última modificación September 30, 2023: website s3 (9c3f86f)