Trabajando con el AWS CDK en Python - AWS Cloud Development Kit (AWS CDK) v2

Esta es la guía para AWS CDK desarrolladores de la versión 2. La CDK versión anterior entró en mantenimiento el 1 de junio de 2022 y finalizó el soporte el 1 de junio de 2023.

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.

Trabajando con el AWS CDK en Python

Python es un lenguaje de cliente totalmente compatible AWS Cloud Development Kit (AWS CDK) y se considera estable. Para trabajar con él AWS CDK en Python se utilizan herramientas conocidas, como la implementación estándar de Python (CPython), los entornos virtuales con virtualenv y el instalador de paquetes de Pythonpip. Los módulos que componen la biblioteca AWS Construct se distribuyen a través de pypi.org. La versión Python del evento usa AWS CDK identificadores al estilo de Python (por ejemplo, snake_case nombres de métodos).

Puedes usar cualquier editor o. IDE Muchos AWS CDK desarrolladores usan Visual Studio Code (o su equivalente de código abierto VSCodium), que tiene un buen soporte para Python a través de una extensión oficial. El IDLE editor incluido con Python será suficiente para empezar. Los módulos de Python AWS CDK tienen sugerencias de tipo, que son útiles para una herramienta de linting o una IDE que admita la validación de tipos.

Introducción a Python

Para trabajar con ellos AWS CDK, debe tener una AWS cuenta y credenciales y tener instalados Node.js y el AWS CDK kit de herramientas. Consulte Cómo empezar con el AWS CDK.

AWS CDK Las aplicaciones de Python requieren Python 3.6 o posterior. Si aún no lo tienes instalado, descarga una versión compatible para tu sistema operativo en python.org. Si utilizas Linux, es posible que tu sistema tenga una versión compatible o puedes instalarlo mediante el administrador de paquetes de tu distribución (yum,apt, etc.). Los usuarios de Mac pueden estar interesados en Homebrew, un administrador de paquetes estilo Linux para macOS.

nota

El uso de idiomas de terceros está en desuso: la versión en otros idiomas solo se admite hasta que el proveedor o la comunidad la compartan EOL (al final de su vida útil) y está sujeta a cambios con previo aviso.

También se requieren el instalador del paquete Python y el virtualenv administrador del entorno virtual. pip Las instalaciones de Windows de las versiones de Python compatibles incluyen estas herramientas. En Linux, pip y se virtualenv pueden proporcionar como paquetes separados en el administrador de paquetes. Como alternativa, puede instalarlos con los siguientes comandos:

python -m ensurepip --upgrade python -m pip install --upgrade pip python -m pip install --upgrade virtualenv

Si se produce un error de permisos, ejecute los comandos anteriores con la --user marca para que los módulos se instalen en su directorio de usuarios o utilícelos sudo para obtener los permisos necesarios para instalar los módulos en todo el sistema.

nota

Es común que las distribuciones de Linux usen el nombre ejecutable python3 para Python 3.x y hagan python referencia a una instalación de Python 2.x. Algunas distribuciones tienen un paquete opcional que puedes instalar y que hace que el python comando haga referencia a Python 3. De lo contrario, puedes ajustar el comando utilizado para ejecutar tu aplicación editándolo cdk.json en el directorio principal del proyecto.

nota

En Windows, es posible que desee invocar Python (ypip) mediante el py ejecutable, el lanzador >Python para Windows. Entre otras cosas, el lanzador le permite especificar fácilmente qué versión instalada de Python desea usar.

Si python al escribir en la línea de comandos aparece un mensaje sobre la instalación de Python desde la Tienda Windows, incluso después de instalar una versión de Python para Windows, abra el panel de configuración Administrar alias de ejecución de aplicaciones de Windows y desactive las dos entradas del instalador de aplicaciones para Python.

Creación de un proyecto

Para crear un AWS CDK proyecto nuevo, se invoca cdk init en un directorio vacío. Utilice la --language opción y especifiquepython:

mkdir my-project cd my-project cdk init app --language python

cdk initusa el nombre de la carpeta del proyecto para nombrar varios elementos del proyecto, incluidas las clases, las subcarpetas y los archivos. Los guiones del nombre de la carpeta se convierten en guiones bajos. Sin embargo, de lo contrario, el nombre debería seguir la forma de un identificador de Python; por ejemplo, no debería empezar por un número ni contener espacios.

