Crear una instancia de EC2 en AWS con PowerShell

Todo el mundo sabe que este blog está a favor de las línea de comando. Con la CLI, los administradores pueden controlar los recursos de AWS desde la consola y escribir scripts de automatización. AWS tiene sus comandos para poder integrarse a PowerShell y poder sacarle jugo a la consola.

A modo de ejemplo, vamos a desplegar una instancia de EC2 mediante PowerShell, donde hablaremos de los requisitos previos a tener en cuenta y las dependencias necesarias para llevar a cabo esta tarea.

Prerequisitos

Lo primero, y fundamental, es contar con una cuenta de AWS para poder desplegar los recursos necesarios. En caso de no contar con ninguna, desde el siguiente enlace se puede generar una gratuita: AWS Free Tier

Debemos generar un usuario con privilegios, que vamos a usar durante el procedimiento. Para ello se encuentra el siguiente link a la documentación: Create an administrative user - AWS

Ya habiendo generado el usuario, vamos a crearle una key de acceso. Desde el portal web (https://aws.amazon.com/console), seleccionamos el usuario creado en IAM y luego vamos a la sección Create access key.

De las opciones disponibles, vamos a elegir Command Line Interface (CLI), ingresamos una descripción y listo! Tenemos la clave y el secret.

Recordar que estos valores aparecen una única vez, si bien es posible descargar un archivo .csv, lo ideal es poder guardarlos de forma segura por temas de seguridad.

PowerShell, yo te elijo!

Desde nuestra querida consola de PowerShell vamos a instalar el módulo corespondiente para poder trabajar con AWS:

Install-Module -Name AWS.Tools.Installer
Install-AWSToolsModule AWS.Tools.EC2, AWS.Tools.SimpleSystemsManagement

Ingresar la letra “A” desde el teclado para aceptar la instalación del módulo y el uso de la PowerShell Gallery como fuente de los recursos necesarios.

Perfil de usuario

Ya con todo lo necesario, el siguiente punto es inicializar las credenciales de AWS por medio del comando Initialize-AWSDefaultConfiguration donde a su vez, será necesario declarar los siguientes parámetros:

  • AccessKey
  • SecretKey
  • Region

AccessKey y SecretKey son los valores que obtuvimos anteriormente desde el portal web. En lo que respecta a la región, es necesario ingresar una para que sea la predeterminada al momento de desplegar recursos por medio de éste perfil de usuario. Para obtener la lista de las regiones disponibles:

Get-AWSRegion

Para el ejemplo en curso, se ha determinado la región “us-east-1”:

Initialize-AWSDefaultConfiguration -AccessKey "XXXXX" -SecretKey "YYYYY" -Region "us-east-1"

Perfecto! Credenciales generadas localmente. Sigamos adelante…

Dependencias necesarias

Antes de poder crear la instancia EC2, se deben tener varios recursos ya creados con anterioridad. Al ser un procedimiento introductorio, vamos a crear todas las dependencias y así obtener una visión más global de los recursos involucrados.

Para crear la configuración mínima para implementar y acceder a una instancia EC2, se necesita una nube privada virtual (en inglés: Virtual Private Cloud o VPC) con una subred, ciertos componentes de red y la propia instancia EC2.

VPC

¿Cómo creamos una nueva VPC? Primero se deberá definir un espacio de direcciones con la notación del standard de “enrutamiento entre dominios sin clases” (en inglés: Classless Inter-Domain Routing o CIDR):

$vpcCIDR = "10.0.0.0/16"

Y luego, ya podemos crear la VPC con el comando New-EC2Vpc:

$vpc = New-EC2Vpc -CidrBlock $vpcCidr

Por defecto, una VPC de AWS no tiene ningún DNS configurado, por lo que es necesario habilitarlo para que pueda ser utilizado por cualquier instancia que se ejecute dentro:

Edit-EC2VpcAttribute -VpcId $vpc.VpcId -EnableDnsSupport $true

Es posible que desee resolver públicamente los nombres de host de las instancias EC2. Para ello, se puede habilitar con lo siguiente:

Edit-EC2VpcAttribute -VpcId $vpc.VpcId -EnableDnsHostnames $true

Recursos de red

A continuación, debemos agregar un par de recursos de red para garantizar que la nueva instancia EC2 tenga acceso a Internet y que sea posible conectarnos a la misma. Estos recursos incluyen un internet gateway, una ruta a la route table y una subred dentro del espacio de direcciones de la VPC.

Un internet gateway es lo que permite que una VPC se comunique con Internet. Primero que nada, creamos uno de la siguiente manera:

$internetGateway = New-EC2InternetGateway

Luego, debemos asociarlo a la VPC:

Add-EC2InternetGateway -InternetGatewayId $internetGateway.InternetGatewayId VpcId $vpc.VpcId

Si desea que los nodos de la red, incluida la instancia EC2, sepan cómo enrutar a Internet, necesita una tabla de enrutamiento y una ruta:

$routeTable = New-EC2RouteTable -VpcId $vpc.VpcId

Agregamos una ruta predeterminada:

New-EC2Route -GatewayId $internetGateway.InternetGatewayId -RouteTableId $routeTable.RouteTableId -DestinationCidrBlock '0.0.0.0/0'

Dado que la ruta predeterminada es la única ruta que está agregando a la tabla de rutas, todo el tráfico pasa por el internet gateway. Se puede modificar esta regla o agregar más reglas, dependiendo de la necesidad.

Para crear una subred dentro de la subred de la VPC, primero busque una availability zone para crearla. El siguiente comando da como resultado la lista de todas las zonas disponibles en la región en la que nos encontramos trabajando:

Get-EC2AvailabilityZone -Región us-east-1 | ft RegionName, Status, ZoneName

Creamos la subred con la información necesaria:

$subred = New-EC2Subnet -VpcId $vpc.VpcId -CidrBlock '10.0.1.0/24' AvailabilityZone 'us-east-1c'

Luego, registre la subred en la route table:

Register-EC2RouteTable -RouteTableId $routeTable.RouteTableId -SubnetId $subnet.SubnetId

Crear la instancia EC2

La forma más fácil de crear una instancia EC2 es con Amazon Machine Images (AMI), permitiendo poner en marcha una máquina virtual con poco esfuerzo. Para ver las AMI que admite la región, debemos usar el comando Get-SSMLatestEc2Image.

A modo de ejemplo, para buscar imágenes Windows, podemos ejecutar:

Get-SSMLatestEC2Image -Path ami-windows-latest -Region us-east-1

O podemos mirar las imágenes de Amazon Linux disponibles también:

Get-SSMLatestEC2Image -Path ami-amazon-linux-latest -Region us-east-1

Para este ejemplo, seleccionamos Amazon Linux 2022 con el kernel 5.15:

$ami = Get-SSMLatestEC2Image -Path ami-amazon-linux-latest -Region us-east-1 -ImageName 'al2022-ami-minimal-kernel-5.15-x86_64'

Es posible filtrar por memoria y CPU. Como ejemplo, así es como puede encontrar cada tipo de instancia con un máximo de 4 GB de memoria y dos CPU:

Get-Ec2InstanceType -Region us-east-1 | `
  Select-Object InstanceType, @{Name = 'CPUs'; Expression = { $_.VCpuInfo.DefaultVCpus } }, `
  @{Name = 'MemoryGB'; Expression = { $_.MemoryInfo.SizeInMiB / 1024 } } | `
    Where-Object { $_.CPUs -lt 2 -and $_.MemoryGB -lt 4 } | `
    Sort-Object InstanceType | `
    Format-Table InstanceType,CPUs,MemoryGB

De la lista, seleccionamos t2.micro, que se encuentra en el free tier de AWS. Con el tipo de instancia EC2 seleccionado, creamos la instancia EC2:

$newEC2Sparams = @{ 
  Region = 'us-east-1' 
    ImageId = $ami 
    AssociatePublicIp = $false 
    InstanceType = 't2.micro' 
    SubnetId = $subnet.SubnetId 
} 
New-Ec2Instance @newEC2Sparams

Ahora, ya es posible encontrar la instancia con Get-Ec2InstanceStatus:

Get-Ec2InstanceStatus

Para eliminar esa instancia, recupere el ID de la instancia con el comando anterior y luego use Remove-EC2Instance:

$instanceId = (Get-Ec2InstanceStatus).InstanceId
Remove-EC2Instance -InstanceId $instanceId -Region us-east-1

Esto podemos hacerlo de esa manera ya que solo hay UNA ÚNICA instancia de EC2.

Ingresamos la letra “A” para confirmar todo y que proceda a eliminar la instancia creada anteriormente.

Listo! Hemos borrado la instancia de EC2. Resta borrar el resto de los recursos o seguir explorando AWS hasta dominarlo!

Happy scripting!

Comments