Configurare gli ambienti da utilizzare con AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

Questa è la guida per sviluppatori AWS CDK v2. Il vecchio CDK v1 è entrato in manutenzione il 1° giugno 2022 e ha terminato il supporto il 1° giugno 2023.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Configurare gli ambienti da utilizzare con AWS CDK

È possibile configurare AWS gli ambienti in diversi modi da utilizzare con AWS Cloud Development Kit (AWS CDK). Il metodo migliore per gestire AWS gli ambienti varia in base alle esigenze specifiche.

Alla fine, ogni stack CDK dell'applicazione deve essere associato a un ambiente per determinare dove verrà distribuito lo stack.

Per un'introduzione agli AWS ambienti, consulta. Ambienti

Da dove è possibile specificare gli ambienti

È possibile specificare gli ambienti nelle credenziali e nei file di configurazione oppure utilizzando la env proprietà del costrutto della Stack Construct Library AWS .

Credenziali e file di configurazione

È possibile utilizzare il AWS Command Line Interface comando (AWS CLI) per creare config file credentials e archiviare, organizzare e gestire le informazioni AWS sull'ambiente. Per ulteriori informazioni su questi file, consulta Impostazioni dei file di configurazione e credenziali nella Guida per l'AWS Command Line Interface utente.

I valori memorizzati in questi file sono organizzati per profili. Il modo in cui denominate i profili e le coppie chiave-valore in questi file varieranno in base al metodo di configurazione dell'accesso programmatico. Per ulteriori informazioni sui diversi metodi, consulta. Configurare le credenziali di sicurezza per AWS CDKCLI

In generale, AWS CDK risolve le Account AWS informazioni contenute nel credentials file e le Regione AWS informazioni contenute nel fileconfig.

Una volta configurati config i file credentials e i file, è possibile specificare l'ambiente da utilizzare con AWS CDK CLI e tramite le variabili di ambiente.

proprietà env del costrutto Stack

È possibile specificare l'ambiente per ogni stack utilizzando la env proprietà del costrutto. Stack Questa proprietà definisce un account e una regione da utilizzare. È possibile passare valori codificati a questa proprietà o passare variabili di ambiente offerte dal CDK.

Per passare le variabili di ambiente, utilizzate le variabili di ambiente eAWS_DEFAULT_ACCOUNT. AWS_DEFAULT_REGION Queste variabili di ambiente possono trasmettere valori dai tuoi credentials e dai tuoi config file. È inoltre possibile utilizzare la logica all'interno del codice CDK per determinare i valori di queste variabili di ambiente.

Precedenza dell'ambiente con AWS CDK

Se si utilizzano più metodi per specificare gli ambienti, AWS CDK rispetta la seguente precedenza:

  1. Valori codificati specificati con la proprietà del costrutto. env Stack

  2. AWS_DEFAULT_ACCOUNTe variabili di AWS_DEFAULT_REGION ambiente specificate con la env proprietà del costrutto. Stack

  3. Informazioni sull'ambiente associate al profilo presenti nei config file credentials e passate al CDK CLI utilizzando l'--profileopzione.

  4. Il default profilo di Your credentials and config Files.

Quando specificare gli ambienti

Quando sviluppate con CDK, iniziate definendo gli stack CDK, che contengono costrutti che rappresentano le risorse. AWS Successivamente, si sintetizza ogni stack CDK in un modello. AWS CloudFormation Quindi distribuisci il modello nel CloudFormation tuo ambiente. Il modo in cui specificate gli ambienti determina quando le informazioni sull'ambiente vengono applicate e può influire sul comportamento e sui risultati di CDK.

Specificate gli ambienti durante la sintesi del modello

Quando si specificano informazioni sull'ambiente utilizzando la env proprietà del Stack costrutto, le informazioni sull'ambiente vengono applicate alla sintesi del modello. Esegue cdk synth o cdk deploy produce un modello specifico per l'ambiente CloudFormation .

Se si utilizzano variabili di ambiente all'interno della env proprietà, è necessario utilizzare l'--profileopzione con CLI i comandi CDK per passare il profilo contenente le informazioni sull'ambiente ricavate dalle credenziali e dai file di configurazione. Queste informazioni verranno quindi applicate alla sintesi del modello per produrre un modello specifico per l'ambiente.