Para trabajar con el nuevo proyecto, active su entorno virtual. Esto permite que las dependencias del proyecto se instalen localmente en la carpeta del proyecto, en lugar de hacerlo globalmente.

source .venv/bin/activate
nota

Es posible que reconozca esto como el comando de Mac/Linux para activar un entorno virtual. Las plantillas de Python incluyen un archivo por lotes, source.bat, que permite utilizar el mismo comando en Windows. El comando tradicional de Windows.\venv\Scripts\activate,, también funciona.

Si inicializó el AWS CDK proyecto con CDK Toolkit v1.70.0 o una versión anterior, su entorno virtual estará en el directorio en lugar de hacerlo. .env .venv

importante

Active el entorno virtual del proyecto cada vez que empiece a trabajar en él. De lo contrario, no tendrá acceso a los módulos instalados allí y los módulos que instale irán al directorio global de módulos de Python (o generarán un error de permiso).

Tras activar tu entorno virtual por primera vez, instala las dependencias estándar de la aplicación:

python -m pip install -r requirements.txt

Gestión de los módulos de AWS Construct Library

Usa el instalador de paquetes de Python para instalar y actualizar los módulos de AWS Construct Library para que los usen tus aplicaciones, así como otros paquetes que necesites. pip piptambién instala las dependencias de esos módulos automáticamente. Si su sistema no lo reconoce pip como un comando independiente, invoque pip como un módulo de Python, de la siguiente manera:

python -m pip PIP-COMMAND

La mayoría de las AWS CDK construcciones están incluidas. aws-cdk-lib Los módulos experimentales están en módulos separados llamados asíaws-cdk.SERVICE-NAME.alpha. El nombre del servicio incluye un prefijo aws. Si no estás seguro del nombre de un módulo, búscalo en PyPI. Por ejemplo, el siguiente comando instala la biblioteca. AWS CodeStar

python -m pip install aws-cdk.aws-codestar-alpha

Las estructuras de algunos servicios se encuentran en más de un espacio de nombres. Por ejemplo, ademásaws-cdk.aws-route53, hay tres espacios de nombres adicionales de Amazon Route 53: named aws-route53-targetsaws-route53-patterns, y. aws-route53resolver

nota

La edición Python de la CDK API Referencia también muestra los nombres de los paquetes.

Los nombres utilizados para importar los módulos de AWS Construct Library al código de Python son los siguientes.

import aws_cdk.aws_s3 as s3 import aws_cdk.aws_lambda as lambda_

Recomendamos las siguientes prácticas al importar AWS CDK clases y módulos de AWS Construct Library a sus aplicaciones. Seguir estas pautas ayudará a que su código sea coherente con el de otras AWS CDK aplicaciones y a que sea más fácil de entender.

  • Por lo general, importe clases individuales del nivel superior. aws_cdk

    from aws_cdk import App, Construct
  • Si necesita muchas clases deaws_cdk, puede utilizar un alias de espacio de nombres cdk en lugar de importar clases individuales. Evita hacer ambas cosas.

    import aws_cdk as cdk
  • Por lo general, importe las bibliotecas de AWS Construct utilizando alias de espacios de nombres cortos.

    import aws_cdk.aws_s3 as s3

Después de instalar un módulo, actualiza el requirements.txt archivo del proyecto, que contiene una lista de las dependencias del proyecto. Es mejor hacerlo manualmente en lugar de usarlopip freeze. pip freezecaptura las versiones actuales de todos los módulos instalados en su entorno virtual de Python, lo que puede resultar útil al empaquetar un proyecto para ejecutarlo en otro lugar.

Sin embargo, normalmente requirements.txt debes enumerar solo las dependencias de nivel superior (módulos de los que depende directamente tu aplicación) y no las dependencias de esas bibliotecas. Esta estrategia simplifica la actualización de las dependencias.

Puede editar requirements.txt para permitir las actualizaciones; basta con ~= sustituir el número de versión == anterior por uno que permita actualizar a una versión compatible superior o eliminar por completo el requisito de versión para especificar la última versión disponible del módulo.

Si se ha requirements.txt editado adecuadamente para permitir las actualizaciones, ejecute este comando para actualizar los módulos instalados del proyecto en cualquier momento:

pip install --upgrade -r requirements.txt

Administrar las dependencias en Python

En Python, las dependencias se especifican colocándolas en requirements.txt aplicaciones o bibliotecas setup.py de construcción. A continuación, las dependencias se gestionan con la PIP herramienta. PIPse invoca de una de las siguientes maneras:

