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 la AWS CDK.
Tras actualizar la AWS CDK, el kit de herramientas AWS CDK (CLI) informa de una discordancia con la biblioteca Construct AWS
La versión del kit de herramientas del AWS CDK (que proporciona el cdk
comando) debe ser al menos igual a la versión del módulo principal de Construct Library,. 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 del AWS CDK, instale una versión específica del kit de herramientas de forma local en la carpeta de su proyecto.
Si está utilizando TypeScript o JavaScript, el directorio de su proyecto ya contiene una copia local versionada del kit de herramientas del CDK.
Si utiliza otro idioma, úselo npm
para instalar el kit de herramientas del AWS CDK, omitiendo la -g
marca y especificando la versión deseada. Por ejemplo:
npm install aws-cdk@2.0
Para ejecutar un kit de herramientas AWS CDK instalado localmente, utilice el comando en lugar de solo. npx aws-cdk
cdk
Por ejemplo:
npx aws-cdk deploy MyStack
npx aws-cdk
ejecuta la versión local del kit de herramientas del AWS CDK, si existe. 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 NoSuchBucket
Su AWS entorno no se ha iniciado 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 AWS cargos inesperados, la 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 CDK actual. AWS Como alternativa, se crean en la región especificada en su AWS perfil local (establecida poraws configure
), utilizando 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 si no se encuentra en el directorio de una aplicación).
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
Para obtener más información, consulte AWS CDK bootstrapping.
Al implementar mi pila de AWS CDK, recibo un mensaje 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 depósito provisional se usa cuando se implementan pilas que contienen activos o que sintetizan una AWS CloudFormation plantilla 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, aparece el mensaje --app is required either in command-line, in cdk.json or in ~/.cdk.json
Este mensaje normalmente significa que no estás en el directorio principal de tu proyecto de AWS CDK cuando lo publicas. cdk synth
El archivo cdk.json
de este directorio, creado por el cdk init
comando, contiene la línea de comandos necesaria para ejecutar (y, por lo tanto, sintetizar) la aplicación de AWS CDK. En el caso de una TypeScript aplicación, por ejemplo, el valor predeterminado cdk.json
es el siguiente:
{ "app": "npx ts-node bin/my-cdk-app.ts" }
Te recomendamos que cdk
emitas comandos solo en el directorio principal de tu proyecto, para que el kit de herramientas del AWS CDK pueda encontrarlos cdk.json
allí y ejecutar tu aplicación correctamente.
Si esto no resulta práctico por alguna razón, el kit de herramientas del AWS CDK busca la línea de comandos de la aplicación en otras dos ubicaciones:
-
En
cdk.json
en el directorio principal -
En el mismo comando
cdk synth
al usar la opción-a
Por ejemplo, puedes sintetizar una pila de una TypeScript aplicación 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 AWS CloudFormation plantilla contiene demasiados recursos
El AWS CDK genera e implementa plantillas. AWS CloudFormation AWS CloudFormation tiene un límite estricto en cuanto a la cantidad de recursos que puede contener una pila. Con el AWS CDK, puedes superar este límite más rápido de lo que cabría esperar.
nota
El límite AWS CloudFormation de recursos es de 500 al momento de escribir este artículo. Consulte las cuotas de AWS CloudFormation para ver el límite de recursos actual.
Las estructuras de nivel superior basadas en la intención de la biblioteca AWS Construct proporcionan automáticamente todos 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 construcciones basadas en la intención genera de 1 a 5 AWS CloudFormation recursos por construcción, aunque esto puede variar. En el caso de las aplicaciones sin servidor, lo habitual es disponer de 5 a 8 recursos por punto final AWS de la API.
Los patrones, que representan un mayor nivel de abstracción, permiten definir incluso más AWS recursos con incluso menos código. El código AWS CDK de Example: AWS Create an Fargate service using AWS el CDK, por ejemplo, genera más de AWS CloudFormation 50 recursos y define solo tres construcciones.
Superar el límite de AWS CloudFormation recursos es un error durante la síntesis. AWS CloudFormation El AWS CDK emite una advertencia si tu 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 él).
// 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 su pila: por ejemplo, combinando algunas funciones de Lambda o dividiendo la pila en varias pilas. El CDK admite referencias entre pilas, por lo que puedes separar la funcionalidad de tu aplicación en pilas diferentes de la forma que más te convenga.
nota
AWS CloudFormation los expertos suelen sugerir el uso de pilas anidadas como solución al límite de recursos. El AWS CDK apoya 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 env
propiedad de la pila. Si no especificas ambas, la AWS CDK, de forma predeterminada, sintetiza la pila como independiente del entorno. A continuación, puede implementar la pila en una región específica utilizando. 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 dichas regiones. Sin embargo, al momento de escribir este artículo, todas las AWS regiones tienen al menos dos. AZs
Puedes cambiar este comportamiento anulando la propiedad AvailabilityZones (Python:availability_zones
) de tu pila para especificar de forma explícita las zonas que quieres usar.
Para obtener más información sobre cómo especificar la cuenta y la región de una pila en el momento de la síntesis y, al mismo tiempo, conservar la flexibilidad de implementarla en cualquier región, consulte Entornos del CDK. AWS
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 estableces la política de eliminación de un recurso enDESTROY
, 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 estableces una política de retirada de un bucket de Amazon S3 y este contiene datos, el intento de destruir la pila fallará porque no se puede eliminar el bucket. DESTROY
Puedes hacer que el AWS CDK elimine los objetos del depósito antes de intentar destruirlo. Para ello, coloca el puntal del depósito autoDeleteObjects
en. true