# EXITO AWS CLI

Exito aws cli permite facilmente crear infrastructuras tipo Fargate y crear   CodePipelines dentro de AWS 


## Instalación
``` 
npm i exito-aws 
npm i -g exito-aws 
```

## Uso

En la linea de comandos
`exito-aws`

Nota: Si se desea crear el proyecto de netCore en DDD se ejecuta 

* Instalar el template en el equipo con el siguiente comando en consola:

dotnet new -i Exito.DDD.WebApi.NetCore

 

* En la consola ir a la ruta donde va a quedar el proyecto y ejecutar el comando:

dotnet new exitoddd --ProjectName <NombreProyecto>


![alt text](img/exito-aws-cli.JPG)

Las opciones que se listan al ejecutar la cli son:
* ECR
* Fargate LoadBalancer
* Fargate Apigateway
* CodePipeline
* Generar Buildspec
* Descargar archivo parametros
* Administrador

Las opciones que permiten crear servicios en AWS solicitan ingresar **Access Key Id, Secret access key y session token** , estos se obtienen desde el login de AWS en la cuenta seleccionando Command line or programmatic access

![alt text](img/loginaws.JPG)

y luego se visualiza las credenciales, damos clic en **Copy** para obtener el dato necesario

![alt text](img/credential.JPG)


Seleccionar una de las opciones.
* Seleccionando ECR.
Permite crear un Elastic Container Registry, donde se pueden subir las imagenes docker del proyecto

* Seleccionando Fargate.
* En nombre colocamos un nombre que no se encuentre en la cuenta de AWS y que no contenga espacios en blanco, mayusculas ni caracteres especiales
![alt text](img/namefargate.JPG)
* En archivo de parametros ingresamos el nombre del archivo json que debe estar en la ruta de la linea de comandos
![alt text](img/parameterfile.JPG)
* En esta opción se ingresa el Access key ID de la cuenta de AWS
![alt text](img/accesskey.JPG)
* En esta opción se ingresa el Secret access key de la cuenta de AWS
![alt text](img/secretaccess.JPG)
* Cuando los datos se ingresen correctamente la CLI mostrará el siguiente mensaje
![alt text](img/progresscreate.JPG)
* Si la infraestructura se crea correctamente mostrará el siguiente mensaje
![alt text](img/statuscomplete.JPG)

* Seleccionando la opción Codepipeline ingresamos el nombre del stack sin caracteres especiales ni espacios en blanco


## Parámetros 
### Fargate LoadBalancer y Fargate Apigateway

   
```
[
  {
    "ParameterKey": "BalancerListenerPort",
    "ParameterValue": "80",
    "Description": "Puerto de LoadBalancer por defecto es 80"
  }, 
  {
    "ParameterKey": "ClusterName",
    "ParameterValue": "clusteraws",
    "Description": "Cluster del ECS el nombre debe ser unico en la cuenta AWS"
  }, 
  {
    "ParameterKey": "CpuTask",
    "ParameterValue": "256",
    "Description": "CPU que se desea dar al task definition"
  }, 
  {
    "ParameterKey": "Environment",
    "ParameterValue": "development",
    "Description": "El ambiente del ECS opciones: development ó production"
  }, 
  {
    "ParameterKey": "HealthCheckPathName",
    "ParameterValue": "/api/environment",
    "Description": "La ruta del health del microservicio con esta ruta se valida si esta respondiendo el servicio debe ser un controller GET"
  }, 
  {
    "ParameterKey": "ImageRepositoryECR",
    "ParameterValue": "repositorioaws",
    "Description": "El nombre asignado al Repositorio ECR para la imagen docker"
  }, 
  {
    "ParameterKey": "MemoryTask",
    "ParameterValue": "512",
    "Description": "Memoria asignada al task definition"
  }, 
  {
    "ParameterKey": "SecurityGroupServicePort",
    "ParameterValue": "80",
    "Description": "Puerto del security group por defecto es 80"
  }, 
  {
    "ParameterKey": "ServiceName",
    "ParameterValue": "serviceaws",
    "Description": "Nombre que se asignará al service de ECS debe ser unico en la cuenta AWS"
  }, 
  {
    "ParameterKey": "TagECR",
    "ParameterValue": "latest",
    "Description": "el tag que posee el docker en el repositorio ECS por defecto es latest"
  }, 
  {
    "ParameterKey": "TaskQuantity",
    "ParameterValue": "1",
    "Description": "Cantidad de task definition asignado al ECS"
  }, 
  {
    "ParameterKey": "VpcName",
    "ParameterValue": "vpc-00xxxxxxxxxxx",
    "Description": "Vpc que se va a utilizar"
  }, 
  {
    "ParameterKey": "subnets",
    "ParameterValue": "subnet-0xxxxxxxxxxx,subnet-0xxxxxxxxxxx",
    "Description": "Subnet's utilizadas por ECS, deben ser minimo 2"
  }, 
  {
    "ParameterKey": "subnetsLoadBalancer",
    "ParameterValue": "subnet-0xxxxxxxxxx,subnet-0xxxxxxxxxxx",
    "Description": "Subnet's utilizadas por LoadBalancer, deben ser minimo 2"
  }, 
  {
    "ParameterKey": "ProjectName",
    "ParameterValue": "aplicacion",
    "Description": "El nombre del proyecto que va a tener asociado la infrastructura"
  }
]
```
#### Descripción parámetros
Estos parámetros deben de ir en un archivo .json ubicado en el path de la consola donde se ejecuta el comando de exito-aws-cli

