{"id":52562,"date":"2019-11-11T00:00:00","date_gmt":"2019-11-10T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/stroim-sobstvennyj-serverless-na-osnove-fn"},"modified":"2020-02-18T14:00:19","modified_gmt":"2020-02-18T11:00:19","slug":"stroim-sobstvennyj-serverless-na-osnove-fn","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","title":{"rendered":"Construimos nuestro propio serverless basado en Fn","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Construimos nuestro propio serverless basado en Fn\" src=\"\/wp-content\/uploads\/2019\/11\/e24cdf9b43a3323d617f33b2c1b44e51.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%91%D0%B5%D1%81%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F\">Computaci\u00f3n sin servidor<\/a><\/noindex> \u2014 una de las tendencias m\u00e1s destacadas en la computaci\u00f3n en la nube. El principio b\u00e1sico de operaci\u00f3n es que la infraestructura es responsabilidad del proveedor de servicios, no de los DevOps. La escalabilidad de los recursos se ajusta autom\u00e1ticamente a la carga y tiene una alta velocidad de cambio.<\/p>\n<p><\/p>\n<p>Otra caracter\u00edstica com\u00fan es la tendencia a minimizar y enfocar el c\u00f3digo, por lo que a veces se denominan computaci\u00f3n sin servidor \"funci\u00f3n como servicio\" (FaaS).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Hist\u00f3ricamente, el primer proveedor de servicios en la nube que ofreci\u00f3 FaaS con AWS Lambda fue Amazon, de donde proviene este nombre. Otros proveedores de servicios en la nube tambi\u00e9n ofrecen an\u00e1logos:<\/p>\n<p><\/p>\n<ul>\n<li>Cloud Functions de Google<\/li>\n<li>Azure Functions de Microsoft<\/li>\n<\/ul>\n<p><\/p>\n<p>Todas estas empresas ofrecen computaci\u00f3n sin servidor, escalabilidad autom\u00e1tica y pago solo por los recursos realmente utilizados, pero al mismo tiempo vinculan a los clientes a su producto propietario. Sin embargo, existen alternativas gratuitas de c\u00f3digo abierto para implementar computaci\u00f3n sin servidor. Cabe destacar:<\/p>\n<p><\/p>\n<ul>\n<li>La plataforma <noindex><a rel=\"nofollow\" href=\"https:\/\/openwhisk.apache.org\/\">Apache OpenWhisk<\/a><\/noindex>, desarrollada en el incubador de IBM,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.spring.io\/spring-cloud-function\/\">Spring Cloud Functions<\/a><\/noindex>, como parte de un ecosistema bastante rico del Spring Framework, que tambi\u00e9n puede utilizarse como fachada para AWS Lambda, Azure Functions y OpenWhisk,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/fnproject\">El proyecto Fn<\/a><\/noindex>, respaldado por Oracle.<\/li>\n<\/ul>\n<p><\/p>\n<p>Todos ellos son completamente independientes de la nube, es decir, se pueden instalar en cualquier nube, incluyendo la suya propia, p\u00fablica o privada, y, por supuesto, en Exoscale.<\/p>\n<p><\/p>\n<h2 id=\"kak-proekt-fn-ustroen\">C\u00f3mo est\u00e1 estructurado el proyecto Fn<\/h2>\n<p><\/p>\n<p>Fn se basa completamente en Docker, y consta de dos componentes principales:<\/p>\n<p><\/p>\n<ul>\n<li>Una herramienta de l\u00ednea de comandos (CLI), dise\u00f1ada para gestionar todos los aspectos de la infraestructura de Fn, y que interact\u00faa con el servidor de Fn,<\/li>\n<li>El propio servidor de Fn, una aplicaci\u00f3n est\u00e1ndar empaquetada en un contenedor de Docker.<\/li>\n<\/ul>\n<p><\/p>\n<p>Las funciones desplegadas en Fn tambi\u00e9n se ejecutan en contenedores separados, lo que permite soportar una variedad de lenguajes de programaci\u00f3n, por ejemplo\u2026 \u00a1Clojure!<\/p>\n<p><\/p>\n<p>Los argumentos de las funciones se pasan a trav\u00e9s de la entrada est\u00e1ndar (STDIN), y los resultados se escriben en la salida est\u00e1ndar (STDOUT). Si los argumentos o los valores devueltos no son valores simples (por ejemplo, un objeto JSON), pueden transformarse utilizando una capa de abstracci\u00f3n proporcionada por Fn en forma de un kit de desarrollo de funciones (FDK).<\/p>\n<p><\/p>\n<p>Para mayor comodidad, se ofrecen conjuntos de plantillas integradas que facilitan el despliegue de FaaS en una amplia gama de lenguajes y versiones diferentes (Go, varias versiones de Java, Python, etc.).<\/p>\n<p><\/p>\n<p>Crear FaaS es sencillo, siguiendo este esquema:<\/p>\n<p><\/p>\n<ul>\n<li>Desplegamos la funci\u00f3n utilizando CLI Fn: se crea un archivo de configuraci\u00f3n de la aplicaci\u00f3n para Fn, basado en la plantilla seleccionada.<\/li>\n<li>Desplegamos nuestra propia funci\u00f3n, de nuevo usando CLI Fn: la imagen del contenedor se coloca en un repositorio, despu\u00e9s de lo cual el servidor se notifica sobre la existencia y ubicaci\u00f3n de esta imagen.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Construimos nuestro propio serverless basado en Fn\" src=\"\/wp-content\/uploads\/2019\/11\/5add8b58c80e976cd61a156fdd0fba11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Principio de entrega de funciones en Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"lokalnaya-ustanovka-i-testirovanie-besservernyh-funkciy\">Instalaci\u00f3n local y pruebas de funciones sin servidor<\/h2>\n<p><\/p>\n<p>Comencemos a instalar Fn en la m\u00e1quina local. Primero, se instala Docker, como requiere Fn. Se asume que estamos en Debian\/Ubuntu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sudo apt-get update\n$ sudo apt-get install docker.io<\/code><\/pre>\n<p><\/p>\n<p>O bien, usa el gestor de paquetes\/compilaci\u00f3n de Docker seg\u00fan tu sistema. Luego, se puede pasar directamente a la instalaci\u00f3n de Fn CLI. Por ejemplo, usando curl:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ curl -LSs https:\/\/raw.githubusercontent.com\/fnproject\/cli\/master\/install | sh<\/code><\/pre>\n<p><\/p>\n<p>Si est\u00e1s trabajando en OSX con Homebrew instalado, puedes optar por otro enfoque:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ brew install fn\n\n==&gt; Descargando https:\/\/homebrew.bintray.com\/bottles\/fn-0.5.8.high_sierra.bottle.tar.gz\n==&gt; Descargando desde https:\/\/akamai.bintray.com\/b1\/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb\n######################################################################## 100.0%\n==&gt; Vertiendo fn-0.5.8.high_sierra.bottle.tar.gz\n  \/usr\/local\/Cellar\/fn\/0.5.8: 5 archivos, 16.7MB<\/code><\/pre>\n<p><\/p>\n<p>Ahora todo est\u00e1 listo para el despliegue inicial de nuestra funci\u00f3n utilizando CLI. Para simplificar, utilizaremos el entorno incorporado para ejecutar, por ejemplo, Node:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn init --runtime node --trigger http hellonode\n\nCreando funci\u00f3n en: \/hellonode\nPlantilla de funci\u00f3n generada.\nfunc.yaml creado.<\/code><\/pre>\n<p><\/p>\n<p>Se crear\u00e1 un nuevo directorio <code>hellonode<\/code> para el desarrollo posterior de nuestra funci\u00f3n Fn con algunos archivos de configuraci\u00f3n b\u00e1sicos. Dentro del nuevo directorio, puedes crear tu aplicaci\u00f3n, siguiendo los est\u00e1ndares del lenguaje o entorno de ejecuci\u00f3n que elegiste:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"># \u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 node \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:\n\n   hellonode\n   \u251c\u2500\u2500 func.js\n   \u251c\u2500\u2500 func.yaml\n   \u2514\u2500\u2500 package.json\n\n# \u0421\u0432\u0435\u0436\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 Java11 \u0442\u0430\u043a\u043e\u0435:\n\n   hellojava11\n   \u251c\u2500\u2500 func.yaml\n   \u251c\u2500\u2500 pom.xml\n   \u2514\u2500\u2500 src\n       \u251c\u2500\u2500 main\n       \u2502   \u2514\u2500\u2500 java\n       \u2502       \u2514\u2500\u2500 com\n       \u2502           \u2514\u2500\u2500 example\n       \u2502               \u2514\u2500\u2500 fn\n       \u2502                   \u2514\u2500\u2500 HelloFunction.java\n       \u2514\u2500\u2500 test\n           \u2514\u2500\u2500 java\n               \u2514\u2500\u2500 com\n                   \u2514\u2500\u2500 example\n                       \u2514\u2500\u2500 fn\n                           \u2514\u2500\u2500 HelloFunctionTest.java<\/code><\/pre>\n<p><\/p>\n<p>Fn crea la estructura inicial del proyecto, crea el archivo <code>func.yaml<\/code>, que contiene las configuraciones necesarias para Fn, y establece la plantilla para el c\u00f3digo en el lenguaje que elegiste.<\/p>\n<p><\/p>\n<p>En el caso del entorno de ejecuci\u00f3n Node, esto significa:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cat hellonode\/func.js\n\nconst fdk=require('@fnproject\/fdk');\n\nfdk.handle(function(input){\n  let name = 'World';\n  if (input.name) {\n    name = input.name;\n  }\n  return {'message': 'Hello ' + name}\n})<\/code><\/pre>\n<p><\/p>\n<p>Ahora, r\u00e1pidamente verificaremos nuestra funci\u00f3n localmente para ver c\u00f3mo funciona todo.<\/p>\n<p><\/p>\n<p>Para comenzar, iniciaremos el servidor Fn. Como se mencion\u00f3 antes, el servidor Fn es un contenedor Docker, por lo tanto, despu\u00e9s de iniciarse, ir\u00e1 y tomar\u00e1 la imagen del registro de Docker.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn start -d                    # iniciamos el servidor local en segundo plano\n\nNo se pudo encontrar la imagen 'fnproject\/fnserver:latest' localmente\nlatest: Descargando de fnproject\/fnserver\nff3a5c916c92: Descarga completa\n1a649ea86bca: Descarga completa\nce35f4d5f86a: Descarga completa\n\n...\n\nEstado: Imagen m\u00e1s nueva descargada para fnproject\/fnserver:latest\n668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5<\/code><\/pre>\n<p><\/p>\n<p>Para ejecutar nuestra funci\u00f3n, debe ser \"desplegada\". Para ello se requiere <code>nombre de la aplicaci\u00f3n<\/code>: en Fn, todas las aplicaciones deben estar definidas como espacios de nombres para las funciones relacionadas.<\/p>\n<p><\/p>\n<p>El CLI de Fn buscar\u00e1 el archivo <code>func.yaml<\/code> en el directorio actual, que se utilizar\u00e1 para configurar la funci\u00f3n. As\u00ed que primero debemos ir a nuestro directorio <code>hellonode<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cd hellonode\n$ fn deploy --app fnexo --local  # desplegamos la funci\u00f3n localmente, nombre de la aplicaci\u00f3n - fnexo.\n                                 # el par\u00e1metro local no sube la imagen al registro remoto,\n                                 # ejecut\u00e1ndolo directamente\n\nDesplegando hellonode en la aplicaci\u00f3n: fnexo\nVersi\u00f3n 0.0.2 aumentada\nConstruyendo la imagen nfrankel\/hellonode:0.0.3 .\nActualizando la funci\u00f3n hellonode usando la imagen nfrankel\/hellonode:0.0.3...\nAplicaci\u00f3n creada con \u00e9xito:  fnexo\nFunci\u00f3n creada con \u00e9xito: hellonode con nfrankel\/hellonode:0.0.3\nDesencadenador creado con \u00e9xito: hellonode-trigger<\/code><\/pre>\n<p><\/p>\n<p>Como se puede ver en la salida del comando, se est\u00e1 creando una nueva imagen de contenedor para Docker que contiene nuestra funci\u00f3n. La funci\u00f3n est\u00e1 lista para ser invocada, y tenemos dos maneras de hacerlo:<\/p>\n<p><\/p>\n<ul>\n<li>usando el comando Fn <code>invoke<\/code><\/li>\n<li>invoc\u00e1ndola directamente a trav\u00e9s de <code>http<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>mountsnoop.py <code>invoke<\/code> a trav\u00e9s de Fn simplemente emula el trabajo sobre HTTP para pruebas, lo cual es conveniente para una verificaci\u00f3n r\u00e1pida:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn invoke fnexo hellonode      # invocamos la funci\u00f3n hellonode de la aplicaci\u00f3n fnexo\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>Para invocar la funci\u00f3n directamente, se debe conocer la URL completa:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ curl http:\/\/localhost:8080\/t\/fnexo\/hellonode-trigger\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>El servidor Fn proporciona sus funciones a trav\u00e9s del puerto 8080, y, al parecer, la URL de la funci\u00f3n corresponde al esquema <code>t\/app\/function<\/code>, pero no completamente. A trav\u00e9s de HTTP, la funci\u00f3n no se invoca directamente, sino a trav\u00e9s de un llamado trigger, que, como su nombre indica, \"inicia\" la invocaci\u00f3n de la funci\u00f3n. Los triggers se definen en <code>`func.yml<\/code> el proyecto:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">schema_version: 20180708\nname: hellonode\nversion: 0.0.3\nruntime: node\nentrypoint: node func.js\nformat: json\ntriggers:\n- name: hellonode-trigger\n  type: http\n  source: \/hellonode-trigger    # URL del desencadenador<\/code><\/pre>\n<p><\/p>\n<p>Podemos cambiar el nombre del desencadenador para que coincida con el nombre de la funci\u00f3n, lo que simplificar\u00e1 todo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">triggers:\n- name: hellonode-trigger\n  type: http\n  source: \/hellonode    # coincide con el nombre de la funci\u00f3n<\/code><\/pre>\n<p><\/p>\n<p>Luego, reiniciamos el despliegue de la funci\u00f3n y la invocamos desde el nuevo desencadenador:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn deploy --app fnexo hellonode --local\n$ curl http:\/\/localhost:8080\/t\/fnexo\/hellonode\n\n{\"message\":\"Hola Mundo\"}<\/code><\/pre>\n<p><\/p>\n<p>\u00a1Todo funciona! \u00a1Es el momento perfecto para experimentar y publicar nuestro FaaS en el servidor!<\/p>\n<p><\/p>\n<h2 id=\"ustanovka-servisov-besservernyh-funkciy-na-sobstvennoy-infrastrukture\">Instalaci\u00f3n de servicios de funciones sin servidor en la infraestructura propia<\/h2>\n<p><\/p>\n<p>R\u00e1pidamente instalemos una m\u00e1quina virtual usando la CLI de Exoscale. Si a\u00fan no la has configurado, puedes utilizar <noindex><a rel=\"nofollow\" href=\"https:\/\/community.exoscale.com\/documentation\/tools\/exoscale-command-line-interface\/\">nuestro tutorial para un inicio r\u00e1pido<\/a><\/noindex>. Esta es una excelente herramienta que mejorar\u00e1 a\u00fan m\u00e1s tu productividad. <strong>\u00a1No olvides configurar una regla para abrir el puerto 8080 en el Grupo de Seguridad!<\/strong> Los siguientes comandos lanzar\u00e1n una m\u00e1quina virtual limpia, lista para alojar nuestras funciones:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ exo firewall create fn-securitygroup\n$ exo firewall add fn-securitygroup ssh --my-ip\n$ exo firewall add fn-securitygroup -p tcp -P 8080-8080 -c 0.0.0.0\/0\n$ exo vm create fn-server -s fn-securitygroup<\/code><\/pre>\n<p><\/p>\n<p>Luego, puedes entrar por ssh a la m\u00e1quina virtual e instalar el servidor Fn remoto:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ exo ssh fn-server\n\nNo se puede establecer la autenticidad del host '185.19.30.175 (185.19.30.175)'.\nLa huella digital de la clave ECDSA es SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.\n\u00bfEst\u00e1s seguro de que deseas continuar conect\u00e1ndote (s\u00ed\/no)? s\u00ed\nAdvertencia: '185.19.30.175' (ECDSA) se ha a\u00f1adido permanentemente a la lista de hosts conocidos.\nBienvenido a Ubuntu 18.04 LTS (GNU\/Linux 4.15.0-20-generic x86_64)<\/code><\/pre>\n<p><\/p>\n<p>Luego, instalamos Docker y el servidor Fn de la misma manera que ya se hizo en la m\u00e1quina local, iniciamos el servidor:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sudo apt-get update\n$ sudo apt-get install docker.io\n$ sudo systemctl start docker\n$ curl -LSs https:\/\/raw.githubusercontent.com\/fnproject\/cli\/master\/install | sh\n$ sudo fn start\n\n...\n\n    ______\n   \/ ____\/___\n  \/ \/_  \/ __ \n \/ __\/ \/ \/ \/ \/ \n\/_\/   \/_\/ \/_\/ \n    v0.3.643<\/code><\/pre>\n<p><\/p>\n<p>Fn est\u00e1 listo para recibir funciones. Para la transmisi\u00f3n de funciones al servidor remoto, utilizaremos el comando <code>deploy<\/code> desde la computadora local, omitiendo la bandera <code>--local<\/code>.<\/p>\n<p><\/p>\n<p>Adem\u00e1s, Fn requiere que se especifiquen la ubicaci\u00f3n del servidor Fn y el registro de Docker. Estos par\u00e1metros pueden establecerse a trav\u00e9s de variables de entorno <code>FN_API_URL<\/code> y <code>FN_REGISTRY<\/code> respectivamente, pero tambi\u00e9n se propone una forma m\u00e1s conveniente para la gesti\u00f3n f\u00e1cil de la creaci\u00f3n y gesti\u00f3n de configuraciones para el despliegue.<\/p>\n<p><\/p>\n<p>En t\u00e9rminos de Fn, la configuraci\u00f3n para el despliegue se llama <code>contexto<\/code>. El siguiente comando crear\u00e1 el contexto:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn create context exoscale --provider default --api-url http:\/\/185.19.30.175:8080 --registry nfrankel<\/code><\/pre>\n<p><\/p>\n<p>Puedes ver los contextos disponibles as\u00ed:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn list contexts\n\nCURRENT NAME      PROVIDER      API URL                      REGISTRY\n    default       default       http:\/\/localhost:8080\/\n    exoscale      default       http:\/\/185.19.30.175:8080    nfrankel\n<\/code><\/pre>\n<p><\/p>\n<p>Y cambiar al contexto que acaba de ser creado as\u00ed:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"> $ fn use context exoscale\n\n Ahora usando el contexto: exoscale<\/code><\/pre>\n<p><\/p>\n<p>A partir de este punto, la entrega de funciones Fn cargar\u00e1 im\u00e1genes Docker utilizando la cuenta seleccionada en DockerHub (en mi caso \u2014 <code>nfrankel<\/code>), despu\u00e9s de lo cual notificar\u00e1 al servidor remoto (en este ejemplo \u2014 <code>http:\/\/185.19.30.175:8080<\/code>) sobre la ubicaci\u00f3n y la versi\u00f3n de la \u00faltima imagen que contiene tu funci\u00f3n.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn deploy --app fnexo .   # ejecutado en la m\u00e1quina local desde el directorio hellonode\n\nDesplegando funci\u00f3n en: \\\/.\nDesplegando hellonode en la aplicaci\u00f3n: fnexo\nActualizado a la versi\u00f3n 0.0.5\nConstruyendo imagen nfrankel\\\/hellonode:0.0.5 .<\/code><\/pre>\n<p><\/p>\n<p>Finalmente:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ curl http:\\\/\\\/185.19.30.175:8080\\\/t\\\/fnexo\\\/hellonode\n\n{\"message\":\"Hola Mundo\"}<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Construimos nuestro propio serverless basado en Fn\" src=\"\/wp-content\/uploads\/2019\/11\/51a7b88cd6bf4953740cfac937b0acc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Ciclo de vida de la funci\u00f3n en computaci\u00f3n sin servidor basada en Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"preimuschestva-besservernyh-vychisleniy-na-svoih-moschnostyah\">Ventajas de la computaci\u00f3n sin servidor en sus propias instalaciones<\/h2>\n<p><\/p>\n<p>La computaci\u00f3n sin servidor es una soluci\u00f3n conveniente para la r\u00e1pida implementaci\u00f3n de partes independientes de la aplicaci\u00f3n que interact\u00faan con aplicaciones m\u00e1s complejas o microservicios.<\/p>\n<p><\/p>\n<p>A menudo, esto est\u00e1 asociado con el costo oculto de estar atado a un proveedor elegido, lo que, dependiendo del caso de uso espec\u00edfico y del volumen, puede llevar a mayores costos y a una disminuci\u00f3n de la flexibilidad en el futuro.<\/p>\n<p><\/p>\n<p>Las arquitecturas multicloud e h\u00edbridas tambi\u00e9n sufren en este caso, ya que uno puede encontrarse f\u00e1cilmente en una situaci\u00f3n en la que se desear\u00eda utilizar la computaci\u00f3n sin servidor, pero debido a la pol\u00edtica corporativa, esto puede ser imposible.<\/p>\n<p><\/p>\n<p>Fn es bastante f\u00e1cil de usar, puede proporcionar casi la misma interfaz FaaS, con pocos gastos. Elimina cualquier dependencia del proveedor, se puede instalar localmente o en cualquier proveedor de servicios en la nube de tu elecci\u00f3n. Tambi\u00e9n hay libertad en la elecci\u00f3n del lenguaje de programaci\u00f3n.<\/p>\n<p><\/p>\n<p>El art\u00edculo presenta solo los fundamentos de Fn, pero crear tu propio entorno de ejecuci\u00f3n es bastante sencillo, y la arquitectura general se puede ampliar utilizando el equilibrador de carga Fn, o alojando Fn detr\u00e1s de un proxy para protecci\u00f3n.<\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/475044\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0411\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0445 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u2014 \u0437\u0430\u0431\u043e\u0442\u0430 \u043d\u0435 DevOps\u2019\u043e\u0432, \u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 \u0443\u0441\u043b\u0443\u0433. \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0414\u0440\u0443\u0433\u0430\u044f \u043e\u0431\u0449\u0430\u044f \u0447\u0435\u0440\u0442\u0430 \u2014 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044f \u043a \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 &#171;\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430&#187; [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52562","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0421\u0442\u0440\u043e\u0438\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 serverless \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Fn | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-10T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:00:19+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Construimos nuestro propio serverless basado en Fn | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0421\u0442\u0440\u043e\u0438\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 serverless \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Fn | ProHoster","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-10T21:00:00+00:00","article:modified_time":"2020-02-18T11:00:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52562","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 04:03:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:41:24","updated":"2026-01-24 04:03:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/52562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=52562"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/52562\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=52562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=52562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=52562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}