pip command options python -m pip command options

La python -m pip invocación funciona en la mayoría de los sistemas; pip requiere que PIP el ejecutable esté en la ruta del sistema. Si pip no funciona, intente python -m pip reemplazarlo por.

El cdk init --language python comando crea un entorno virtual para su nuevo proyecto. Esto permite que cada proyecto tenga sus propias versiones de las dependencias y también un requirements.txt archivo básico. Debe activar este entorno virtual ejecutándolo source .venv/bin/activate cada vez que comience a trabajar con el proyecto. En Windows, ejecute .\venv\Scripts\activate en su lugar

CDKaplicaciones

A continuación se muestra un ejemplo de un archivo requirements.txt. Como PIP no tiene una función de bloqueo de dependencias, le recomendamos que utilice el operador == para especificar las versiones exactas de todas las dependencias, como se muestra aquí.

aws-cdk-lib==2.14.0 aws-cdk.aws-appsync-alpha==2.10.0a0

Al instalar un módulo con, pip install no se añade automáticamente a. requirements.txt Debe hacerlo usted mismo. Si desea actualizar a una versión posterior de una dependencia, edite su número de versión enrequirements.txt.

Para instalar o actualizar las dependencias de tu proyecto después de crearlo o editarlorequirements.txt, ejecuta lo siguiente:

python -m pip install -r requirements.txt
sugerencia

El pip freeze comando muestra las versiones de todas las dependencias instaladas en un formato que se puede escribir en un archivo de texto. Se puede utilizar como un archivo de requisitos conpip install -r. Este archivo es práctico para fijar todas las dependencias (incluidas las transitivas) a las versiones exactas con las que ha realizado las pruebas. Para evitar problemas al actualizar los paquetes más adelante, utilice un archivo independiente para ello, como freeze.txt (no). requirements.txt A continuación, regenéralo cuando actualices las dependencias de tu proyecto.

Bibliotecas de construcción de terceros

En las bibliotecas, las dependencias se especifican ensetup.py, de modo que las dependencias transitivas se descargan automáticamente cuando una aplicación consume el paquete. De lo contrario, todas las aplicaciones que quieran usar tu paquete deberán copiar tus dependencias en las suyas. requirements.txt Aquí setup.py se muestra un ejemplo.

from setuptools import setup setup( name='my-package', version='0.0.1', install_requires=[ 'aws-cdk-lib==2.14.0', ], ... )

Para trabajar en el paquete para el desarrollo, cree o active un entorno virtual y, a continuación, ejecute el siguiente comando.

python -m pip install -e .

Aunque instala PIP automáticamente las dependencias transitivas, solo puede haber una copia instalada de cada paquete. Se selecciona la versión que se especifique más arriba en el árbol de dependencias; las aplicaciones siempre tienen la última palabra en qué versión de los paquetes se instalan.

AWS CDK modismos en Python

Conflictos lingüísticos

En Python, lambda es una palabra clave del lenguaje, por lo que no se puede utilizar como nombre para el módulo de biblioteca de AWS Lambda construcciones o las funciones de Lambda. La convención de Python para este tipo de conflictos es usar un guión bajo al final, como en el lambda_ nombre de la variable.

Por convención, se nombra el segundo argumento de los AWS CDK constructos. id Al escribir tus propias pilas y construcciones, llamar a un parámetro id «sombrea» la función integrada de Pythonid(), que devuelve el identificador único de un objeto. Esta función no se usa con mucha frecuencia, pero si la necesitas en tu construcción, cambia el nombre del argumento, por ejemplo. construct_id

Argumentos y propiedades

Todas las clases de AWS Construct Library se instancian mediante tres argumentos: el ámbito en el que se define la construcción (su elemento principal en el árbol de construcciones), un identificador y props, un conjunto de pares clave/valor que la construcción utiliza para configurar los recursos que crea. Otras clases y métodos también utilizan el patrón de «conjunto de atributos» como argumento.

scope e id siempre deben pasarse como argumentos posicionales, no como argumentos de palabras clave, ya que sus nombres cambian si la construcción acepta una propiedad denominada scope o id.

En Python, los props se expresan como argumentos de palabras clave. Si un argumento contiene estructuras de datos anidadas, estas se expresan mediante una clase que toma sus propios argumentos de palabras clave en la instanciación. El mismo patrón se aplica a otras llamadas a métodos que utilizan un argumento estructurado.

