Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 23, 2023 09:49 pm GMT

Construye una arquitectura en AWS que se autodestruye sola

Te imaginas qu increble sera poder levantar una aplicacin que, en cuanto deje de ser utilizada, se pueda autodestruir sola?!

Una gran escena de The Mandalorian

If you rather read this article in English, click here!

En este artculo voy a compartirles algunos casos de uso, el diagrama de arquitectura y la explicacin de cada servicio que se utiliza en esta infraestructura de AWS. Lo padre de esta solucin es que puedes integrar cualquier otro servicio que necesites!

Motivacin

Suele suceder que desarrolladores lenvantan muchos recursos para hacer pruebas en sus aplicaciones y despus olvidan borrarlos, provocando gastos innecesarios.

Trabajando en una inciativa interna junto con un gran compaero mo, se me solicit encontrar una solucin creativa para este tipo de problema. Fue entonces que mi compaero se enfoc en crear una configuracin automtica de aplicacin dentro de una instancia EC2, mientras que yo me encargu de construir una infraestructura que pudiera borrarse automticamente.

En qu tipo de escenarios necesito esta arquitectura?

Imagina que quieres crear un ambiente de desarrollo para hacer pruebas de cdigo. Con esta arquitectura tu puedes crear y borrar ambientes bajo demanda, reduciendo costos e incluso incrementando la eficiencia.

Otro caso de uso sera en cargas de trabajo basada en eventos, como lo son conferencias o webinars. Para llevar a cabo estos eventos necesitas servidores y almacenamiento durante un periodo corto de tiempo. Al utilizar una arquitectura que se autodestruye, podras facilmente eliminar todo despus del evento, reduciendo as la complejidad.

Y qu tal una aplicacin para recuperacin de desastre? Si llega a existir una interrupcin de servicio, podras transferir el trfico a esta infraestructura. Una vez que la original se restaure y regrese el trfico, este ambiente puede eliminarse automticamente.

Cmo funciona?

Esta arquitectura es creada con AWS CloudFormation, un servicio de aprovisionamiento que utiliza infraestructura como cdigo. La ventaja de esta herramienta es que todos los recursos y dependencias se definen en plantillas y se despliegan en pilas, lo cual hace que sea sencillo borrar todo como una sola unidad.

Diagrama de arquitectura

Vamos a enfocarnos en los componentes principales de la arquitectura: Instancia EC2, la Alarma CloudWatch, Regla de EventBridge, la funcin Lambda y su respectivo IAM Rol, poltica y permiso. Hay otros recursos triviales que se necesitan como un grupo de seguridad, rol de instancia y perfil de instancia. Estos los vamos a omitir.

La pila de CloudFormation va a crear la siguiente arquitectura:

Arquitectura autodestructiva

Esta es la arquitectura en accin:

Arquitectura autodestructiva una vez que el app no esta en uso

Ahora si, vamos a entrar de lleno a cada uno de estos elementos!

Instancia WebServer

Antes que nada, necesitamos una aplicacin. Esta ser desplegada en una instancia EC2 y puedes configurarla como tu quieras. En este caso, yo la configur dentro de la seccin de UserData.

Esta es la definicin del recurso:

