Comunicación entre gemas - Guía del usuario de Lumberyard

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Comunicación entre gemas

Open 3D Engine (O3DE), el sucesor de Lumberyard, ya está disponible en Developer Preview. Descargar O3DEo visite elBlog de AWS Game Techpara obtener más información.

Las gemas en la nube pueden utilizar la característica de comunicación entre gemas para exponer sus operaciones API entre sí y utilizar los servicios de backend de otras gemas. Por ejemplo, Lumberyard'sPlayer Account Cloud Gemproporciona un servicio de reproductor prohibido que elGema Leaderboard Cloudutiliza para limitar las puntuaciones fraudulentas. También puede utilizar la comunicación entre gemas en la nube para notificar a varias gemas cuando se produce un evento.

Para implementar la comunicación entre gemas, hay que definir, implementar y utilizar una interfaz de servicio web API de servicio de Cloud Gem Framework.

Definición de una interfaz

Para definir una interfaz de servicio de Cloud Gem Framework, utilice el formato de definición de API de swagger (también conocida como especificación OpenAPI) para crear un archivo interface-name_interface-version.json. Luego, se coloca el archivo en el directorio lumberyard_version\dev\Gems\gem-name\AWS\api-definition. Para ver un ejemplo en Lumberyard, consulte lalumberyard_version\dev\Gems\CloudGemPlayerAccount\AWS\api-definition\banplayer_1_0_0.jsonfile.

El nombre completo de la interfaz tiene el formato gem-name_interface-name_interface-version. interface-version es un número de versión de tres partes. El número utiliza el estándar Semantic Versioning 2.0.0 pero con un guion bajo como separador (_) en lugar de un punto (.). Cuando la definición de la interfaz cambia, aumenta el número de versión de acuerdo con este estándar.

Cuando el servicio de directorio asigna puntos de enlace de interfaz disponibles a solicitudes de cliente para puntos de enlace, tiene en cuenta la versión de la interfaz. Esto permite que los clientes que incluyen una versión secundaria más antigua de una interfaz utilicen versiones secundarias de la interfaz.

Para definir rutas, operaciones y formatos de datos para la interfaz, siga las especificaciones de swagger de la misma forma que lo haría con cualquier otra definición de swagger.

Implementación de una interfaz

Para implementar una interfaz, un archivo swagger.json de la gema utiliza un objeto de extensión x-cloud-gem-framework-interface-implementation en un objeto de ruta. El objeto de implementación de interfaz tiene las siguientes propiedades:

  • interface— El nombre completo de la interfaz (gem-name.interface-name-interface-version) de la interfaz implementada.

  • module— El nombre del directorio del módulo de Python que contiene la implementación de la API. Si no se proporciona, se utiliza el nombre completo de la interfaz. Este directorio contiene los módulos secundarios con funciones que se denominan de la forma que se especifica en la definición de la interfaz.

La definición de la interfaz de referencia y la definición swagger de la gema se combinan antes de cargarse para configurar Amazon API Gateway. Los objetos de ruta de la definición de la interfaz se insertan de forma eficaz como rutas secundarias del objeto de ruta que define el objeto de extensión de implementación de la interfaz. Las definiciones de datos de cada interfaz tienen un prefijo único para evitar conflictos con las definiciones de swagger de la gema u otras interfaces.

Por ejemplo, si el archivo swagger.json de la gema contiene lo siguiente:

{ ... "paths": { "/foo": { "x-cloud-gem-framework-interface-implementation": { "interface": "ExampleGem_ExampleInterface_1_0_0" } }, "/bar": { "get": ... } }, "definitions": { "Bar": ... } }

Y la definición de la interfaz contiene lo siguiente:

{ ... "paths": { "/aaa":{ "get": { ... "$ref": "#/definitions/ExampleData" ... } } "/bbb": ... }, "definitions": { "ExampleData": ... } }

El swagger resultante es algo parecido a lo siguiente:

{ ... "paths": { "/foo/aaa": { "get": { ... "$ref": "#/definitions/ExampleGem_ExampleInterface_1_0_0.ExampleData" ... } } "/foo/bbb": ... "/bar": { "get": ... } }, "definitions": { "Bar": ..., "ExampleGem_ExampleInterface_1_0_0.ExampleData": ... } }

En la actualidad, debe implementar manualmente la interfaz en el código de servicio, aunque está previsto incluir herramientas que simplifiquen la implementación en una próxima versión.

Para implementar la interfaz, utilice los métodos anotados @service.api que utiliza para otras operaciones API de servicio Ejecución de solicitud. Para implementar la API, las funciones de los módulos deben utilizar los nombres que especifica el objeto de extensión x-amazon-cloud-canvas-lambda-dispatch. Para anular los valores predeterminados, coloque los objetos de extensión x-amazon-cloud-canvas-lambda-dispatch que incluyen propiedades de módulos y funciones en la definición de la interfaz.

En el ejemplo anterior, no se han utilizado objetos de extensión para anular los valores predeterminados, por lo que el código que implementa la interfaz tendría la siguiente estructura:

api\ __init__.py bar.py def get … foo_aaa.py def get … foo_bbb.py …
nota

En la actualidad, no se permite especificar el parámetro path de la interfaz dentro del archivo swagger de la gema. En su lugar, especifique el parámetro path en el archivo de definición de swagger de la interfaz.

Uso de una interfaz

Es muy sencillo llamar a las operaciones API que define la interfaz desde funciones AWS Lambda.

Para utilizar una interfaz en una función Lambda

  1. Especifique la interfaz en la propiedad de la definición del recurso Custom::LambdaConfigurationServices, como en el siguiente ejemplo:

    "ServiceLambdaConfiguration": { "Type": "Custom::LambdaConfiguration", "Properties": { "Services": [ { "InterfaceId": "ExampleGem_ExampleInterface_1_0_0", "Optional": "False" }, ... ], ... ", ... },

    La propiedad Optional especifica si la interfaz determinada debe existir. Si Optional es False y ninguna gema proporciona la interfaz especificada, la implementación falla.

  2. En el código de la función Lambda, obtenga un cliente para el servicio. Para ello:

    1. Utilice la función cgf_lambda_settings.get_service_url para obtener la URL de servicio de la interfaz.

    2. Pase la URL a la función cgf_service_client.for_url, como en el siguiente ejemplo:

    import cgf_service_client import cgf_lambda_settings import boto3 interface_url = cgf_lambda_settings.get_service_url("ExampleGem_ExampleInterface_1_0_0") service_client = cgf_service_client.for_url(interface_url, verbose=True, session=boto3._get_default_session()) result = service_client.navigate('aaa').GET();

    Cloud Canvas garantiza que la función Lambda tiene permiso para llamar a los puntos de enlace de servicio.