Solución de AWS CDK problemas comunes - AWS Cloud Development Kit (AWS CDK) v2

Esta es la guía para AWS CDK desarrolladores de la versión 2. La versión anterior del CDK v1 entró en mantenimiento el 1 de junio de 2022 y dejó de ofrecer 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.

Solución de AWS CDK problemas comunes

En este tema se describe cómo solucionar los siguientes problemas con el AWS CDK.

Tras actualizar el AWS CDK, el AWS CDK kit de herramientas (CLI) informa de una discordancia con la biblioteca Construct AWS

La versión del AWS CDK kit de herramientas (que proporciona el cdk comando) debe ser al menos igual a la versión del módulo principal de AWS Construct Library,. aws-cdk-lib El kit de herramientas está diseñado 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 este motivo, le recomendamos que instale este componente globalmente y lo mantenga actualizado.

npm update -g aws-cdk

Si necesita trabajar con varias versiones del kit de AWS CDK herramientas, 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 AWS CDK kit de herramientas, omitiendo la -g marca y especificando la versión deseada. Por ejemplo:

npm install aws-cdk@2.0

Para ejecutar un AWS CDK kit de herramientas instalado localmente, utilice el comando npx aws-cdk en lugar de solo. cdk Por ejemplo:

npx aws-cdk deploy MyStack

npx aws-cdkejecuta la versión local del AWS CDK kit de herramientas, si existe alguna. Recurre a la versión global cuando un proyecto no tiene una instalación local. Puede que le resulte conveniente configurar un alias de shell para asegurarse de que siempre cdk se invoque de esta manera.

macOS/Linux
alias cdk="npx aws-cdk"
Windows
doskey cdk=npx aws-cdk $*

(volver a la lista)

Al implementar mi AWS CDK pila, recibo un NoSuchBucket error

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 el depósito provisional y otros recursos necesarios con el siguiente comando:

cdk bootstrap aws://ACCOUNT-NUMBER/REGION

Para evitar generar AWS cargos inesperados, AWS CDK no inicia automáticamente ningún entorno. Debe iniciar de forma explícita cada entorno en el que vaya a realizar la implementación.

De forma predeterminada, los recursos de arranque se crean en la región o regiones que utilizan las pilas de la aplicación actual. AWS CDK 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 Bootstrapping (Proceso de arranque).

(volver a la lista)

Al implementar mi AWS CDK pila, recibo un forbidden: null mensaje

Está implementando una pila que requiere recursos de arranque, pero está utilizando un rol o una cuenta de IAM que no tiene permiso para escribir en ella. (El segmento provisional se usa cuando se implementan pilas que contienen activos o que sintetizan una AWS CloudFormation plantilla de más de 50 000). Usa una cuenta o un rol que tenga permiso para realizar la acción s3:* contra el depósito mencionado en el mensaje de error.

(volver a la lista)

Al sintetizar una AWS CDK pila, recibo 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 AWS CDK proyecto 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) AWS CDK la aplicación. En el caso de una TypeScript aplicación, por ejemplo, el valor cdk.json predeterminado 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, de modo que el AWS CDK kit de herramientas pueda cdk.json encontrarlos allí y ejecutar tu aplicación correctamente.

Si esto no resulta práctico por alguna razón, el AWS CDK kit de herramientas busca la línea de comandos de la aplicación en otras dos ubicaciones:

  • cdk.jsonEn tu directorio principal

  • En el propio cdk synth comando usando la -a opción

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

(volver a la lista)

Al sintetizar una AWS CDK pila, recibo un error porque la AWS CloudFormation plantilla contiene demasiados recursos

AWS CDK Genera e implementa AWS CloudFormation plantillas. AWS CloudFormation tiene un límite estricto en 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 AWS CloudFormation las cuotas para 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, si se concede acceso a un recurso a otro, se generan todos los objetos de IAM necesarios para que los servicios pertinentes se comuniquen.

Según nuestra experiencia, el uso real de construcciones basadas en la intención da como resultado 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 AWS CDK código deCreación de un servicio AWS Fargate mediante el AWS CDK, por ejemplo, genera más de 50 AWS CloudFormation recursos y define solo tres construcciones!

Superar el límite AWS CloudFormation de recursos es un error durante la AWS CloudFormation síntesis. AWS CDK Emite una advertencia si tu pila supera el 80% del límite. Puedes usar un límite diferente configurando la maxResources propiedad en tu pila, o deshabilitar la validación maxResources configurándola en 0.

sugerencia

Puede obtener un recuento exacto de los recursos de la salida sintetizada mediante el siguiente script de utilidades. (Como todos los AWS CDK desarrolladores necesitan Node.js, el script está escrito en él) 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 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. AWS CDK Apoya este enfoque a través del NestedStackconstructo.

(volver a la lista)

Especificé tres (o más) zonas de disponibilidad para mi grupo de Auto Scaling 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 especifica ambas, de forma predeterminada AWS CDK, 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. AWS CDK Las pilas independientes del entorno no se pueden implementar en dichas regiones. Sin embargo, al momento de escribir este artículo, todas AWS las regiones tienen al menos dos zonas de disponibilidad.

Puedes cambiar este comportamiento anulando la propiedad de tu pila availablilityZones(Python:availability_zones) 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, consulteEntornos.

(volver a la lista)

Mi bucket de S3, tabla de DynamoDB u otro recurso no se eliminan cuando ejecuto el error cdk destroy

De forma predeterminada, los recursos que pueden contener datos de usuario tienen la propiedad removalPolicy (Python:removal_policy) deRETAIN, 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, debes eliminar el recurso manualmente una vez que se destruya la pila. Hasta que lo hagas, se producirá un error al volver a desplegar la pila. Esto se debe a que el nombre del nuevo recurso que se está creando 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.

TypeScript
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as s3 from 'aws-cdk-lib/aws-s3'; export class CdkTestStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const bucket = new s3.Bucket(this, 'Bucket', { removalPolicy: cdk.RemovalPolicy.DESTROY, }); } }
JavaScript
const cdk = require('aws-cdk-lib'); const s3 = require('aws-cdk-lib/aws-s3'); class CdkTestStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); const bucket = new s3.Bucket(this, 'Bucket', { removalPolicy: cdk.RemovalPolicy.DESTROY }); } } module.exports = { CdkTestStack }
Python
import aws_cdk as cdk from constructs import Construct import aws_cdk.aws_s3 as s3 class CdkTestStack(cdk.stack): def __init__(self, scope: Construct, id: str, **kwargs): super().__init__(scope, id, **kwargs) bucket = s3.Bucket(self, "Bucket", removal_policy=cdk.RemovalPolicy.DESTROY)
Java
software.amazon.awscdk.*; import software.amazon.awscdk.services.s3.*; import software.constructs; public class CdkTestStack extends Stack { public CdkTestStack(final Construct scope, final String id) { this(scope, id, null); } public CdkTestStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Bucket.Builder.create(this, "Bucket") .removalPolicy(RemovalPolicy.DESTROY).build(); } }
C#
using Amazon.CDK; using Amazon.CDK.AWS.S3; public CdkTestStack(Construct scope, string id, IStackProps props) : base(scope, id, props) { new Bucket(this, "Bucket", new BucketProps { RemovalPolicy = RemovalPolicy.DESTROY }); }
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 AWS CDK elimines los objetos del depósito antes de intentar destruirlo. Para ello, coloca el puntal del autoDeleteObjects depósito en. true

(volver a la lista)