Búsqueda de sitios web

typescript - Cómo obtener el ID de la cuenta con cdk


Escribí un TypeScript simple con AWS CDK y trato de obtener el ID de la cuenta

import cdk = require("@aws-cdk/core");

const app = new cdk.Stack();

console.log(app.account);

Pero obtén la salida a continuación

tsc index.ts 
node index.js 
${Token[AWS::AccountId.0]}

Entonces, ¿cuál es el significado de Token aquí? ¿Cómo obtener el ID real de la cuenta?

Actualizaciones

cdk init app --language=typescript

replace lib/<name>-stack.ts with @Rob Raisch 's code

cdk synth
${Token[AWS::AccountId.0]}
Outputs:
  MyStackAccount:
    Description: Account of this stack
    Value:
      Ref: AWS::AccountId
Resources:
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Modules: aws-cdk=1.2.0,@aws-cdk/core=1.8.0,@aws-cdk/cx-api=1.8.0,jsii-runtime=node.js/v10.15.3

cdk deploy
${Token[AWS::AccountId.0]}
MyStack: deploying...
MyStack: creating CloudFormation changeset...
 0/2 | 11:58:59 AM | CREATE_IN_PROGRESS   | AWS::CDK::Metadata | CDKMetadata Resource creation Initiated
 1/2 | 11:58:59 AM | CREATE_COMPLETE      | AWS::CDK::Metadata | CDKMetadata 
 2/2 | 11:59:00 AM | CREATE_COMPLETE      | AWS::CloudFormation::Stack | MyStack 

 ✅  MyStack

Outputs:
MyStack.MyStackAccount = 123456789012

Respuesta #1

Tenía exactamente el mismo problema hasta que me di cuenta de que, hasta que ejecutes cdk deploy, no existen esos valores, solo hay marcadores de posición (como $ {Token[AWS::AccountId.0]}) que se completarán durante la implementación.

Piénsalo de esta manera, tu stack de CDK es un plan para crear una serie de recursos, pero hasta que ejecutes cdk deploy, esos recursos no existen y, por lo tanto, no se pueden consultar para obtener sus valores.

Una forma de obtener el valor que necesitas sería agregar esto a tu constructor de pila:

// Publish the custom resource output
new cdk.CfnOutput(this, "MyStackAccount", {
  description: "Account of this stack",
  value: this.account
});

Como en:

class MyStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, "MyStack", props);

    new cdk.CfnOutput(this, "MyStackAccount", {
      description: "Account of this stack",
      value: this.account
    });
  }
}

lo que, cuando ejecutas cdk deploy, generará:

MyStack.StackAccount = 987XXXXXX456

Respuesta #2

Puedes usar la variable de entorno CDK_DEFAULT_ACCOUNT:

console.log(process.env.CDK_DEFAULT_ACCOUNT)

Citando la documentación de AWS:

...su pila puede usar dos variables de entorno proporcionadas por la CLI de AWS CDK: CDK_DEFAULT_ACCOUNT y CDK_DEFAULT_REGION. Estas variables se configuran en función del perfil de AWS especificado usando la opción --profile, o el perfil de AWS predeterminado si no especifica uno.

Nota: Estoy usando la versión 2.84.0 de aws-cdk

Artículos relacionados