Le informazioni sull'ambiente contenute nel CloudFormation modello hanno la precedenza sugli altri metodi. Ad esempio, se si fornisce un ambiente diversocdk deploy --profile profile, il profilo verrà ignorato.

Quando fornisci informazioni sull'ambiente in questo modo, puoi utilizzare codice e logica dipendenti dall'ambiente all'interno dell'app CDK. Ciò significa anche che il modello sintetizzato potrebbe essere diverso, in base alla macchina, all'utente o alla sessione in cui viene sintetizzato. Questo approccio è spesso accettabile o auspicabile durante lo sviluppo, ma non è consigliato per l'uso in produzione.

Specificate gli ambienti durante la distribuzione dello stack

Se non specificate un ambiente utilizzando la env proprietà del Stack costrutto, il CDK CLI produrrà un modello indipendente dall'ambiente CloudFormation al momento della sintesi. È quindi possibile specificare l'ambiente in cui eseguire la distribuzione utilizzando. cdk deploy --profile profile

Se non specificate un profilo durante la distribuzione di un modello indipendente dall'ambiente, il CDK CLI tenterà di utilizzare i valori di ambiente del default profilo dell'utente e dei file al momento della distribuzione. credentials config

Se le informazioni sull'ambiente non sono disponibili al momento della distribuzione, AWS CloudFormation tenterà di risolverle al momento della distribuzione tramite attributi relativi all'ambiente come, e. stack.account stack.region stack.availabilityZones

Per gli stack indipendenti dall'ambiente, i costrutti all'interno dello stack non possono utilizzare informazioni sull'ambiente e non è possibile utilizzare una logica che richieda informazioni sull'ambiente. Ad esempio, non è possibile scrivere codice simile if (stack.region ==== 'us-east-1') o utilizzare metodi di costruzione che richiedono informazioni sull'ambiente come. Vpc.fromLookup Per utilizzare queste funzionalità, è necessario specificare un ambiente con la env proprietà.

Per gli stack indipendenti dall'ambiente, qualsiasi costrutto che utilizza zone di disponibilità vedrà due zone di disponibilità, che consentono di distribuire lo stack in qualsiasi regione.

Come specificare gli ambienti con AWS CDK

Specificare ambienti codificati per ogni stack

Utilizzate la env proprietà del Stack costrutto per specificare i valori di AWS ambiente per il vostro stack. Di seguito è riportato un esempio:

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, })

Consigliamo questo approccio per gli ambienti di produzione. Specificando esplicitamente l'ambiente in questo modo, è possibile garantire che lo stack venga sempre distribuito nell'ambiente specifico.

Specificate gli ambienti utilizzando le variabili di ambiente

AWS CDK Fornisce due variabili di ambiente che è possibile utilizzare all'interno del codice CDK: CDK_DEFAULT_ACCOUNT eCDK_DEFAULT_REGION. Quando utilizzate queste variabili di ambiente all'interno della env proprietà dell'istanza stack, potete passare le informazioni sull'ambiente dalle credenziali e dai file di configurazione utilizzando l'opzione CDK. CLI --profile

Di seguito è riportato un esempio di come specificare queste variabili di ambiente:

TypeScript

Accedi alle variabili di ambiente tramite l'processoggetto di Node.

Nota

È necessario il DefinitelyTyped modulo da utilizzare process TypeScript. cdk initinstalla questo modulo per te. Tuttavia, dovresti installare questo modulo manualmente se stai lavorando con un progetto creato prima che fosse aggiunto o se non hai configurato il progetto utilizzandocdk init.

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

Accedi alle variabili di ambiente tramite l'processoggetto di Node.

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

Usa il environ dizionario del os modulo per accedere alle variabili di ambiente.

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

Usa System.getenv() per ottenere il valore di una variabile d'ambiente.

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#

Si usa System.Environment.GetEnvironmentVariable() per ottenere il valore di una variabile di ambiente.

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")), }, })

Specificando gli ambienti utilizzando variabili di ambiente, è possibile fare in modo che lo stesso stack CDK venga sintetizzato in modelli per AWS CloudFormation ambienti diversi. Ciò significa che è possibile distribuire lo stesso stack CDK in AWS ambienti diversi senza dover modificare il codice CDK. È sufficiente specificare il profilo da utilizzare durante l'esecuzione. cdk synth