"WebServerInstance": {      "Type" : "AWS::EC2::Instance",      "Properties": {        "ImageId"            : "ami-0ab4d1e9cf9a1215a",        "InstanceType"       : "t3.small",        "KeyName"            : "PAR_DE_LLAVES",        "IamInstanceProfile" : "PERFIL_DE_INSTANCIA",        "BlockDeviceMappings" : [          {            "DeviceName" : "/dev/xvda",            "Ebs" : {              "VolumeType"           : "gp2",              "VolumeSize"           : "25",              "Encrypted"            : "true",              "KmsKeyId"             : "LLAVE_KMS",              "DeleteOnTermination"  : "true"            }          }],        "NetworkInterfaces" : [{            "AssociatePublicIpAddress"  : "true",            "DeleteOnTermination"       : "true",            "SubnetId"                  : "ID_DE_SUBRED",            "GroupSet"                  :  ["GRUPO_DE_SEGURIDAD"],            "DeviceIndex"               : 0          }],         "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [            "#!/bin/bash
", "CONFIGURACION_DE_APLICACION" ]]}} } }

Alarma de inactividad

Basndose en la mtrica de la utilizacin de CPU, podemos saber si la aplicacin sigue en uso.

La alarma esta programada para lo siguiente: Una vez que la mxima utilizacin del CPU llega a estar por debajo del 12% durante 1 hora, la alarma va a detener la instancia.

Nota: El lmite establecido para la utilizacin del CPU debe ser definido acorde a tu aplicacin. En mi caso, la aplicacin era un dashboard de Splunk, por lo tanto ese lmite era lo ms adecuado.

Esta es la definicin de la alarma:

"MyEC2Alarm": {        "Type": "AWS::CloudWatch::Alarm",        "Properties": {          "AlarmDescription": "Alarm to stop Instance",          "AlarmName": "Inactivity Alarm",          "AlarmActions":             [ "arn:aws:automate:us-east-1:ec2:stop" ],          "MetricName": "CPUUtilization",          "Namespace": "AWS/EC2",          "Statistic": "Maximum",          "Period": "1800",          "Threshold": "3",          "ComparisonOperator": "LessThanOrEqualToThreshold",          "EvaluationPeriods": "2",          "Dimensions": [            {              "Name": "InstanceId",              "Value": {  "Ref" :  "WebServerInstance" }            }          ]        }    }

Regla de EventBridge

La regla de EventBridge va a estar esperando que la aplicacin se encuentre en estado detenido, para entonces poder tomar accin. La accin ser invocar la funcin Lambda que contiene el cdigo que eliminar la *pila *de CloudFormation.

"EventRule": {      "DependsOn": ["ADLambda", "WebServerInstance"],      "Type": "AWS::Events::Rule",      "Properties": {        "Description": "EventRule for EC2 Stopping",        "EventPattern": {          "source": [            "aws.ec2"          ],          "detail-type": [            "EC2 Instance State-change Notification"          ],          "detail": {            "state": [              "stopped"            ],            "instance-id": [{              "Ref": "WebServerInstance"            }]          }        },        "State": "ENABLED",        "Targets": [{          "Arn": {"Fn::GetAtt": ["ADLambda", "Arn"] },          "Id": "ADLambda"        }]      }    }

Funcin Lambda

Una vez que la funcin sea invocada por la regla, sta va a correr el cdigo Python que eliminar la pila de CloudFormation... Increble, no?

Aqu la definicin de la Lambda:

"ADLambda": {      "Type": "AWS::Lambda::Function",      "Properties": {        "Handler": "index.handler",        "Role": {          "Fn::GetAtt": [              "LambdaExecutionRole",              "Arn"          ]        },        "Code": {          "ZipFile": "import boto3 
import os
import json
stack_name = os.environ['stackName']

def delete_cfn(stack_name):
try:
cfn = boto3.resource('cloudformation')
stack = cfn.Stack(stack_name)
stack.delete()
return \"SUCCESS\"
except:
return \"ERROR\"
def handler(event, context):
print(\"Received event:\")
print(json.dumps(event))
return delete_cfn(stack_name)" }, "Environment": { "Variables": { "stackName": { "Ref" : "AWS::StackName" } } }, "Runtime": "python3.9" }}

Cdigo Python

Este es el cdigo que se encuentra en la lnea ZipFile de la seccin anterior.

import boto3 import os import json stack_name = os.environ['stackName']def delete_cfn(stack_name): try: cfn = boto3.resource('cloudformation') stack = cfn.Stack(stack_name) stack.delete() return "SUCCESS" except: return "ERROR" def handler(event, context): print("Received event:") print(json.dumps(event)) return delete_cfn(stack_name)

Para que la funcin Lambda pueda funcionar, se necesita un rol, una poltica y un recurso de permiso. El IAM rol y la poltica van a permitir que la funcin pueda borrar la pila. Por otra parte, el permiso de Lambda ser el que permitir que la regla EventBridge pueda invocarla.

Rol de Lambda

Aquel IAM rol que permitir que la funcin borre los recursos de la pila, justo como lo establece la poltica.

"LambdaExecutionRole": {
"Type": "AWS::IAM::Role",
"DeletionPolicy": "Retain",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": ["lambda.amazonaws.com"]
},
"Action": ["sts:AssumeRole"]
}
]
},
"Path": "/"
}
}




Poltica de Lambda

Esta es la poltica con los permisos para eliminar cada recurso que la pila aprovision.

Nota: No olvides agregarle cualquier recurso extra que despliegues.

"LambdaExecutionPolicy": {
"Type": "AWS::IAM::Policy",
"DeletionPolicy": "Retain",
"Properties": {
"PolicyName": "autodestruction-policy",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["logs:"],
"Resource": "arn:aws:logs:
::"
},
{
"Effect": "Allow",
"Action": [ "cloudformation:DeleteStack" ],
"Resource": {
"Ref": "AWS::StackId"
}},
{
"Effect": "Allow",
"Action": [ "lambda:DeleteFunction" ],
"Resource": ""
},
{
"Effect": "Allow",
"Action": [ "events:RemoveTargets" ],
"Resource": "
"
},
{
"Effect": "Allow",
"Action": [ "events:DeleteRule" ],
"Resource": ""
},
{
"Effect": "Allow",
"Action": [ "lambda:RemovePermission" ],
"Resource": "
"
},
{
"Effect": "Allow",
"Action": ["iam:DeleteRolePolicy","iam:DeleteRole"],
"Resource": ""
},
{
"Effect": "Allow",
"Action": [ "ec2:TerminateInstances" ],
"Resource": [{ "Fn::Join": ["", [
"arn:aws:ec2:",{"Ref": "AWS::Region"},":",
{"Ref": "AWS::AccountId"}, ":instance/",
{"Ref": "WebServerInstance"}]]}]
},
{
"Effect": "Allow",
"Action": [ "iam:DeleteRolePolicy" ],
"Resource": "
"
},
{
"Effect": "Allow",
"Action": [ "cloudwatch:DeleteAlarms" ],
"Resource": [{"Fn::GetAtt" : ["MyEC2Alarm","Arn"]}]
}
]
},
"Roles": [{
"Ref" : "LambdaExecutionRole"
}]
}
}