Por ejemplo, en el add_lifecycle_rule método de un bucket de Amazon S3, la transitions propiedad es una lista de Transition instancias.

bucket.add_lifecycle_rule( transitions=[ Transition( storage_class=StorageClass.GLACIER, transition_after=Duration.days(10) ) ] )

Al ampliar una clase o anular un método, es posible que desee aceptar argumentos adicionales para sus propios fines que la clase principal no comprenda. En este caso, debes aceptar los argumentos que no te interese usar en la **kwargs expresión idiomática y usar argumentos que solo contengan palabras clave para aceptar los argumentos que te interesen. Cuando llames al constructor principal o al método anulado, pasa solo los argumentos que esperas (normalmente solo). **kwargs Si se pasan argumentos que la clase o el método principal no esperan, se produce un error.

class MyConstruct(Construct): def __init__(self, id, *, MyProperty=42, **kwargs): super().__init__(self, id, **kwargs) # ...

Una futura versión del AWS CDK podría añadir casualmente una nueva propiedad con el nombre que utilizó para su propia propiedad. Esto no provocará ningún problema técnico a los usuarios de su construcción o método (dado que su propiedad no pasa a un nivel superior de la cadena, la clase principal o el método anulado simplemente utilizarán un valor predeterminado), pero puede provocar confusión. Puedes evitar este posible problema asignando un nombre a tus propiedades de forma que pertenezcan claramente a tu construcción. Si hay muchas propiedades nuevas, agrúpalas en una clase con el nombre adecuado y pásala como un único argumento de palabra clave.

Valores faltantes

Se AWS CDK utiliza None para representar valores faltantes o indefinidos. Al trabajar con **kwargs ellos, utilice el get() método del diccionario para proporcionar un valor predeterminado si no se proporciona una propiedad. Evite su usokwargs[...], ya que esto aumenta el KeyError número de valores faltantes.

encrypted = kwargs.get("encrypted") # None if no property "encrypted" exists encrypted = kwargs.get("encrypted", False) # specify default of False if property is missing

Es posible que algunos AWS CDK métodos (como tryGetContext() obtener un valor de contexto en tiempo de ejecución) devuelvanNone, lo que deberá comprobar de forma explícita.

Uso de interfaces

Python no tiene una función de interfaz como la tienen otros lenguajes, aunque sí tiene clases base abstractas, que son similares. (Si no estás familiarizado con las interfaces, Wikipedia tiene una buena introducción). TypeScript, el lenguaje en el que AWS CDK se implementa, proporciona interfaces, y las construcciones y otros AWS CDK objetos suelen requerir un objeto que se adhiera a una interfaz en particular, en lugar de heredarlo de una clase en particular. Por lo tanto, AWS CDK proporciona su propia función de interfaz como parte de la capa. JSII

Para indicar que una clase implementa una interfaz en particular, puedes usar el @jsii.implements decorador:

from aws_cdk import IAspect, IConstruct import jsii @jsii.implements(IAspect) class MyAspect(): def visit(self, node: IConstruct) -> None: print("Visited", node.node.path)

Escriba los escollos

Python usa la tipificación dinámica, donde todas las variables pueden hacer referencia a un valor de cualquier tipo. Los parámetros y los valores devueltos se pueden anotar con tipos, pero se trata de «sugerencias» y no se aplican. Esto significa que en Python, es fácil pasar el tipo de valor incorrecto a una AWS CDK construcción. En lugar de recibir un error de tipo durante la compilación, como ocurriría en un lenguaje de tipado estático, es posible que se produzca un error de tiempo de ejecución cuando la JSII capa (que se traduce entre Python y el AWS CDK TypeScript núcleo) no pueda procesar el tipo inesperado.

Según nuestra experiencia, los errores tipográficos que cometen los programadores de Python suelen clasificarse en estas categorías.

  • Pasar un único valor donde una construcción espera un contenedor (lista o diccionario de Python) o viceversa.

  • Pasar un valor de un tipo asociado a una construcción de capa 1 (CfnXxxxxx) a una construcción de L2 o L3, o viceversa.

Los módulos de AWS CDK Python incluyen anotaciones de tipos, por lo que puede usar herramientas que los admitan para ayudar con los tipos. Si no utilizas uno IDE que las admita, por ejemplo, quizás quieras llamar al validador de MyPytipos como parte de tu proceso de compilación. PyCharm También hay comprobadores de tipos en tiempo de ejecución que pueden mejorar los mensajes de error relacionados con los tipos.