**ParameterKey**: Se deben conservar los mismos nombres que existen en este campo debido a que todos son obligatorios.

**ParameterValue**: En este campo se definen los valores que va a tomar el key del parámetro.

A continuación se describe cada uno de los parámetros:

* **BalancerListenerPort**: Es el puerto que se asigna al listener del load balancer por defecto es "80".
* **ClusterName**: Nombre que se le asigna al cluster de ECS debe ser un nombre único en la cuenta de AWS, no debe tener espacios ni caracteres especiales.
* **CpuTask**: La capacidad de CPU que se le desea dar al task definition del ECS.
* **Environment**: Se describe en cual ambiente sera utilizada la infraestructura, las opciones son: developer, production. Se deben colocar en minúsculas.
* **HealthCheckPathName**: La ruta del endpoint con el cual se quiere identificar el health del servicio, por defecto es /api/environment
* **ImageRepositoryECR**: El nombre del repositorio del ECR creado para alojar la imagen docker.
* **MemoryTask**: La capacidad de memoria que se le desea asignar al task definition.
* **SecurityGroupServicePort**: El puerto que se le asigna al security group, por defecto es 80.
* **ServiceName**: El nombre que se le va a asignar al servicio de ECS, debe ser único en la cuenta de AWS, no debe tener espacios.
* **TagECR**: La etiqueta que se le colocó a la imagen docker subida en ECR, por defecto es latest.
* **TaskQuantity**: Se define la cantidad de task definition que va a tener ECS.
* **VpcName**: El nombre de la vpc que se va a asignar a la infraestructura.
* **subnets**: Las subnets que se asignan al ECS, deben ser mínimo 2 y deben estar en distinta zona de disponibilidad.
* **subnetsLoadBalancer**: Las subnets que se asignan al load balancer, deben ser mínimo 2 y deben estar en distinta zona de disponibilidad, pueden ser las mismas del parámetro "subnets" si es el caso.
* **ProjectName**: El nombre del proyecto al que se le asignará la infraestructura de AWS, no debe contener espacios.

### CodePipeline

