Creación de la primera instancia de Azure Functions contenedorizada en Azure Arc (versión preliminar)
En este artículo, creará una aplicación de funciones que se ejecuta en un contenedor de Linux y la implementará en un clúster de Kubernetes habilitado para Azure Arc desde un registro de contenedor. Al crear su propio contenedor, puede personalizar el entorno de ejecución de la aplicación de funciones. Para más información, consulte App Service, Functions y Logic Apps en Azure Arc.
Nota:
La compatibilidad con la implementación de un contenedor personalizado en un clúster de Kubernetes habilitado para Azure Arc está actualmente en versión preliminar.
También puede publicar las funciones en un clúster de Kubernetes habilitado para Azure Arc sin crear primero un contenedor. Creación de la primera función en Azure Arc (versión preliminar)
Elija el lenguaje de desarrollo
En primer lugar, usará herramientas de Azure Functions para crear el código del proyecto como una aplicación de funciones en un contenedor de Docker mediante una imagen base de Linux específica del lenguaje. Asegúrese de seleccionar el lenguaje que prefiere en la parte superior del artículo.
Core Tools genera automáticamente un Dockerfile para el proyecto que usa la versión más actualizada de la imagen base correcta para el lenguaje de funciones. Debe actualizar periódicamente el contenedor desde la imagen base más reciente y volver a implementar desde la versión actualizada del contenedor. Para obtener más información, consulte Creación de aplicaciones de funciones en contenedor.
Prerrequisitos
Antes de comenzar, deberá asegurarse de que cumple con los siguientes requisitos:
Instalar el SDK de .NET 8.0.
Instale Azure Functions Core Tools versión 4.0.5198 u otra posterior.
- Instale Azure Functions Core Tools, versión 4.x.
- Instale una versión de Node.jscompatible con Azure Functions.
- Instale una versión de Python compatible con Azure Functions.
- Instale el SDK de .NET 6.
Instale una versión del kit de desarrollo de Javacompatible con Azure Functions.
Instale Apache Maven, versión 3.0 o posterior.
- La CLI de Azure, versión 2.4 o posterior.
Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.
Para publicar la imagen de aplicación de funciones en contenedor que crea en un registro de contenedor, necesita un identificador de Docker y Docker en ejecución en el equipo local. Si no tiene un identificador de Docker, puede crear una cuenta de Docker.
También debe completar la sección Creación de un registro de contenedor del inicio rápido de Container Registry para crear una instancia del registro. Anote el nombre completo del servidor de inicio de sesión.
Creación y activación de un entorno virtual
En una carpeta adecuada, ejecute los comandos siguientes para crear y activar un entorno virtual denominado .venv
. Asegúrese de usar una de las versiones de Python compatibles con Azure Functions.
python -m venv .venv
source .venv/bin/activate
Si Python no instaló el paquete venv en la distribución de Linux, ejecute el siguiente comando:
sudo apt-get install python3-venv
Ejecute todos los comandos siguientes en este entorno virtual activado.
Creación y prueba de un proyecto local de Functions
En un terminal o símbolo del sistema, ejecute el siguiente comando para el lenguaje elegido a fin de crear un proyecto de aplicación de funciones en la carpeta actual.
func init --worker-runtime dotnet-isolated --docker
func init --worker-runtime node --language javascript --docker
func init --worker-runtime powershell --docker
func init --worker-runtime python --docker
func init --worker-runtime node --language typescript --docker
En una carpeta vacía, ejecute el comando siguiente para generar el proyecto de Functions desde un arquetipo Maven.
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker
El parámetro -DjavaVersion
indica al entorno de ejecución de Functions qué versión de Java debe usar. Use -DjavaVersion=11
si quiere que las funciones se ejecuten en Java 11. Cuando no se especifica -DjavaVersion
, el valor predeterminado de Maven es Java 8. Para obtener más información, consulte Versiones de Java.
Importante
Para llevar a cabo los pasos de este artículo, la variable de entorno JAVA_HOME
se debe establecer en la ubicación de instalación de la versión correcta del JDK.
Maven le pide los valores necesarios para finalizar la generación del proyecto en la implementación. Siga las solicitudes y proporcione la siguiente información:
Prompt | Valor | Descripción |
---|---|---|
groupId | com.fabrikam |
Un valor que identifica de forma única su proyecto entre todos los demás y que sigue las reglas de nomenclatura de paquetes de Java. |
artifactId | fabrikam-functions |
Un valor que es el nombre del archivo jar, sin un número de versión. |
version | 1.0-SNAPSHOT |
Seleccione el valor predeterminado. |
package | com.fabrikam.functions |
Un valor que es el paquete de Java para el código de función generado. Use el valor predeterminado. |
Escriba Y
o presione Entrar para confirmar.
Maven crea los archivos del proyecto en una carpeta nueva llamada artifactId que, en este ejemplo, es fabrikam-functions
.
La opción --docker
genera un Dockerfile para el proyecto, que define un contenedor adecuado para su uso con Azure Functions y el entorno de ejecución seleccionado.
Vaya a la carpeta del proyecto:
cd fabrikam-functions
Use el comando siguiente para agregar una función al proyecto mediante el comando siguiente, donde el argumento --name
es el nombre único de la función y el argumento --template
especifica el desencadenador de esta. func new
crea un archivo de código de C# en el proyecto.
func new --name HttpExample --template "HTTP trigger"
Use el comando siguiente para agregar una función al proyecto mediante el comando siguiente, donde el argumento --name
es el nombre único de la función y el argumento --template
especifica el desencadenador de esta. func new
crea una subcarpeta que coincide con el nombre de función que contiene un archivo de configuración denominado function.json.
func new --name HttpExample --template "HTTP trigger"
Para probar la función localmente, inicie el host en tiempo de ejecución de Azure Functions local en la carpeta raíz del proyecto:
func start
func start
npm install
npm start
mvn clean package
mvn azure-functions:run
Cuando vea el punto de conexión HttpExample
aparecer en la salida, vaya a ese punto de conexión. Debería ver un mensaje de bienvenida en la salida de la respuesta.
Cuando vea el punto de conexión HttpExample
aparecer en la salida, vaya a http://localhost:7071/api/HttpExample?name=Functions
. El explorador tiene que mostrar un mensaje "hello" que devuelve Functions
, el valor proporcionado al parámetro de consulta name
.
Presione Ctrl+C (Command+C en macOS) para detener el host.
Creación de la imagen de contenedor y verificación local
(Opcional) Examine el archivo Dockerfile en la carpeta raíz del proyecto. El archivo de Dockerfile describe el entorno necesario para ejecutar la aplicación de funciones en Linux. La lista completa de imágenes base admitidas para Azure Functions se puede encontrar en la página de imágenes base de Azure Functions.
En la carpeta raíz del proyecto, ejecute el comando docker build y especifique un nombre como azurefunctionsimage
y una etiqueta como v1.0.0
. Reemplace <DOCKER_ID>
por el identificador de su cuenta de Docker Hub. Este comando compila la imagen de Docker del contenedor.
docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
Cuando el comando se complete, podrá ejecutar el nuevo contenedor de forma local.
Para verificar la compilación, ejecute la imagen en un contenedor local con el comando docker run. Para ello, reemplace de nuevo <DOCKER_ID>
por el identificador de la cuenta de Docker Hub y agregue el argumento de puertos como -p 8080:80
:
docker run -p 8080:80 -it <DOCKER_ID>/azurefunctionsimage:v1.0.0
Una vez que la imagen se inicie en el contenedor local, vaya a http://localhost:8080/api/HttpExample
, donde tiene que aparecer el mismo mensaje de saludo que antes. Dado que la función desencadenada por HTTP que creó usa la autorización anónima, puede llamar a la función que se ejecuta en el contenedor sin tener que obtener una clave de acceso. Para más información, consulte Claves de autorización.
Una vez que la imagen se inicie en el contenedor local, vaya a http://localhost:8080/api/HttpExample?name=Functions
, donde debe aparecer el mismo mensaje "hello" que antes. Dado que la función desencadenada por HTTP que creó usa la autorización anónima, puede llamar a la función que se ejecuta en el contenedor sin tener que obtener una clave de acceso. Para más información, consulte Claves de autorización.
Después de comprobar la aplicación de funciones en el contenedor, presione Ctrl+C (Command+C en macOS para detener la ejecución.
Publicación de la imagen de contenedor en un registro
Para que la imagen de contenedor esté disponible para la implementación en un entorno de hospedaje, debe insertarla en un registro de contenedor.
Azure Container Registry es un servicio de registro privado para compilar, almacenar y proporcionar imágenes de contenedor y artefactos relacionados. Debe usar un servicio de registro privado para publicar los contenedores en los servicios de Azure.
Use este comando para iniciar sesión en la instancia del Registro mediante las credenciales actuales de Azure:
az acr login --name <REGISTRY_NAME>
En el comando anterior, reemplace
<REGISTRY_NAME>
por el nombre de la instancia de Container Registry.Use este comando para etiquetar la imagen con el nombre completo del servidor de inicio de sesión del Registro:
docker tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
Reemplace
<LOGIN_SERVER>
por el nombre completo del servidor de inicio de sesión del registro y<DOCKER_ID>
por el identificador de Docker.Use este comando para insertar el contenedor en la instancia del Registro:
docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
Creación de un entorno de Kubernetes de App Service
Antes de comenzar, debe crear un entorno de Kubernetes de App Service para un clúster de Kubernetes habilitado para Azure Arc.
Nota
Al crear el entorno, asegúrese de anotar el nombre de la ubicación personalizada y el nombre del grupo de recursos que la contiene. Puede usarlos para encontrar el identificador de la ubicación personalizada, que necesitará al crear la aplicación de funciones en el entorno.
Si no ha creado el entorno, acuda al administrador del clúster.
Adición de extensiones de la CLI de Azure
Inicie el entorno de Bash en Azure Cloud Shell.
Dado que estos comandos de la CLI aún no forman parte del conjunto de la CLI principal, agréguelos con los siguientes comandos:
az extension add --upgrade --yes --name customlocation
az extension remove --name appservice-kube
az extension add --upgrade --yes --name appservice-kube
Creación de recursos de Azure
Para poder implementar el contenedor en el nuevo entorno de Kubernetes de App Service, debe crear dos recursos más:
- Una cuenta de almacenamiento. Aunque en este artículo se crea una cuenta de almacenamiento, es posible que en algunos casos no sea necesaria. Para más información, consulte Clústeres habilitados para Azure Arc en el artículo consideraciones sobre el almacenamiento.
- Una aplicación de funciones, que proporciona el contexto para ejecutar el contenedor. La aplicación de funciones se ejecuta en el entorno de Kubernetes de App Service y se asigna al proyecto de función local. Una aplicación de función permite agrupar funciones como una unidad lógica para facilitar la administración, la implementación y el uso compartido de recursos.
Nota
Las aplicaciones de funciones se ejecutan en un entorno de Kubernetes de App Service en un plan dedicado (App Service). Al crear la aplicación de funciones sin un plan existente, se crea automáticamente un plan.
Crear cuenta de almacenamiento
Use el comando az storage account create para crear una cuenta de almacenamiento de uso general en el grupo de recursos y la región:
az storage account create --name <STORAGE_NAME> --location westeurope --resource-group myResourceGroup --sku Standard_LRS
Nota
En algunos casos no se necesita cuenta de almacenamiento. Para más información, consulte Clústeres habilitados para Azure Arc en el artículo consideraciones sobre el almacenamiento.
En el ejemplo anterior, reemplace <STORAGE_NAME>
por un nombre que sea apropiado para usted y único en Azure Storage. Los nombres deben contener entre 3 y 24 caracteres y solo letras minúsculas. Standard_LRS
especifica una cuenta de uso general, que es compatible con Functions. El valor --location
es una región estándar de Azure.
Crear la aplicación de función
Ejecute el comando az functionapp create para crear una aplicación de funciones en el entorno.
az functionapp create --name <APP_NAME> --custom-location <CUSTOM_LOCATION_ID> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD>
En este ejemplo, reemplace <CUSTOM_LOCATION_ID>
por el identificador de la ubicación personalizada que ha determinado para el entorno de Kubernetes de App Service. Además, reemplace <STORAGE_NAME>
por el nombre de la cuenta que usó en el paso anterior, <APP_NAME>
por un nombre globalmente único, y <DOCKER_ID>
o <LOGIN_SERVER>
por el id. de su cuenta de Docker Hub o del servidor de Container Registry, respectivamente. Al implementar desde un registro de contenedor, el nombre de la imagen indica la dirección URL del registro.
La primera vez que se crea la aplicación de funciones, se extrae la imagen inicial de Docker Hub.
Establecimiento de la configuración de aplicación necesaria
Ejecute los siguientes comandos para crear una configuración de aplicación para la cadena de conexión de la cuenta de almacenamiento:
storageConnectionString=$(az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv)
az functionapp config appsettings set --name <app_name> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=$storageConnectionString
Este código debe ejecutarse en Cloud Shell o en Bash en el equipo local. Reemplace <STORAGE_NAME>
por el nombre de la cuenta de almacenamiento y <APP_NAME>
por el nombre de la aplicación de funciones.
Invocación de la función en Azure
Como la función usa un desencadenador HTTP, para invocarla es preciso realizar una solicitud HTTP a su dirección URL en el explorador o con una herramienta como CURL.
Copie la dirección URL de invocación completa que se muestra en la salida del comando de publicación en una barra de direcciones del explorador, y anexe el parámetro de consulta ?name=Functions
. El explorador debe mostrar una salida similar a cuando ejecutó la función localmente.
Limpieza de recursos
Si quiere seguir trabajando con Azure Functions y con los recursos que ha creado en este artículo, puede dejarlos todos activos.
Cuando haya terminado de trabajar con esta implementación de la aplicación de funciones, elimine el grupo de recursos AzureFunctionsContainers-rg
para limpiar todos los recursos de ese grupo:
az group delete --name AzureFunctionsContainers-rg
Esto solo quita los recursos creados en este artículo. El entorno subyacente de Azure Arc permanece en su lugar.