Configure los entornos para usarlos con el AWS CDK - 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.

Configure los entornos para usarlos con el AWS CDK

Puede configurar AWS los entornos de varias maneras para usarlos con AWS Cloud Development Kit (AWS CDK). El mejor método de administración de AWS los entornos variará en función de sus necesidades específicas.

Cada CDK pila de la aplicación debe asociarse eventualmente a un entorno para determinar dónde se implementará la pila.

Para obtener una introducción a AWS los entornos, consulteEntornos para AWS CDK.

Dónde puede especificar los entornos

Puede especificar los entornos en los archivos de credenciales y configuración, o bien mediante la env propiedad del componente fijo Stack de la biblioteca de AWS componentes fijos.

Archivos de credenciales y configuración

Puede usar AWS Command Line Interface (AWS CLI) para crear credentials config archivos que almacenen, organicen y administren la información de su AWS entorno. Para obtener más información sobre estos archivos, consulte los ajustes de configuración y de los archivos de credenciales en la Guía del AWS Command Line Interface usuario.

Los valores almacenados en estos archivos se organizan por perfiles. La forma en que nombre sus perfiles y los pares clave-valor de estos archivos variarán en función del método que utilice para configurar el acceso mediante programación. Para obtener más información sobre los distintos métodos, consulte. Configure las credenciales de seguridad para AWS CDKCLI

En general, AWS CDK resuelve la Cuenta de AWS información de su credentials archivo y la Región de AWS información de su config archivo.

Una vez que haya configurado sus config archivos credentials y, puede especificar el entorno que se va a utilizar con el AWS CDK CLI y mediante variables de entorno.

propiedad env de la construcción Stack

Puede especificar el entorno de cada pila mediante la env propiedad de la Stack construcción. Esta propiedad define la cuenta y la región que se van a utilizar. Puede pasar valores codificados de forma rígida a esta propiedad o pasar las variables de entorno que ofrece. CDK

Para transferir variables de entorno, utilice las variables de AWS_DEFAULT_REGION entorno AWS_DEFAULT_ACCOUNT y. Estas variables de entorno pueden transmitir valores de sus config archivos credentials y. También puede utilizar la lógica del CDK código para determinar los valores de estas variables de entorno.

Prioridad del entorno con respecto a AWS CDK

Si utiliza varios métodos para especificar entornos, AWS CDK se sigue la siguiente prioridad:

  1. Valores codificados de forma rígida especificados con la env propiedad del componente fijo. Stack

  2. AWS_DEFAULT_ACCOUNTy variables de AWS_DEFAULT_REGION entorno especificadas con la env propiedad de la Stack construcción.

  3. Información de entorno asociada al perfil desde sus config archivos credentials y transferida al CDK CLI utilizando la --profile opción.

  4. El default perfil de sus config archivos credentials y.

Cuándo especificar los entornos

Cuando se desarrolla con elCDK, se empieza por definir CDK pilas, que contienen construcciones que representan AWS los recursos. A continuación, sintetiza cada CDK pila en una plantilla. AWS CloudFormation A continuación, implementa la CloudFormation plantilla en su entorno. La forma en que especifique los entornos determina cuándo se aplica la información del entorno y puede afectar al CDK comportamiento y a los resultados.

Especifique los entornos en la síntesis de la plantilla

Al especificar la información del entorno mediante la env propiedad de la Stack construcción, la información del entorno se aplica en la síntesis de la plantilla. Ejecuta cdk synth o cdk deploy produce una plantilla específica del entorno CloudFormation .

Si usa variables de entorno dentro de la env propiedad, debe usar la opción con --profile CDK CLI comandos para pasar al perfil que contiene la información de entorno de sus credenciales y archivos de configuración. Luego, esta información se aplicará en la síntesis de la plantilla para producir una plantilla específica para el entorno.

La información ambiental incluida en la CloudFormation plantilla tiene prioridad sobre otros métodos. Por ejemplo, si proporciona un entorno diferentecdk deploy --profile profile, se ignorará el perfil.

Cuando proporcionas información sobre el entorno de esta manera, puedes usar el código y la lógica que dependen del entorno en tu CDK aplicación. Esto también significa que la plantilla sintetizada puede ser diferente en función de la máquina, el usuario o la sesión en la que se sintetiza. Este enfoque suele ser aceptable o deseable durante el desarrollo, pero no se recomienda para su uso en producción.

Especifique los entornos en el despliegue de la pila