Permiso para Lambda

Es el recurso que le va a permitir a la regla EventBridge invocar la funcin.

"PermissionForADLambda": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"FunctionName": {
"Ref": "ADLambda"
},
"Action": "lambda:InvokeFunction",
"Principal": "events.amazonaws.com",
"SourceArn": {
"Fn::GetAtt": [
"EventRule",
"Arn"
]
}
}
}




Ahora aqu viene lo interesante

La funcin Lambda no puede eliminar toda la pila porque estara borrando la poltica Lambda (la que tiene los permisos para borrar) y el rol Lambda (el que ejecuta esas poltica). Si los borramos, entonces cmo se podra terminar la tarea? No puede auto eliminarse y seguir continuando con lo que le pidi.

Incluso agregando dependencias para alterar el orden de eliminacin, eventualmente se llega al punto en donde se tienen que eliminar ese rol y esa poltica. Es por eso que estos dos recursos se separan de la destruccin con el parmetro de DeletionPolicy = Retain.

Se lo que estn pensando Ana, esto ya no es una arquitectura que se autodestruye por completo . Bueno, Esto es lo ms cercano que pude llegar! Y la ventaja es que ese rol y esa poltica no generan costos, asi que an asi estas ahorrando!

Fun fact: Estuve varias semanas tratando de encontrar una manera de que esta arquitectura funcionara, hasta que fui al AWS Summit Mexico City y le expliqu esto a un Arquitecto AWS (en la sala Pregunta a los Expertos). El fue el que me ilumin con la idea de la retencin de recursos!

Asi es como se debe de ver CloudFormation una vez que todo se ha creado:

Creacin de recursos en CloudFormation

Ahora lo nico queda es dejar de utilizar esa aplicacin y esperar

Eliminacin de recrusos en CloudFormation

Asi que anmate y despliega esta arquitectura, abre tu aplicacin y luego deja de utilizarla por unas horas. La utilizacin del CPU bajar y eventualmente comenzar a eliminarse. Crame, es bellsimo ver como todo se va eliminando automticamente.

Conclusin

Crear una arquitectura que se destruye automticamente al dejarla de utilizar, es una solucin que puedes implementar en tus proyectos para ahorrar gastos, incrementar la eficiencia de la aplicacin, reducir la complejidad e incluso recuperarte en el evento de un desastre.

Te invito a probarla, romper esta arquitectura y regresar con nuevas soluciones. Me encantara escuchar tu retroalimentacin o las mejoras que encuentres!

Sigamos construyendo!


Original Link: https://dev.to/aws-builders/construye-una-arquitectura-en-aws-que-se-autodestruye-sola-2m44

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To