- Descripción general del servicio
-
Guía del usuario
- Antes de comenzar
- Creación de una función de FunctionGraph
-
Configuración de la función
- Configuración de la inicialización
- Configuración de los parámetros básicos
- Configuración de permisos de delegación
- Configuración de VPC
- Configuración del montaje en disco
- Configuración de variables de entorno
- Configuración de encriptación
- Configuración de la notificación de ejecución asincrónica
- Configuración de Single-Instance Multi-Concurrency
- Gestión de versiones
- Gestión de alias
- Configuración de memoria dinámica
-
Creación de activadores
- Gestión de activadores
- Uso del activador de temporizador
- Uso de un activador APIG (dedicado)
- Uso de un activador OBS
- Uso de un activador Kafka
- Uso de un activador DIS
- Uso de un activador SMN
- Uso de un activador LTS
- Uso de un activador CTS
- Uso de un activador DDS
- Uso de un activador de GaussDB (for Mongo)
- Uso de un activador APIG (compartido)
- Uso de un activador de APIC
- Uso de un activador DMS (for RabbitMQ)
- Apéndice: Expresiones de Cron para un activador de temporizador de función
- Depuración de la función
- Invocación de la función
- Monitoreo
- Gestión de funciones
- Gestión de dependencias
- Gestión de instancias reservadas
- Aumento de la cuota de recursos
- Auditoría
-
Referencia de la API
- Antes de comenzar
- Descripción general de la API
- Llamar a APIs
-
Ejemplos
- Ejemplo 1: Uso de un activador de temporizador para descargar archivos periódicamente desde un bucket de OBS
- Ejemplo 2: Uso de un activador APIG para obtener una página web estática
- Ejemplo 3: Creación de una función mediante la carga de código en un bucket de OBS
- Ejemplo 4: Uso de una función para invocar una subfunción
-
Las API
- Invocación de función
- Cuotas de funciones
- Dependencias
- Eventos de prueba
- Rastreo de funciones
-
Gestión del ciclo de vida de la función
- Consulta de funciones
- Creación de una función
- Eliminación de una función o de la versión de función
- Consulta del código de una función
- Modificación del código de una función
- Consulta de los metadatos de una función
- Modificación de los metadatos de una función
- Actualización de las instancias máximas de una función
-
Versiones y Alias
- Consulta de todas las versiones y alias de una función
- Creación de un alias para una versión de función
- Eliminación de un alias de una versión de función
- Consulta del alias de una versión de función
- Modificación del alias de una versión de función
- Consulta de las versiones de una función
- Publicación de una versión de función
- Métricas de función
- Logs de funciones
- Importación y exportación de funciones
- Activadores de función
-
Notificación de ejecución asincrónica
- Consulta de parámetros de notificación de ejecución asíncrona de una versión de función
- Eliminación de la configuración de notificación de ejecución asincrónica
- Configuración de la notificación de ejecución asincrónica
- Consulta de configuración de notificación de ejecución asincrónica de todas las versiones de una función
- Consulta de solicitudes de invocación asincrónicas
- Detención de una solicitud de invocación asincrónica
- Políticas de permisos y acciones admitidas
- Apéndice
- Historial de revisiones
- Pasos iniciales
-
Preguntas frecuentes
-
Preguntas frecuentes generales
- ¿Qué es FunctionGraph?
- ¿Debo solicitar cualquier servicio de cómputo, de almacenamiento o de red al usar FunctionGraph?
- ¿Necesito desplegar mi código después de programar?
- ¿Cómo obtengo un token?
- ¿Qué tiempos de ejecución admite FunctionGraph?
- ¿Cuánto espacio en disco se asigna a cada función de FunctionGraph?
- ¿FunctionGraph admite versiones de funciones?
- ¿Cómo una función lee o escribe archivos?
- ¿Cómo configuro un proxy cuando uso CLI?
- ¿FunctionGraph admite la extensión de función?
- ¿Qué permisos se requieren para que un usuario de IAM use FunctionGraph?
- ¿Cómo puedo crear un paquete de dependencia de Python basado en una unidad de ODBC para la consulta de base de datos?
- ¿Cuál es la cuota de FunctionGraph?
- ¿Qué fuentes chinas admite FunctionGraph?
- ¿Cómo resuelve FunctionGraph un nombre de dominio de DNS privado?
- ¿Cómo resuelve una función basada en imagen de contenedor un nombre de dominio de DNS privado?
- ¿Cómo uso un nombre de dominio para acceder a una API registrada con API Gateway (Dedicado)?
- ¿Cuáles son los escenarios comunes de las aplicaciones de FunctionGraph?
- ¿Por qué no se puede resolver el nombre de dominio del gateway de la API vinculado a un servicio durante la invocación de funciones?
- ¿FunctionGraph admite la transmisión síncrona en el ancho de banda máximo de la intranet?
- ¿Qué pasa si se agota la cuota de VPC?
- ¿Cómo puedo imprimir logs de información, de errores o de aviso?
- ¿Puedo establecer el nombre de dominio de una API en mi propio nombre de dominio?
- ¿Puedo cambiar el tiempo de ejecución?
- ¿Puedo cambiar el nombre de una función?
- ¿Por qué se muestra el mensaje "failed to mount exist system path"?
- ¿Cómo obtengo los archivos cargados?
- ¿Por qué no puedo recibir respuestas por invocación síncrona?
- ¿Qué debo hacer si no se recopilan los logs de ejecución del os.system("command &")?
- ¿A qué directorios se puede acceder cuando se utiliza un tiempo de ejecución personalizado?
- ¿Qué versiones menores de Python 3.6 y 3.9 son compatibles?
- ¿Qué acciones se pueden utilizar en lugar de una delegación de gestión de VPC para el acceso a VPC?
- ¿Cuáles son las posibles causas del tiempo de espera de la función?
- ¿Cómo obtengo el código de una función?
- ¿Tiene un código de ejemplo para inicializadores?
- Preguntas frecuentes sobre la creación de funciones
-
Preguntas frecuentes sobre la gestión de activador
- ¿Qué eventos pueden activar una función de FunctionGraph?
- ¿Qué pasa si se informa el código de error 500 cuando las funciones que usan activadores de APIG devuelven cadenas?
- ¿Qué significan LATEST y TRIM_HORIZON en la configuración del activador de DIS?
- ¿Por qué no puedo activar o desactivar los activadores de OBS invocando a las API?
- ¿Cómo uso un activador de APIG para invocar una función?
- ¿Qué permisos se requieren para crear un activador de APIG?
- ¿Cómo obtiene una función la ruta de acceso o los parámetros de solicitud cuando se utiliza un activador de APIG?
- ¿Puedo crear un activador de OBS con un bucket existente?
-
Preguntas frecuentes sobre la gestión de dependencias
- ¿Qué es una dependencia?
- ¿Cuándo necesito una dependencia?
- ¿Cuáles son las precauciones para usar una dependencia?
- ¿Qué dependencias admite FunctionGraph?
- ¿FunctionGraph apoya las bibliotecas de clase?
- ¿Cómo uso las dependencias de FunctionGraph de terceros?
- ¿Cómo creo las dependencias de función?
- ¿Cómo puedo crear una dependencia en la consola de FunctionGraph?
- ¿Cómo agrego una dependencia a una función?
-
Preguntas frecuentes sobre la ejecución de funciones
- ¿Cuánto tiempo se tarda en ejecutar una función de FunctionGraph?
- ¿Qué pasos se incluyen en la ejecución de funciones?
- ¿Cómo procesa FunctionGraph las solicitudes simultáneas?
- ¿Qué sucede si las instancias de función no se han ejecutado durante mucho tiempo?
- ¿Cómo puedo acelerar el acceso inicial a una función?
- ¿Cómo sé la memoria real utilizada para la ejecución de funciones?
- ¿Por qué mi primera solicitud es lenta?
- ¿Qué hago si ocurre un error al invocar a una API?
- ¿Cómo leo el encabezado de solicitud de una función?
- ¿Puede una función invocar otra función?
- ¿Se puede invocar la interfaz de ejecución síncrona en una red privada?
- ¿Por qué una función utiliza más memoria de la estimada e incluso activa la alarma de falta de memoria?
- ¿Cómo puedo comprobar el uso de memoria cuando veo "runtime memory limit exceeded"?
- ¿Cómo soluciono los problemas de CrashLoopBackOff?
- Después de actualizar una imagen con el mismo nombre, las instancias reservadas siguen utilizando la imagen antigua. ¿Qué puedo hacer?
- Preguntas frecuentes sobre la configuración de funciones
- Preguntas frecuentes sobre el acceso a recursos externos
-
Otras preguntas frecuentes
- ¿Cómo puedo ver las reglas de alarma configuradas para una función?
- ¿FunctionGraph admite la descompilación de ZIP durante la transcodificación de vídeo?
- ¿Qué es una aplicación de FunctionGraph?
- ¿Necesito pagar por el tiempo de inicio en frío?
- ¿Por qué veo un mensaje que indica que mi cuenta fue suspendida al crear una función?
- ¿Se facturarán las solicitudes de todas mis funciones en diferentes regiones?
- Migración de FunctionGraph de V1 a V2
-
Preguntas frecuentes generales
- Actualmente, el contenido no está disponible en el idioma seleccionado. Sugerimos consultar la versión en inglés.
- What's New
- Function Overview
- Billing
-
Best Practices
- FunctionGraph Best Practices
- Processing DIS Data
- Integrating with LTS to Analyze Logs in Real Time
- Integrating with CTS to Analyze Login/Logout Security
- Periodically Starting or Stopping Huawei Cloud ECSs
- Building an HTTP Function with Spring Boot
- Creating a FunctionGraph Backend API That Uses a Custom Authorizer
- Uploading Files with FunctionGraph and APIG
- Processing IoT Data
- Workflow + Function: Automatically Processing Data in OBS
- Filtering Logs in Real Time by Using FunctionGraph and LTS
- Building an HTTP Function with Go
- Using FunctionGraph HTTP Functions to Process gRPC Requests
- Cold Start Optimization Practices
-
Developer Guide
- Overview
- Initializer
- Node.js
- Python
- Java
- Go
- C#
- PHP
- Development Tools
- SDK Reference
-
More Documents
-
User Guide (ME-Abu Dhabi Region)
- Service Overview
- Getting Started
- Before You Start
- Building Functions
-
Configuring Functions
- Configuring Initialization
- Configuring Basic Settings
- Configuring Agency Permissions
- Configuring the Network
- Configuring Disk Mounting
- Configuring Environment Variables
- Configuring Asynchronous Execution Notification
- Configuring Single-Instance Multi-Concurrency
- Managing Versions
- Managing Aliases
- Configuring Dynamic Memory
- Configuring Heartbeat Function
- Online Debugging
- Creating Triggers
- Invoking the Function
- Monitoring
- Function Management
- Dependency Management
- Reserved Instance Management
- Increasing Resource Quota
- Audit
-
FAQs
-
General FAQs
- What Is FunctionGraph?
- Do I Need to Apply for Any Compute, Storage, or Network Services When Using FunctionGraph?
- Do I Need to Deploy My Code After Programming?
- What Runtimes Does FunctionGraph Support?
- How Much Disk Space Is Allocated to Each FunctionGraph Function?
- Does FunctionGraph Support Function Versioning?
- How Does a Function Read or Write Files?
- Does FunctionGraph Support Function Extension?
- Which Permissions Are Required for an IAM User to Use FunctionGraph?
- How Can I Create an ODBC Drive-based Python Dependency Package for Database Query?
- What Is the Quota of FunctionGraph?
- How Does FunctionGraph Resolve a Private DNS Domain Name?
- How Does a Container Image–based Function Resolve a Private DNS Domain Name?
- How Do I Use a Domain Name to Access an API Registered with API Gateway (Dedicated)?
- What Are the Common Application Scenarios of FunctionGraph?
- Why Can't the API Gateway Domain Name Bound to a Service Be Resolved During Function Invocation?
- Does FunctionGraph Support Synchronous Transmission at the Maximum Intranet Bandwidth?
- What If the VPC Quota Is Used Up?
- How Can I Print Info, Error, or Warn Logs?
- Can I Set the Domain Name of an API to My Own Domain Name?
- Can I Change the Runtime?
- Can I Change a Function's Name?
- Why Is Message "failed to mount exist system path" Displayed?
- How Do I Obtain Uploaded Files?
- Why Can't I Receive Responses for Synchronous Invocation?
- What Should I Do If the os.system("command &") Execution Logs Are Not Collected?
- Which Directories Can Be Accessed When a Custom Runtime Is Used?
- Which Minor Versions of Python 3.6 and 3.9 Are Supported?
- Which Actions Can Be Used Instead of a VPC Administrator Agency for VPC Access?
- What Are the Possible Causes for Function Timeout?
- How Do I Obtain the Code of a Function?
- Do You Have Sample Code for Initializers?
- How Do I Enable Structured Log Query?
- Can I Enable a Listening Port in a Function to Receive External TCP Requests via EIP?
- Function Creation FAQs
-
Trigger Management FAQs
- What Events Can Trigger a FunctionGraph Function?
- What If Error Code 500 Is Reported When Functions that Use APIG Triggers Return Strings?
- What Do LATEST and TRIM_HORIZON Mean in DIS Trigger Configuration?
- Why Can't I Enable or Disable OBS Triggers by Calling APIs?
- How Do I Use an APIG Trigger to Invoke a Function?
- How Does a Function Obtain the Request Path or Parameters When Using an APIG Trigger?
- Can I Create an OBS Trigger with an Existing Bucket?
-
Dependency Management FAQs
- What Is a Dependency?
- When Do I Need a Dependency?
- What Are the Precautions for Using a Dependency?
- What Dependencies Does FunctionGraph Support?
- Does FunctionGraph Support Class Libraries?
- How Do I Use Third-Party Dependencies on FunctionGraph?
- How Do I Create Function Dependencies?
- How Do I Create a Dependency on the FunctionGraph Console?
- How Do I Add a Dependency to a Function?
-
Function Execution FAQs
- How Long Does It Take to Execute a FunctionGraph Function?
- Which Steps Are Included in Function Execution?
- How Does FunctionGraph Process Concurrent Requests?
- What If Function Instances Have Not Been Executed for a Long Time?
- How Can I Speed Up Initial Access to a Function?
- How Do I Know the Actual Memory Used for Function Execution?
- Why Is My First Request Slow?
- What Do I Do If an Error Occurs When Calling an API?
- How Do I Read the Request Header of a Function?
- Why Does a Function Use More Memory Than Estimated and Even Trigger the Out of Memory Alarm?
- How Do I Check the Memory Usage When Seeing "runtime memory limit exceeded"?
- How Do I Troubleshoot "CrashLoopBackOff"?
- After I Updated an Image with the Same Name, Reserved Instances Still Use the Old Image. What Can I Do?
- Function Configuration FAQs
- External Resource Access FAQs
- Other FAQs
-
General FAQs
-
API Reference (ME-Abu Dhabi Region)
- Before You Start
- API Overview
- Calling APIs
- Function Model Definition
-
Function Management Zone APIs
- Querying a Function List
- Querying the Metadata of a Function
- Querying the Code of a Function
- Creating a Function
- Deleting a Function or Function Version
- Modifying the Code of a Function
- Modifying the Metadata of a Function
- Publishing a Function Version
- Querying the Versions of a Function
- Creating an Alias for a Function Version
- Modifying the Alias Information About a Function Version
- Deleting an Alias of a Function Version
- Querying the Alias Information About a Function Version
- Querying the Version Alias List of a Function
- Querying All Triggers of a Function
- Querying the Information About a Trigger
- Deleting All Triggers of a Function
- Creating a Trigger
- Deleting a Trigger
- Function Data Zone APIs
- Permissions Policies and Supported Actions
- Appendix
- Change History
- Developer Guide (ME-Abu Dhabi Region)
-
User Guide (Kuala Lumpur Region)
- Service Overview
- Getting Started
- Before You Start
- Building Functions
-
Configuring Functions
- Configuring Initialization
- Configuring Basic Settings
- Configuring Agency Permissions
- Configuring the Network
- Configuring Disk Mounting
- Configuring Environment Variables
- Configuring Asynchronous Execution Notification
- Configuring Single-Instance Multi-Concurrency
- Managing Versions
- Managing Aliases
- Configuring Dynamic Memory
- Online Debugging
- Creating Triggers
- Invoking the Function
- Monitoring
- Function Management
- Dependency Management
- Reserved Instance Management
- Audit
-
FAQs
-
General FAQs
- What Is FunctionGraph?
- Do I Need to Apply for Any Compute, Storage, or Network Services When Using FunctionGraph?
- Do I Need to Deploy My Code After Programming?
- What Runtimes Does FunctionGraph Support?
- How Much Disk Space Is Allocated to Each FunctionGraph Function?
- Does FunctionGraph Support Function Versioning?
- How Does a Function Read or Write Files?
- Does FunctionGraph Support Function Extension?
- Which Permissions Are Required for an IAM User to Use FunctionGraph?
- How Can I Create an ODBC Drive-based Python Dependency Package for Database Query?
- What Is the Quota of FunctionGraph?
- How Does a Container Image–based Function Resolve a Private DNS Domain Name?
- How Do I Use a Domain Name to Access an API Registered with API Gateway (Dedicated)?
- What Are the Common Application Scenarios of FunctionGraph?
- Why Can't the API Gateway Domain Name Bound to a Service Be Resolved During Function Invocation?
- Does FunctionGraph Support Synchronous Transmission at the Maximum Intranet Bandwidth?
- What If the VPC Quota Is Used Up?
- How Can I Print Info, Error, or Warn Logs?
- Can I Set the Domain Name of an API to My Own Domain Name?
- Can I Change the Runtime?
- Can I Change a Function's Name?
- Why Is Message "failed to mount exist system path" Displayed?
- How Do I Obtain Uploaded Files?
- Why Can't I Receive Responses for Synchronous Invocation?
- What Should I Do If the os.system("command &") Execution Logs Are Not Collected?
- Which Directories Can Be Accessed When a Custom Runtime Is Used?
- Which Minor Versions of Python 3.6 and 3.9 Are Supported?
- Which Actions Can Be Used Instead of a VPC Administrator Agency for VPC Access?
- What Are the Possible Causes for Function Timeout?
- How Do I Obtain the Code of a Function?
- Do You Have Sample Code for Initializers?
- How Do I Enable Structured Log Query?
- Can I Enable a Listening Port in a Function to Receive External TCP Requests via EIP?
- Function Creation FAQs
-
Trigger Management FAQs
- What If Error Code 500 Is Reported When Functions that Use APIG Triggers Return Strings?
- What Do LATEST and TRIM_HORIZON Mean in DIS Trigger Configuration?
- Why Can't I Enable or Disable OBS Triggers by Calling APIs?
- How Do I Use an APIG Trigger to Invoke a Function?
- How Does a Function Obtain the Request Path or Parameters When Using an APIG Trigger?
- Can I Create an OBS Trigger with an Existing Bucket?
-
Dependency Management FAQs
- What Is a Dependency?
- When Do I Need a Dependency?
- What Are the Precautions for Using a Dependency?
- What Dependencies Does FunctionGraph Support?
- Does FunctionGraph Support Class Libraries?
- How Do I Use Third-Party Dependencies on FunctionGraph?
- How Do I Create Function Dependencies?
- How Do I Create a Dependency on the FunctionGraph Console?
- How Do I Add a Dependency to a Function?
-
Function Execution FAQs
- How Long Does It Take to Execute a FunctionGraph Function?
- Which Steps Are Included in Function Execution?
- How Does FunctionGraph Process Concurrent Requests?
- What If Function Instances Have Not Been Executed for a Long Time?
- How Can I Speed Up Initial Access to a Function?
- How Do I Know the Actual Memory Used for Function Execution?
- Why Is My First Request Slow?
- What Do I Do If an Error Occurs When Calling an API?
- How Do I Read the Request Header of a Function?
- Why Does a Function Use More Memory Than Estimated and Even Trigger the Out of Memory Alarm?
- How Do I Check the Memory Usage When Seeing "runtime memory limit exceeded"?
- How Do I Troubleshoot "CrashLoopBackOff"?
- After I Updated an Image with the Same Name, Reserved Instances Still Use the Old Image. What Can I Do?
- Function Configuration FAQs
- External Resource Access FAQs
- Other FAQs
-
General FAQs
- Change History
-
API Reference (Kuala Lumpur Region)
- Before You Start
- API Overview
- Calling APIs
- Examples
-
APIs
- Function Invocation
- Function Quotas
- Dependencies
- Test Events
- Function Tracing
-
Function Lifecycle Management
- Querying Functions
- Creating a Function
- Deleting a Function or Function Version
- Querying the Code of a Function
- Modifying the Code of a Function
- Querying the Metadata of a Function
- Modifying the Metadata of a Function
- Updating Max. Instances of a Function
- Enabling or Disabling the Snapshot Function
- Querying Snapshot Status
- Querying Resource Tags
- Querying Resources
- Deleting Resource Tags
- Creating Resource Tags
- Creating a VPC Endpoint
- Deleting a VPC Endpoint
- Versions and Aliases
- Function Metrics
- Function Logs
- Reserved Instances
- Function Import and Export
- Function Triggers
-
Asynchronous Execution Notification
- Querying Asynchronous Execution Notification Settings of a Function Version
- Deleting Asynchronous Execution Notification Settings
- Configuring Asynchronous Execution Notification
- Querying Asynchronous Execution Notification Settings of a Function's All Versions
- Querying Asynchronous Invocation Requests
- Stopping an Asynchronous Invocation Request
- Appendix
- Developer Guide (Kuala Lumpur Region)
-
User Guide (ME-Abu Dhabi Region)
- Videos
Copiado.
Desarrollo de una función HTTP
Introducción
Cuando se desarrolla una función HTTP usando una imagen personalizada, despliegue un servidor HTTP en la imagen y escuche las solicitudes del puerto 8000. Las funciones HTTP solo admiten activadores de APIG.
Paso 1: Preparar el entorno
Para realizar las operaciones descritas en esta sección, asegúrese de que tiene los permisos FunctionGraph Administrator, esto es, los permisos completos de FunctionGraph. Para obtener más información, vea la Gestión de permisos.
Paso 2: Crear una imagen
Tome el SO Linux x86 de 64 bits como ejemplo.
- Cree una carpeta.
mkdir custom_container_http_example && cd custom_container_http_example
- Despliegue un servidor HTTP. Node.js se utiliza como ejemplo. Para obtener más información sobre otros idiomas, consulte la sección Creación de una función HTTP.
Cree el archivo main.js para introducir el marco de Express, recibir solicitudes de POST, imprimir el cuerpo de la solicitud como salida estándar y devolver "Hello FunctionGraph, method POST" al cliente.
const express = require('express'); const PORT = 8000; const app = express(); app.use(express.json()); app.post('/*', (req, res) => { console.log('receive', req.body); res.send('Hello FunctionGraph, method POST'); }); app.listen(PORT, () => { console.log(`Listening on http://localhost:${PORT}`); });
- Cree el archivo package.json para npm para que pueda identificar el proyecto y procesar las dependencias del proyecto.
{ "name": "custom-container-http-example", "version": "1.0.0", "description": "An example of a custom container http function", "main": "main.js", "scripts": {}, "keywords": [], "author": "", "license": "ISC", "dependencies": { "express": "^4.17.1" } }
- name: Nombre del proyecto
- version: Versión del proyecto
- main: Archivo de entrada de aplicación
- dependencies: Todas las dependencias disponibles del proyecto en npm
- Cree un Dockerfile.
FROM node:12.10.0 ENV HOME=/home/custom_container ENV GROUP_ID=1003 ENV GROUP_NAME=custom_container ENV USER_ID=1003 ENV USER_NAME=custom_container RUN mkdir -m 550 ${HOME} && groupadd -g ${GROUP_ID} ${GROUP_NAME} && useradd -u ${USER_ID} -g ${GROUP_ID} ${USER_NAME} COPY --chown=${USER_ID}:${GROUP_ID} main.js ${HOME} COPY --chown=${USER_ID}:${GROUP_ID} package.json ${HOME} RUN cd ${HOME} && npm install RUN chown -R ${USER_ID}:${GROUP_ID} ${HOME} RUN find ${HOME} -type d | xargs chmod 500 RUN find ${HOME} -type f | xargs chmod 500 USER ${USER_NAME} WORKDIR ${HOME} EXPOSE 8000 ENTRYPOINT ["node", "main.js"]
- FROM: Especificar la imagen básica node:12.10.0. La imagen básica es obligatoria y su valor se puede cambiar.
- ENV: Establece las variables de entorno HOME (/home/custom_container), GROUP_NAME y USER_NAME (custom_container), USER_ID y GROUP_ID (1003). Estas variables de entorno son obligatorias y sus valores pueden cambiarse.
- RUN: Utilice el formato RUN <Command>. Por ejemplo, RUN mkdir -m 550 ${HOME}, que significa crear el directorio home para el usuario ${USER_NAME} durante la construcción de contenedores.
- USER: Cambie al usuario ${USER_NAME}.
- WORKDIR: Cambie el directorio de trabajo al directorio home del usuario ${USER_NAME}.
- COPY: Copie main.js y package.json al directorio home del usuario ${USER_NAME} en el contenedor.
- EXPOSE: Exponga el puerto 8000 del contenedor. No cambie este parámetro.
- ENTRYPOINT: Ejecute el comando node main.js para iniciar el contenedor. No cambie este parámetro.
NOTA:
- Puede utilizar cualquier imagen básica.
- En el entorno de nube, UID 1003 y GID 1003 se usan para iniciar el contenedor por defecto. Los dos ID se pueden modificar seleccionando Configuration > Basic Settings > Container Image Override en la página de detalles de la función. No pueden ser root ni un ID reservado.
- Construya una imagen.
En el siguiente ejemplo, el nombre de la imagen es custom_container_http_example y la etiqueta latest y el punto (.) indica el directorio donde se encuentra el Dockerfile. Ejecute el comando de la construcción de image para empaquetar todos los archivos del directorio y envíe el paquete a un motor de contenedores para construir una imagen.
docker build -t custom_container_http_example:latest .
Paso 3: Realizar la verificación local
- Inicie el contenedor de Docker.
docker run -u 1003:1003 -p 8000:8000 custom_container_http_example:latest
- Abra una nueva ventana del símbolo del sistema y envíe un mensaje a través del puerto 8000 para acceder al directorio /invoke especificado en el código de plantilla.
curl -XPOST -H 'Content-Type: application/json' -d '{"message":"HelloWorld"}' localhost:8000/helloworld
Se devuelve la información siguiente basada en el código del módulo:Hello FunctionGraph, method POST
- Compruebe si se muestra la siguiente información:
receive {"message":"HelloWorld"}
También puede ejecutar el comando docker logs para obtener logs de contenedores.
Paso 4: Subir la imagen
Paso 5: Crear una función
- Inicie sesión en la consola de FunctionGraph. En el panel de navegación, seleccione Functions > Function List.
- Haga clic en Create Function en la esquina superior derecha y elija Select template.
- Establezca la información básica,
- Function Type: Seleccione HTTP Function.
- Function Name: Ingrese custom_container_http.
- Use container image: Seleccione la imagen cargada a SWR. Ejemplo: swr.{Region ID}.myhuaweicloud.com/{Organization name}/{Image name}:{Image tag}
- Agency: Seleccione una delegación con el permiso del SWR Admin. Si no hay ninguna delegación disponible, cree una haciendo referencia a Creación de una delegación.
- Una vez completada la configuración, haga clic en Create Function.
Paso 6: Probar la función
- En la página de detalles de la función, haga clic en Test. En el cuadro de diálogo que se muestra, cree un evento de prueba.
- Seleccione apig-event-template, establezca Event Name en helloworld, modifique el evento de prueba de la siguiente manera y haga clic en Create.
{ "body": "{\"message\": \"helloworld\"}", "requestContext": { "requestId": "11cdcdcf33949dc6d722640a13091c77", "stage": "RELEASE" }, "queryStringParameters": { "responseType": "html" }, "httpMethod": "POST", "pathParameters": {}, "headers": { "Content-Type": "application/json" }, "path": "/helloworld", "isBase64Encoded": false }
Paso 7: Ver el resultado de la ejecución
Haga clic en Test y vea el resultado de la ejecución a la derecha.
![](https://support.huaweicloud.com/intl/es-us/qs-functiongraph/es-us_image_0000001422359706.png)
- Function Output: muestra el resultado de retorno de la función.
- Log Output: muestra los logs de ejecución de la función.
- Summary: muestra la información clave de los logs.
NOTA:
Se puede mostrar un máximo de 2 KB de logs. Para obtener más información de log, véase la Consulta de logs de funciones.
Paso 8: Ver métricas de monitoreo
En la página de detalles de la función, haga clic en la ficha Monitoring.
- En la página de ficha Monitoring, elija Metrics y seleccione un intervalo de tiempo (como 5 minutos, 15 minutos o 1 hora) para consultar la función.
- Se muestran las siguientes métricas: invocaciones, errores, duración (incluidas las duraciones máxima, media y mínima) y aceleración.
Paso 9: Eliminar la función
- En la página de detalles de la función, elija Operation > Delete function en la esquina superior derecha.
- En el cuadro de diálogo mostrado, haga clic en OK para liberar recursos.