Si no especifica un entorno mediante la env propiedad de la Stack construcción, la CDK CLI producirá una CloudFormation plantilla independiente del entorno en el momento de la síntesis. A continuación, puede especificar el entorno en el que desea realizar la implementación mediante. cdk deploy --profile profile

Si no especifica un perfil al implementar una plantilla independiente del entorno, el CDK CLI intentará utilizar los valores de entorno de su default perfil credentials y sus config archivos en el momento de la implementación.

Si la información del entorno no está disponible en el momento de la implementación, AWS CloudFormation intentará resolverla mediante atributos relacionados con el entornostack.account, comostack.region, ystack.availabilityZones.

En el caso de las pilas independientes del entorno, las construcciones incluidas en la pila no pueden utilizar la información del entorno y no se puede utilizar una lógica que requiera información del entorno. Por ejemplo, no puede escribir código similar if (stack.region ==== 'us-east-1') ni utilizar métodos de construcción que requieran información del entorno, por ejemplo. Vpc.fromLookup Para utilizar estas funciones, debe especificar un entorno con la env propiedad.

En el caso de las pilas independientes del entorno, cualquier construcción que utilice zonas de disponibilidad tendrá dos zonas de disponibilidad, lo que permitirá implementar la pila en cualquier región.

Cómo especificar los entornos con AWS CDK

Especifique entornos codificados de forma rígida para cada pila

Utilice la env propiedad de la Stack construcción para especificar los valores de AWS entorno de la pila. A continuación, se muestra un ejemplo:

TypeScript
const envEU = { account: '2383838383', region: 'eu-west-1' }; const envUSA = { account: '8373873873', region: 'us-west-2' }; new MyFirstStack(app, 'first-stack-us', { env: envUSA }); new MyFirstStack(app, 'first-stack-eu', { env: envEU });
JavaScript
const envEU = { account: '2383838383', region: 'eu-west-1' }; const envUSA = { account: '8373873873', region: 'us-west-2' }; new MyFirstStack(app, 'first-stack-us', { env: envUSA }); new MyFirstStack(app, 'first-stack-eu', { env: envEU });
Python
env_EU = cdk.Environment(account="8373873873", region="eu-west-1") env_USA = cdk.Environment(account="2383838383", region="us-west-2") MyFirstStack(app, "first-stack-us", env=env_USA) MyFirstStack(app, "first-stack-eu", env=env_EU)
Java
public class MyApp { // Helper method to build an environment static Environment makeEnv(String account, String region) { return Environment.builder() .account(account) .region(region) .build(); } public static void main(final String argv[]) { App app = new App(); Environment envEU = makeEnv("8373873873", "eu-west-1"); Environment envUSA = makeEnv("2383838383", "us-west-2"); new MyFirstStack(app, "first-stack-us", StackProps.builder() .env(envUSA).build()); new MyFirstStack(app, "first-stack-eu", StackProps.builder() .env(envEU).build()); app.synth(); } }
C#
Amazon.CDK.Environment makeEnv(string account, string region) { return new Amazon.CDK.Environment { Account = account, Region = region }; } var envEU = makeEnv(account: "8373873873", region: "eu-west-1"); var envUSA = makeEnv(account: "2383838383", region: "us-west-2"); new MyFirstStack(app, "first-stack-us", new StackProps { Env=envUSA }); new MyFirstStack(app, "first-stack-eu", new StackProps { Env=envEU });
Go
env_EU := awscdk.Environment{ Account: jsii.String("8373873873"), Region: jsii.String("eu-west-1"), } env_USA := awscdk.Environment{ Account: jsii.String("2383838383"), Region: jsii.String("us-west-2"), } MyFirstStack(app, "first-stack-us", &awscdk.StackProps{ Env: &env_USA, }) MyFirstStack(app, "first-stack-eu", &awscdk.StackProps{ Env: &env_EU, })

Recomendamos este enfoque para los entornos de producción. Al especificar explícitamente el entorno de esta manera, puede asegurarse de que la pila siempre se implemente en el entorno específico.

Especifique los entornos mediante variables de entorno

AWS CDK Proporciona dos variables de entorno que puede usar en su CDK código: CDK_DEFAULT_ACCOUNT yCDK_DEFAULT_REGION. Cuando utilizas estas variables de entorno en la env propiedad de tu instancia de pila, puedes transferir la información del entorno de tus credenciales y archivos de configuración mediante el CDK CLI --profileopción.

A continuación se muestra un ejemplo de cómo especificar estas variables de entorno:

TypeScript

Acceda a las variables de entorno a través del process objeto de Node.

nota

Necesitas el DefinitelyTyped módulo para usarlo process TypeScript. cdk initinstala este módulo por ti. Sin embargo, debe instalar este módulo manualmente si está trabajando con un proyecto creado antes de agregarlo o si no configuró su proyecto utilizandocdk init.

npm install @types/node
new MyDevStack(app, 'dev', { env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }});
JavaScript

