Qu’est-ce qu’un jeton dans AWS CDK ?


Les jetons dans l’AWS CDK #

Certaines valeurs dans notre code CDK ne peuvent pas être résolues au moment de la synthèse, mais plutôt au moment du déploiement.
mais plutôt au moment du déploiement. Ces valeurs sont appelées Tokens.

Les jetons sont des valeurs codées, le plus souvent des attributs de ressources que nous définissons dans la pile CDK.
notre pile CDK qui ne seront résolus qu’au moment du déploiement.
.

Par exemple, définissons une simple fonction Lambda et essayons d’accéder à son contenu.
functionName dans notre code CDK :

const myFunction = new NodejsFunction(this, id, {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'main',
  entry: path.join(__dirname, `/../src/path/index.js`),
});

console.log('function name ????', myFunction.functionName);

Si nous exécutons npx aws-cdk deploy nous obtenons un résultat comme ${Token[Token.123]}:

nom de la fonction jeton

Nous pouvons constater que la valeur de l’élément functionName est un jeton au moment de la
moment de la synthèse.

Définition explicite des noms de ressources #

Même si nous définissons explicitement le functionName sur la Lambda, nous ne pourrions pas
nous ne pourrions pas accéder à la valeur résolue dans notre code.
.

Ajoutons une table dynamodb à notre code et définissons explicitement l’attribut tableName et
functionName propriétés sur les ressources :

const myTable = new dynamodb.Table(this, 'my-table', {
  
  tableName: 'my-table',
  partitionKey: {name: 'todoId', type: dynamodb.AttributeType.NUMBER},
  billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
  removalPolicy: cdk.RemovalPolicy.DESTROY,
});

console.log('table name ????', myTable.tableName);

const myFunction = new NodejsFunction(this, id, {
  
  functionName: 'my-function',
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'main',
  entry: path.join(__dirname, `/../src/path/index.js`),
});

console.log('function name ????', myFunction.functionName);

Si nous exécutons npx aws-cdk deploynous pouvons voir que nous obtenons toujours les valeurs de jetons
non résolues.

avec des noms d'ensembles

De toute évidence, si nous codons en dur les noms de table et de fonction, nous avons accès à ces valeurs dans notre code CDK.
valeurs dans notre code CDK, mais essayer d’accéder aux attributs retourne toujours un
Token.

En passant, vous ne devriez pas attribuer explicitement des noms aux ressources CDK. Consultez
mon autre article
Ne pas attribuer de noms aux ressources CDK.

Comment les jetons CDK fonctionnent réellement #

Depuis que CDK est compilé en code CloudFormation, tous ces jetons sont
représentés comme
Fonctions Ref de CloudFormation
.

Au moment du déploiement, CloudFormation remplace ces références par les valeurs réelles – dans notre cas, les noms des tables et des fonctions.

Mettons à jour notre code afin de supprimer les noms de ressources explicitement définis et de passer le nom de la table dynamodb comme variable d’environnement au lambda.
le nom de la table dynamodb comme variable d’environnement à la lambda et inspectons notre modèle de
modèle CloudFormation :

const myTable = new dynamodb.Table(this, 'my-table', {
  partitionKey: {name: 'todoId', type: dynamodb.AttributeType.NUMBER},
  billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
  removalPolicy: cdk.RemovalPolicy.DESTROY,
});

const myFunction = new NodejsFunction(this, id, {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'main',
  entry: path.join(__dirname, `/../src/path/index.js`),
  
  environment: {
    tableName: myTable.tableName,
  },
});

Synthétisons notre pile CDK et regardons le modèle CloudFormation produit :

npx aws-cdk synth --no-staging > template.yaml

Les parties importantes du modèle CloudFormation sont :

Resources:
  mytable0324D45C:
    Type: AWS::DynamoDB::Table

  mycdkstack4E08F0DD:
    Type: AWS::Lambda::Function
    Properties:
      Environment:
        Variables:
          tableName:
            Ref: mytable0324D45C

Remarquez comment la variable d’environnement du nom de la table pointe vers une référence qui sera éventuellement
qui sera éventuellement remplacée par la valeur réelle de CloudFormation.
.

Lorsque nous déployons notre pile, nous pouvons voir que la valeur de la variable d’environnement
est résolue et accessible dans notre fonction Lambda :

