Esta es la guía para desarrolladores de AWS CDK v2. La primera versión del CDK pasó a la etapa de mantenimiento el 1.° de junio de 2022 y no cuenta con soporte desde 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.
Solución de problemas comunes de AWS CDK
En este tema se describe cómo solucionar los siguientes problemas con AWS CDK.
Tras actualizar AWS CDK, el kit de herramientas de AWS CDK (CLI) informa sobre una discordancia con la Biblioteca de constructos de AWS
La versión del kit de herramientas de AWS CDK (que proporciona el comando cdk) debe ser, al menos, igual a la versión del módulo principal de la Biblioteca de constructos de AWS, aws-cdk-lib. El kit de herramientas se diseñó para ser compatible con versiones anteriores. La última versión 2.x del kit de herramientas se puede utilizar con cualquier versión 1.x o 2.x de la biblioteca. Por esta razón, le recomendamos que instale este componente de forma global y lo mantenga actualizado.
npm update -g aws-cdk
Si necesita trabajar con varias versiones del kit de herramientas de AWS CDK, instale una versión específica de este de forma local en la carpeta del proyecto.
Si utiliza TypeScript o JavaScript, el directorio del proyecto ya contiene una copia local versionada del kit de herramientas de CDK.
Si utiliza otro idioma, use npm para instalar el kit de herramientas de AWS CDK, omitiendo la marca -g y especificando la versión deseada. Por ejemplo:
npm install aws-cdk@2.0
Para ejecutar un kit de herramientas de AWS CDK instalado de manera local, utilice el comando npx aws-cdk en lugar de solo cdk. Por ejemplo:
npx aws-cdk deploy MyStack
npx aws-cdk ejecuta la versión local del kit de herramientas de AWS CDK, de haber alguna disponible. Esta recurre a la versión global cuando un proyecto no tiene una instalación local. Puede que le resulte conveniente configurar un alias en el intérprete de comandos para asegurarse de que el cdk siempre se invoque de esta manera.
Al implementar mi pila de AWS CDK, recibo un error de NoSuchBucket
Su entorno de AWS no se ha arrancado y, por lo tanto, no tiene un bucket de Amazon S3 para almacenar los recursos durante la implementación. Puede crear un bucket transitorio y otros recursos necesarios con el siguiente comando:
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
Para evitar generar cargos de AWS inesperados, AWS CDK no arranca automáticamente ningún entorno. Usted debe arrancar de forma explícita cada entorno en el que vaya a realizar implementaciones.
De forma predeterminada, los recursos de arranque se crean en la región o regiones que utilizan las pilas de la aplicación de AWS CDK actual. Como alternativa, se crean en la región especificada en su perfil local de AWS (establecida por aws configure), al utilizar la cuenta de ese perfil. Puede especificar una cuenta y una región diferentes en la línea de comandos de la siguiente manera. (Debe especificar la cuenta y la región en caso de no encontrarse en el directorio de una aplicación).
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
Para obtener más información, consulte sobre las acciones de arranque AWS CDK.
Al implementar mi pila de AWS CDK, recibo un mensaje de forbidden: null
La pila que está implementando requiere recursos de arranque, pero está utilizando una cuenta o un rol de IAM que no tiene permiso para escribir en ella. (El bucket transitorio se usa cuando se implementan pilas que contienen activos o que sintetizan una plantilla de AWS CloudFormation de más de 50 000). Utilice un rol o cuenta que tenga permiso para realizar la acción s3:* en el bucket que se menciona en el mensaje de error.
Al sintetizar una pila de AWS CDK, recibo el mensaje de --app is required either in command-line, in cdk.json or in ~/.cdk.json
Generalmente, este mensaje significa que no está en el directorio principal del proyecto de AWS CDK cuando ejecuta cdk synth. El archivo cdk.json de este directorio, creado por el comando cdk init, contiene la línea de comandos necesaria para ejecutar y, por lo tanto, sintetizar la aplicación de AWS CDK. Para una aplicación de TypeScript, por ejemplo, el archivo predeterminado cdk.json se ve similar a esto:
{ "app": "npx ts-node bin/my-cdk-app.ts" }
Recomendamos que emita comandos cdk solo en el directorio principal del proyecto, para que el kit de herramientas de AWS CDK pueda encontrar el archivo cdk.json allí y ejecute la aplicación correctamente.
Si esto no resulta práctico por alguna razón, el kit de herramientas de AWS CDK busca la línea de comandos de la aplicación en otras dos ubicaciones:
-
En
cdk.jsonen el directorio principal -
En el mismo comando
cdk synthal usar la opción-a
Por ejemplo, puede sintetizar una pila a partir de una aplicación de TypeScript de la siguiente manera.
cdk synth --app "npx ts-node my-cdk-app.ts" MyStack
Al sintetizar una pila de AWS CDK, recibo un error porque la plantilla de AWS CloudFormation contiene demasiados recursos
El AWS CDK genera e implementa plantillas de AWS CloudFormation. AWS CloudFormation tiene un límite estricto en la cantidad de recursos que una pila puede contener. Con AWS CDK, puede superar este límite más pronto de lo esperado.
nota
El límite de recursos de AWS CloudFormation es de 500 al momento de escribir este documento. Consulte las cuotas de AWS CloudFormation para ver el límite de recursos actual.
Los constructos de nivel superior de la Biblioteca de constructos de AWS, basados en la intención, aprovisionan de manera automática los recursos auxiliares necesarios para el registro, la administración de claves, la autorización y otros fines. Por ejemplo, al otorgar acceso a un recurso desde otro, se generan objetos IAM necesarios para que los servicios relevantes puedan comunicarse.
Según nuestra experiencia, el uso real de constructos basados en la intención da como resultado de 1 a 5 recursos de AWS CloudFormation por constructo, aunque esto puede variar. En el caso de las aplicaciones sin servidor, lo habitual es disponer de 5 a 8 recursos de AWS por punto de conexión de la API.
Los patrones, que representan un mayor nivel de abstracción, permiten definir incluso más recursos de AWS con incluso menos código. El código de AWS CDK en Ejemplo: cree un servicio de AWS Fargate mediante el AWS CDK, por ejemplo, genera más de 50 recursos de AWS CloudFormation y define solo tres constructos.
Superar el límite de recursos de AWS CloudFormation es un error durante la síntesis de AWS CloudFormation. AWS CDK emite una advertencia si la pila supera el 80 % del límite. Puede usar un límite diferente tras configurar la propiedad maxResources en la pila, o deshabilitar la validación al configurar maxResources en 0.
sugerencia
Puede obtener un recuento exacto de los recursos en su salida sintetizada utilizando el siguiente script de utilidad. (Como todos los desarrolladores de AWS CDK necesitan Node.js, el script está escrito en JavaScript).
// rescount.js - count the resources defined in a stack // invoke with: node rescount.js <path-to-stack-json> // e.g. node rescount.js cdk.out/MyStack.template.json import * as fs from 'fs'; const path = process.argv[2]; if (path) fs.readFile(path, 'utf8', function(err, contents) { console.log(err ? `${err}` : `${Object.keys(JSON.parse(contents).Resources).length} resources defined in ${path}`); }); else console.log("Please specify the path to the stack's output .json file");
A medida que el recuento de recursos de su pila se acerque al límite, considere la posibilidad de rediseñar la arquitectura para reducir la cantidad de recursos que contiene la pila: por ejemplo, combine algunas funciones de Lambda o divida la pila en varias pilas. CDK admite referencias entre pilas, por lo que puede separar la funcionalidad de su aplicación en pilas diferentes de la forma que más le convenga.
nota
Los expertos de AWS CloudFormation suelen sugerir el uso de pilas anidadas como solución al límite de recursos. AWS CDK es compatible con este enfoque a través del constructo NestedStack.
Especifiqué tres (o más) zonas de disponibilidad para mi grupo de escalado automático o VPC, pero solo se implementó en dos
Para obtener el número de zonas de disponibilidad que solicita, especifique la cuenta y la región en la propiedad env de la pila. Si no especifica ambas, AWS CDK sintetiza la pila como independiente del entorno de forma predeterminada. A continuación, puede implementar la pila en una región específica mediante el uso de AWS CloudFormation. Como algunas regiones solo tienen dos zonas de disponibilidad, una plantilla independiente del entorno no utiliza más de dos.
nota
En el pasado, las regiones se lanzaban ocasionalmente con una sola zona de disponibilidad. Las pilas de AWS CDK independientes del entorno no se pueden implementar en estas regiones. Sin embargo, al momento de escribir este artículo, todas las regiones de AWS tienen al menos dos zonas de disponibilidad.
Puede cambiar este comportamiento mediante la anulación de la propiedad de su pila availabilityZones (Python: availability_zones) para especificar de forma explícita las zonas que quiere usar.
Para obtener más información acerca de cómo establecer la cuenta y la región de una pila en el momento de la síntesis y, al mismo tiempo, mantener la flexibilidad de implementarla en cualquier región, consulte Entornos para el AWS CDK.
Mi bucket de S3, mi tabla de DynamoDB u otro recurso no se eliminan cuando ejecuto cdk destroy
De forma predeterminada, los recursos que pueden contener datos de usuario tienen la propiedad removalPolicy (Python:removal_policy) de RETAIN, y el recurso no se elimina cuando se destruye la pila. En su lugar, el recurso queda huérfano de la pila. A continuación, una vez que se destruya la pila, debe eliminar el recurso de forma manual. Hasta que lo haga, se producirá un error al volver a implementar la pila. Esto se debe a que el nombre del nuevo recurso que se crea durante la implementación entra en conflicto con el nombre del recurso huérfano.
Si establece una política de eliminación de un recurso en DESTROY, ese recurso se eliminará cuando se destruya la pila.
nota
AWS CloudFormation no puede eliminar un bucket de Amazon S3 que no esté vacío. Si establece la política de eliminación de un bucket de Amazon S3 en DESTROY y este contiene datos, el intento para destruir la pila fallará porque el bucket no puede eliminarse. Puede hacer que el AWS CDK elimine los objetos del bucket antes de intentar destruirlo al establecer la propiedad autoDeleteObjects del bucket en true.