```
[
  {
    "ParameterKey": "CodeCommitName",
    "ParameterValue": "repositorioaws",
    "Description": "Nombre del repositorio CodeCommit"
  }, 
  {
    "ParameterKey": "BranchRepository",
    "ParameterValue": "develop",
    "Description": "Branch a utilizar opciones: develop ó master"
  }, 
  {
    "ParameterKey": "CodePipelineName",
    "ParameterValue": "dev-pipeline",
    "Description": "Nombre del Codepipeline debe ser unico en la cuenta AWS"
  }, 
  {
    "ParameterKey": "Environment",
    "ParameterValue": "development",
    "Description": "El ambiente del ECS opciones: development ó production"
  },
  {
    "ParameterKey": "ProjectName",
    "ParameterValue": "aplicacion",
    "Description": "El nombre del proyecto que va a tener asociado el Codepipeline"
  },
  {
    "ParameterKey": "CodeBuildName",
    "ParameterValue": "build-aplicacion",
    "Description": "Nombre del Codebuild debe ser unico en la cuenta AWS"
  },
  {
    "ParameterKey": "S3CodePipeline",
    "ParameterValue": "codepipeline-us-east-1-731055110175",
    "Description": "Nombre del S3 de la cuenta donde se crea el Codepipeline --s3 cuentas--: coreecommerce: codepipeline-us-east-1-111801213144  devops: codepipeline-us-east-1-731055110175   "
  },
  {
    "ParameterKey": "CodePipelineRole",
    "ParameterValue": "mercado",
    "Description": "Nombre del role codepipeline destinado para la cli "
  },
  {
    "ParameterKey": "CodeBuildRole",
    "ParameterValue": "mercado",
    "Description": "Nombre del role codebuild destinado para la cli "
  }
]
```

### Buildspec ECS
```
[
  {
    "ParameterKey": "ProjectSln",
    "ParameterValue": "Ecommerce.Example.sln",
    "Description": "Nombre del archivo sln del proyecto"
  },
  {
    "ParameterKey": "ProjectName",
    "ParameterValue": "Ecommerce.Example",
    "Description": "Nombre del proyecto este se vera reflejado en SonarQube"
  },
  {
    "ParameterKey": "ProjectPathTest",
    "ParameterValue": "Ecommerce.Example.Test/Ecommerce.Example.Test.csproj",
    "Description": "Ruta completa del archivo csproj del proyecto de test"
  },
  {
    "ParameterKey": "ProjectTest",
    "ParameterValue": "Ecommerce.Example.Test",
    "Description": "Nombre de la carpeta base del proyecto de test"
  },
  {
    "ParameterKey": "ProjectRestore",
    "ParameterValue": "Ecommerce.Example.API/Ecommerce.Example.API.csproj",
    "Description": "Ruta completa del archivo csproj al que se le debe instalar las depencias "
  },
  {
    "ParameterKey": "SonarUrl",
    "ParameterValue": "http://18.213.XXX.XX",
    "Description": "Url del SonarQube"
  },
  {
    "ParameterKey": "SonarToken",
    "ParameterValue": "123456789XXXXXXXXXXX",
    "Description": "Token del SonarQube"
  }
]
```

### Buildspec Lambda
```
[
  {
    "ParameterKey": "ProjectSln",
    "ParameterValue": "Ecommerce.Example.sln",
    "Description": "Nombre del archivo sln del proyecto"
  },
  {
    "ParameterKey": "ProjectName",
    "ParameterValue": "Ecommerce.Example",
    "Description": "Nombre del proyecto este se vera reflejado en SonarQube"
  },
  {
    "ParameterKey": "ProjectPathTest",
    "ParameterValue": "Ecommerce.Example.Test/Ecommerce.Example.Test.csproj",
    "Description": "Ruta completa del archivo csproj del proyecto de test"
  },
  {
    "ParameterKey": "ProjectTest",
    "ParameterValue": "Ecommerce.Example.Test",
    "Description": "Nombre de la carpeta base del proyecto de test"
  },
  {
    "ParameterKey": "SonarUrl",
    "ParameterValue": "http://18.213.XXX.XX",
    "Description": "Url del SonarQube"
  },
  {
    "ParameterKey": "SonarToken",
    "ParameterValue": "123456789XXXXXXXXXXX",
    "Description": "Token del SonarQube"
  },
  {
    "ParameterKey": "PROJECT_LAMBDA",
    "ParameterValue": "Orders.Example.Lambda/src/Orders.Example.Lambda",
    "Description": "Ruta completa del proyecto de la lambda"
  },
  {
    "ParameterKey": "DIRECTORY_BASE_LAMBDA",
    "ParameterValue": "Orders.Example.Lambda",
    "Description": "Nombre de la carpeta base del proyecto de la lambda"
  }
]


```