valeur résolue dans la fonction lambda

Problèmes avec les jetons CDK #

Une source fréquente de confusion avec les jetons dans CDK est lorsque nous essayons d’accéder à l’objet
region, accountId ou availabilityZones propriétés dans un environnement
agnostique et obtenir des valeurs Token en retour.

Il est fréquent de devoir mettre à jour conditionnellement les types de ressources en fonction du compte
compte ou la région dans laquelle nous déployons.

const app = new cdk.App();

new MyCdkStack(app, 'my-cdk-stack', {
  stackName: `my-cdk-stack`,
  
  
  
  
  
});

Si nous essayons maintenant d’accéder à la ressource region, accountId ou availabilityZones dans notre
code CDK :

export class MyCdkStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    
    console.log('accountId: ', cdk.Stack.of(this).account);
    console.log('region: ', cdk.Stack.of(this).region);
    console.log('availability zones: ', cdk.Stack.of(this).availabilityZones);
  }
}

Nous recevrions simplement des valeurs de Token non résolues :

props de pile agnostique env.

Pour résoudre ce problème, il faut décommenter les lignes commentées dans le snippet ci-dessus
et de définir explicitement l’environnement de notre pile. J’ai écrit un article sur
cet –
Obtenir la région et le accountId dans CDK

Exportation des valeurs de jetons en tant que sorties #

Il est souvent nécessaire d’exporter les attributs des ressources en tant que sorties, afin qu’ils
afin de pouvoir y accéder depuis notre code frontal.

Par exemple, pour permettre à notre code frontal d’accéder à l’url d’une API, nous utiliserions des
Outputs et écrire les Outputs dans un fichier JSON, que le code frontal peut importer et utiliser.
et utiliser.

Voyons comment nous pouvons exporter nos noms de lambda et de table et quand les valeurs sont
résolues.

const myTable = new dynamodb.Table(this, 'my-table', {
  partitionKey: {name: 'todoId', type: dynamodb.AttributeType.NUMBER},
  billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
  removalPolicy: cdk.RemovalPolicy.DESTROY,
});

const myFunction = new NodejsFunction(this, id, {
  runtime: lambda.Runtime.NODEJS_16_X,
  handler: 'main',
  entry: path.join(__dirname, `/../src/path/index.js`),
  environment: {
    tableName: myTable.tableName,
  },
});


new cdk.CfnOutput(this, 'tableName', {value: myTable.tableName});
new cdk.CfnOutput(this, 'lambdaName', {value: myFunction.functionName});

Déployons notre pile et voyons si les valeurs sont résolues dans le fichier :

npx aws-cdk deploy --outputs-file ./cdk-exports.json

Si nous ouvrons le fichier cdk-exports.json après le déploiement, le résultat ressemble à
comme :

{
  "my-cdk-stack": {
    "tableName": "my-cdk-stack-mytable0324D45C-11VORISY29H3L",
    "lambdaName": "my-cdk-stack-mycdkstack4E08F0DD-KVZpFjrsLC3F"
  }
}

Le concept est le même, notre CloudFormation a spécifié des références
à ces ressources, qui seront éventuellement remplacées par les valeurs réelles au moment du
déploiement
:

Resources:
  mytable0324D45C:
    Type: AWS::DynamoDB::Table
  mycdkstack4E08F0DD:
    Type: AWS::Lambda::Function


Outputs:
  tableName:
    Value:
      Ref: mytable0324D45C
  lambdaName:
    Value:
      Ref: mycdkstack4E08F0DD

Discussion #

Les jetons sont des valeurs de remplacement qui sont remplacées par la valeur réelle au moment du déploiement par CloudFormation.
par CloudFormation au moment du déploiement
.

Si nous essayons d’accéder aux attributs des ressources dans notre code CDK, c’est-à-dire dans des instructions conditionnelles, nous obtiendrons une valeur Token codée.

La source de confusion la plus courante consiste à essayer d’accéder à la ressource accountId,
region ou availabilityZones et obtenir des valeurs de Token, parce que nous
n’avons pas défini l’environnement de la pile de manière explicite.
Comment obtenir accountId et région dans AWS CDK ?

Lecture complémentaire #



Source link

Laisser un commentaire