Acceda a las variables de entorno a través del process objeto de Node.

new MyDevStack(app, 'dev', { env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }});
Python

Utilice el environ diccionario del os módulo para acceder a las variables de entorno.

import os MyDevStack(app, "dev", env=cdk.Environment( account=os.environ["CDK_DEFAULT_ACCOUNT"], region=os.environ["CDK_DEFAULT_REGION"]))
Java

Se utiliza System.getenv() para obtener el valor de una variable de entorno.

public class MyApp { // Helper method to build an environment static Environment makeEnv(String account, String region) { account = (account == null) ? System.getenv("CDK_DEFAULT_ACCOUNT") : account; region = (region == null) ? System.getenv("CDK_DEFAULT_REGION") : region; return Environment.builder() .account(account) .region(region) .build(); } public static void main(final String argv[]) { App app = new App(); Environment envEU = makeEnv(null, null); Environment envUSA = makeEnv(null, null); new MyDevStack(app, "first-stack-us", StackProps.builder() .env(envUSA).build()); new MyDevStack(app, "first-stack-eu", StackProps.builder() .env(envEU).build()); app.synth(); } }
C#

Se utiliza System.Environment.GetEnvironmentVariable() para obtener el valor de una variable de entorno.

Amazon.CDK.Environment makeEnv(string account=null, string region=null) { return new Amazon.CDK.Environment { Account = account ?? System.Environment.GetEnvironmentVariable("CDK_DEFAULT_ACCOUNT"), Region = region ?? System.Environment.GetEnvironmentVariable("CDK_DEFAULT_REGION") }; } new MyDevStack(app, "dev", new StackProps { Env = makeEnv() });
Go
import "os" MyDevStack(app, "dev", &awscdk.StackProps{ Env: &awscdk.Environment{ Account: jsii.String(os.Getenv("CDK_DEFAULT_ACCOUNT")), Region: jsii.String(os.Getenv("CDK_DEFAULT_REGION")), }, })

Al especificar los entornos mediante variables de entorno, puede hacer que la misma CDK pila se sintetice en AWS CloudFormation plantillas para diferentes entornos. Esto significa que puede implementar la misma CDK pila en diferentes AWS entornos sin tener que modificar el CDK código. Solo tiene que especificar el perfil que se utilizará cuando se ejecutecdk synth.

Este enfoque es ideal para los entornos de desarrollo cuando se implementa la misma pila en diferentes entornos. Sin embargo, no recomendamos este enfoque para los entornos de producción, ya que el mismo CDK código puede sintetizar diferentes plantillas, según la máquina, el usuario o la sesión en la que se sintetiza.

Especifique los entornos a partir de sus credenciales y archivos de configuración con la CDK CLI

Al implementar una plantilla independiente del entorno, utilice la --profile opción con cualquier CDK CLI comando para especificar el perfil que se va a utilizar. A continuación se muestra un ejemplo en el que se despliega una CDK pila denominada myStack mediante el prod perfil definido en los config archivos credentials and:

$ cdk deploy myStack --profile prod

Para obtener más información sobre la --profile opción, junto con otras CDK CLI comandos y opciones, consulteAWS CDK CLI Referencia de los comandos  .

Consideraciones a la hora de configurar entornos con el AWS CDK

Los servicios que defina mediante componentes integrados en sus pilas deben ser compatibles con la región en la que vaya a realizar los despliegues. Para ver una lista de los servicios compatibles Servicios de AWS por región, consulta AWS los servicios por región.

Debe tener credenciales AWS Identity and Access Management (IAM) válidas para realizar despliegues de pilas con ellas AWS CDK en los entornos especificados.

Ejemplos

Sintetice una plantilla independiente del entorno a partir de CloudFormation una pila CDK

En este ejemplo, creamos una plantilla independiente del entorno CloudFormation a partir de nuestra pila. CDK A continuación, podemos implementar esta plantilla en cualquier entorno.

La siguiente es nuestra CDK pila de ejemplos. Esta pila define un bucket de Amazon S3 y un resultado de CloudFormation pila para la región del bucket. Para este ejemplo, no env está definido:

TypeScript
export class CdkAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Create the S3 bucket const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', { removalPolicy: cdk.RemovalPolicy.DESTROY, }); // Create an output for the bucket's Region new cdk.CfnOutput(this, 'BucketRegion', { value: bucket.env.region, }); } }
JavaScript
class CdkAppStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); // Create the S3 bucket const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', { removalPolicy: cdk.RemovalPolicy.DESTROY, }); // Create an output for the bucket's Region new cdk.CfnOutput(this, 'BucketRegion', { value: bucket.env.region, }); } }
Python
class CdkAppStack(cdk.Stack): def __init__(self, scope: cdk.Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) # Create the S3 bucket bucket = s3.Bucket(self, 'amzn-s3-demo-bucket', removal_policy=cdk.RemovalPolicy.DESTROY ) # Create an output for the bucket's Region cdk.CfnOutput(self, 'BucketRegion', value=bucket.env.region )
Java
public class CdkAppStack extends Stack { public CdkAppStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // Create the S3 bucket Bucket bucket = Bucket.Builder.create(this, "amzn-s3-demo-bucket") .removalPolicy(RemovalPolicy.DESTROY) .build(); // Create an output for the bucket's Region CfnOutput.Builder.create(this, "BucketRegion") .value(this.getRegion()) .build(); } }
C#
namespace MyCdkApp { public class CdkAppStack : Stack { public CdkAppStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Create the S3 bucket var bucket = new Bucket(this, "amzn-s3-demo-bucket", new BucketProps { RemovalPolicy = RemovalPolicy.DESTROY }); // Create an output for the bucket's Region new CfnOutput(this, "BucketRegion", new CfnOutputProps { Value = this.Region }); } } }
Go
func NewCdkAppStack(scope constructs.Construct, id string, props *CdkAppStackProps) awscdk.Stack { stack := awscdk.NewStack(scope, &id, &props.StackProps) // Create the S3 bucket bucket := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{ RemovalPolicy: awscdk.RemovalPolicy_DESTROY, }) // Create an output for the bucket's Region awscdk.NewCfnOutput(stack, jsii.String("BucketRegion"), &awscdk.CfnOutputProps{ Value: stack.Region(), }) return stack }

Cuando corremoscdk synth, el CDK CLI produce una CloudFormation plantilla con el pseudoparámetro AWS::Region como valor de salida para la región del depósito. Este parámetro se resolverá en el momento de la implementación:

Outputs: BucketRegion: Value: Ref: AWS::Region

Para implementar esta pila en un entorno especificado en el dev perfil de nuestras credenciales y archivos de configuración, ejecutamos lo siguiente:

$ cdk deploy CdkAppStack --profile dev

Si no especificamos un perfil, el CDK CLI intentará utilizar la información del entorno del default perfil en nuestras credenciales y archivos de configuración.

Utilice la lógica para determinar la información del entorno en la síntesis de la plantilla

En este ejemplo, configuramos la env propiedad de nuestra stack instancia para usar una expresión válida. Especificamos dos variables de entorno adicionales CDK_DEPLOY_ACCOUNT yCDK_DEPLOY_REGION. Estas variables de entorno pueden anular los valores predeterminados en el momento de la síntesis, si existen:

TypeScript
new MyDevStack(app, 'dev', { env: { account: process.env.CDK_DEPLOY_ACCOUNT || process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEPLOY_REGION || process.env.CDK_DEFAULT_REGION }});
JavaScript
new MyDevStack(app, 'dev', { env: { account: process.env.CDK_DEPLOY_ACCOUNT || process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEPLOY_REGION || process.env.CDK_DEFAULT_REGION }});
Python
MyDevStack(app, "dev", env=cdk.Environment( account=os.environ.get("CDK_DEPLOY_ACCOUNT", os.environ["CDK_DEFAULT_ACCOUNT"]), region=os.environ.get("CDK_DEPLOY_REGION", os.environ["CDK_DEFAULT_REGION"])
Java
public class MyApp { // Helper method to build an environment static Environment makeEnv(String account, String region) { account = (account == null) ? System.getenv("CDK_DEPLOY_ACCOUNT") : account; region = (region == null) ? System.getenv("CDK_DEPLOY_REGION") : region; account = (account == null) ? System.getenv("CDK_DEFAULT_ACCOUNT") : account; region = (region == null) ? System.getenv("CDK_DEFAULT_REGION") : region; return Environment.builder() .account(account) .region(region) .build(); } public static void main(final String argv[]) { App app = new App(); Environment envEU = makeEnv(null, null); Environment envUSA = makeEnv(null, null); new MyDevStack(app, "first-stack-us", StackProps.builder() .env(envUSA).build()); new MyDevStack(app, "first-stack-eu", StackProps.builder() .env(envEU).build()); app.synth(); } }
C#
Amazon.CDK.Environment makeEnv(string account=null, string region=null) { return new Amazon.CDK.Environment { Account = account ?? System.Environment.GetEnvironmentVariable("CDK_DEPLOY_ACCOUNT") ?? System.Environment.GetEnvironmentVariable("CDK_DEFAULT_ACCOUNT"), Region = region ?? System.Environment.GetEnvironmentVariable("CDK_DEPLOY_REGION") ?? System.Environment.GetEnvironmentVariable("CDK_DEFAULT_REGION") }; } new MyDevStack(app, "dev", new StackProps { Env = makeEnv() });
Go
var account, region string var b bool if account, b = os.LookupEnv("CDK_DEPLOY_ACCOUNT"); !b || len(account) == 0 { account = os.Getenv("CDK_DEFAULT_ACCOUNT") } if region, b = os.LookupEnv("CDK_DEPLOY_REGION"); !b || len(region) == 0 { region = os.Getenv("CDK_DEFAULT_REGION") } MyDevStack(app, "dev", &awscdk.StackProps{ Env: &awscdk.Environment{ Account: &account, Region: &region, }, })

Con el entorno de nuestra pila declarado de esta manera, podemos escribir un script corto o un archivo por lotes y establecer variables a partir de los argumentos de la línea de comandos y, luego, llamar. cdk deploy A continuación, se muestra un ejemplo. Todos los argumentos que no sean los dos primeros se pasan cdk deploy a para especificar opciones o argumentos de la línea de comandos:

macOS/Linux
#!/usr/bin/env bash if [[ $# -ge 2 ]]; then export CDK_DEPLOY_ACCOUNT=$1 export CDK_DEPLOY_REGION=$2 shift; shift npx cdk deploy "$@" exit $? else echo 1>&2 "Provide account and region as first two args." echo 1>&2 "Additional args are passed through to cdk deploy." exit 1 fi

Guarde el script como cdk-deploy-to.sh y, chmod +x cdk-deploy-to.sh a continuación, ejecútelo para hacerlo ejecutable.

Windows
@findstr /B /V @ %~dpnx0 > %~dpn0.ps1 && powershell -ExecutionPolicy Bypass %~dpn0.ps1 %* @exit /B %ERRORLEVEL% if ($args.length -ge 2) { $env:CDK_DEPLOY_ACCOUNT, $args = $args $env:CDK_DEPLOY_REGION, $args = $args npx cdk deploy $args exit $lastExitCode } else { [console]::error.writeline("Provide account and region as first two args.") [console]::error.writeline("Additional args are passed through to cdk deploy.") exit 1 }

La versión para Windows del script proporciona PowerShell la misma funcionalidad que la versión para macOS/Linux. También contiene instrucciones que permiten que se ejecute como un archivo por lotes para que pueda invocarse fácilmente desde una línea de comandos. Debe guardarse comocdk-deploy-to.bat. El archivo se cdk-deploy-to.ps1 creará cuando se invoque el archivo por lotes.

Luego, podemos escribir scripts adicionales que usen el cdk-deploy-to script para implementarlos en entornos específicos. A continuación, se muestra un ejemplo:

macOS/Linux
#!/usr/bin/env bash # cdk-deploy-to-test.sh ./cdk-deploy-to.sh 123457689 us-east-1 "$@"
Windows
@echo off rem cdk-deploy-to-test.bat cdk-deploy-to 135792469 us-east-1 %*

El siguiente es un ejemplo en el que se usa el cdk-deploy-to script para implementarlo en varios entornos. Si la primera implementación falla, el proceso se detiene:

macOS/Linux
#!/usr/bin/env bash # cdk-deploy-to-prod.sh ./cdk-deploy-to.sh 135792468 us-west-1 "$@" || exit ./cdk-deploy-to.sh 246813579 eu-west-1 "$@"
Windows
@echo off rem cdk-deploy-to-prod.bat cdk-deploy-to 135792469 us-west-1 %* || exit /B cdk-deploy-to 245813579 eu-west-1 %*