Questo approccio è ideale per gli ambienti di sviluppo quando si implementa lo stesso stack in ambienti diversi. Tuttavia, non consigliamo questo approccio per gli ambienti di produzione poiché lo stesso codice CDK può sintetizzare modelli diversi, a seconda del computer, dell'utente o della sessione in cui viene sintetizzato.

Specificate gli ambienti dalle vostre credenziali e dai file di configurazione con il CDK CLI

Quando implementate un modello indipendente dall'ambiente, utilizzate l'--profileopzione con qualsiasi comando CDK CLI per specificare il profilo da utilizzare. Di seguito è riportato un esempio che implementa uno stack CDK denominato myStack utilizzando il prod profilo definito nei file and: credentials config

$ cdk deploy myStack --profile prod

Per ulteriori informazioni sull'--profileopzione, insieme ad altri CLI comandi e opzioni CDK, vedere. AWS CDKCLIriferimento al comando

Considerazioni relative alla configurazione degli ambienti con AWS CDK

I servizi definiti utilizzando costrutti all'interno degli stack devono supportare la regione in cui si esegue la distribuzione. Per un elenco dei servizi supportati Servizi AWS per regione, consulta AWS Servizi per regione.

È necessario disporre di credenziali AWS Identity and Access Management (IAM) valide per eseguire distribuzioni di stack con o AWS CDK negli ambienti specificati.

Esempi

Sintetizza un modello indipendente dall'ambiente da uno stack CDK CloudFormation

In questo esempio, creiamo un modello indipendente dall'ambiente a partire dal nostro stack CDK. CloudFormation Possiamo quindi distribuire questo modello in qualsiasi ambiente.

Quello che segue è il nostro esempio di stack CDK. Questo stack definisce un bucket Amazon S3 e CloudFormation un output dello stack per la regione del bucket. Per questo esempio, non è definito: env

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, 'myBucket', { 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, 'myBucket', { 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, 'myBucket', 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, "myBucket") .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, "myBucket", 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("myBucket"), &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 }

Quando eseguiamocdk synth, il CDK CLI produce un CloudFormation modello con lo pseudo parametro AWS::Region come valore di output per la regione del bucket. Questo parametro verrà risolto al momento della distribuzione:

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

Per distribuire questo stack in un ambiente specificato nel dev profilo delle nostre credenziali e dei nostri file di configurazione, eseguiamo quanto segue:

$ cdk deploy CdkAppStack --profile dev

Se non specifichiamo un profilo, il CDK CLI tenterà di utilizzare le informazioni sull'ambiente del default profilo nelle nostre credenziali e nei file di configurazione.

Usa la logica per determinare le informazioni sull'ambiente durante la sintesi del modello

In questo esempio, configuriamo la env proprietà della nostra stack istanza per utilizzare un'espressione valida. Specifichiamo due variabili di ambiente aggiuntive CDK_DEPLOY_ACCOUNT eCDK_DEPLOY_REGION. Queste variabili di ambiente possono sovrascrivere i valori predefiniti al momento della sintesi, se esistono:

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 l'ambiente del nostro stack dichiarato in questo modo, possiamo quindi scrivere un breve script o un file batch e impostare le variabili dagli argomenti della riga di comando, quindi chiamare. cdk deploy Di seguito è riportato un esempio. Tutti gli argomenti oltre ai primi due vengono passati cdk deploy a per specificare le opzioni o gli argomenti della riga di comando:

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

Salva lo script con nomecdk-deploy-to.sh, quindi eseguilo chmod +x cdk-deploy-to.sh per renderlo eseguibile.

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 versione Windows dello script fornisce PowerShell le stesse funzionalità della versione macOS/Linux. Contiene inoltre istruzioni per consentirne l'esecuzione come file batch in modo che possa essere facilmente richiamato da una riga di comando. Dovrebbe essere salvato comecdk-deploy-to.bat. Il file cdk-deploy-to.ps1 verrà creato quando viene richiamato il file batch.

Possiamo quindi scrivere script aggiuntivi che utilizzano cdk-deploy-to lo script per la distribuzione in ambienti specifici. Di seguito è riportato un esempio:

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 %*

Di seguito è riportato un esempio che utilizza cdk-deploy-to lo script per la distribuzione in più ambienti. Se la prima distribuzione fallisce, il processo si interrompe:

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 %*