Esta es la guía para AWS CDK desarrolladores de la versión 2. 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.
En este tema se describe cómo solucionar los siguientes problemas con 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 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 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-cdk
ejecuta la versión local del AWS CDK kit de herramientas, si existe alguna. 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.
alias cdk="npx aws-cdk"
Al implementar mi AWS CDK pila, 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 que se generen AWS cargos 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 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 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 AWS CDK arranque.
Al implementar mi AWS CDK pila, recibo un forbidden: null
mensaje
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 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:
-
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 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 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 AWS CDK código deEjemplo: crear un AWS Fargate servicio 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. 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 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 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
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.
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 especificas ambos, 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. AZs
Puede cambiar este comportamiento mediante la anulación de la propiedad de su pila availablilityZones
(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 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.
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,
});
}
}
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
.