Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Constructions de couche 2
Le référentiel AWS CDK open sourceaws-cdk-lib
, est grossièrement divisée en un package par AWS service, bien que ce ne soit pas toujours le cas. Comme indiqué précédemment, les constructions L1 sont automatiquement générées pendant le processus de construction, alors quel est tout ce code que vous voyez lorsque vous regardez dans le référentiel ? Ce sont des constructions L2, qui sont des abstractions des constructions L1.
Les packages contiennent également une collection de TypeScript types, d'énumérations et d'interfaces ainsi que des classes d'assistance qui ajoutent plus de fonctionnalités, mais ces éléments servent tous à des constructions L2. Toutes les constructions L2 appellent leurs constructions L1 correspondantes dans leurs constructeurs lors de l'instanciation, et la construction L1 résultante qui est créée est accessible depuis la couche 2 comme suit :
const role = new Bucket(this, "amzn-s3-demo-bucket", {/*...BucketProps*/}); const cfnBucket = role.node.defaultChild;
La construction L2 prend les propriétés par défaut, les méthodes pratiques et les autres sucres syntaxiques et les applique à la construction L1. Cela élimine une grande partie de la répétition et de la verbosité nécessaires pour fournir des ressources directement. CloudFormation
Toutes les constructions L2 construisent leurs constructions L1 correspondantes sous le capot. Cependant, les constructions L2 n'étendent pas réellement les constructions L1. Les constructions L1 et L2 héritent toutes deux d'une classe spéciale appelée Construct. Dans la version 1 de AWS CDK la Construct
classe était intégrée au kit de développement, mais dans la version 2, il s'agit d'un package autonomeConstruct
classe est une construction L1, L2 ou L3. Les constructions L2 étendent directement cette classe alors que les constructions L1 étendent une classe appeléeCfnResource
, comme indiqué dans le tableau suivant.
Arbre d'héritage L1 |
Arbre d'héritage L2 |
---|---|
Construction L1 → classe CfnResource → classe abstraite CfnRefElement →→→ classe abstraite CfnElement |
Construction L2 → classe Construct |
Si les constructions L1 et L2 héritent de la Construct
classe, pourquoi les constructions L2 n'étendent-elles pas simplement L1 ? Eh bien, les classes situées entre la Construct
classe et la couche 1 verrouillent la construction L1 en place en tant qu'image miroir de la CloudFormation ressource. Ils contiennent des méthodes abstraites (méthodes que les classes en aval doivent inclure)_toCloudFormation
, comme celles qui obligent la construction à générer directement CloudFormation la syntaxe. Les constructions L2 ignorent ces classes et étendent directement la Construct
classe. Cela leur donne la flexibilité d'abstraire une grande partie du code nécessaire aux constructions L1 en les construisant séparément dans leurs constructeurs.
La section précédente présentait une side-by-side comparaison entre un compartiment S3 issu d'un CloudFormation modèle et ce même compartiment S3 rendu sous forme de construction L1. Cette comparaison a montré que les propriétés et la syntaxe sont presque identiques et que la construction L1 n'enregistre que trois ou quatre lignes par rapport à la CloudFormation construction. Comparons maintenant la construction L1 avec la construction L2 pour le même compartiment S3 :
Construction L1 pour le compartiment S3 |
Construction L2 pour le compartiment S3 |
---|---|
|
|
Comme vous pouvez le constater, la construction L2 est inférieure à la moitié de la taille de la construction L1. Les constructions L2 utilisent de nombreuses techniques pour réaliser cette consolidation. Certaines de ces techniques s'appliquent à une seule construction L2, mais d'autres peuvent être réutilisées dans plusieurs constructions afin qu'elles soient séparées dans leur propre classe pour être réutilisables. Les constructions L2 consolident CloudFormation la syntaxe de plusieurs manières, comme indiqué dans les sections suivantes.
Propriétés par défaut
Le moyen le plus simple de consolider le code de provisionnement d'une ressource consiste à transformer les paramètres de propriété les plus courants en paramètres par défaut. AWS CDK Il a accès à de puissants langages de programmation mais CloudFormation ne le fait pas. Ces valeurs par défaut sont donc souvent de nature conditionnelle. Il est parfois possible d'éliminer plusieurs lignes de CloudFormation configuration du AWS CDK code, car ces paramètres peuvent être déduits des valeurs d'autres propriétés transmises à la construction.
Structures, types et interfaces
Bien qu'il AWS CDK soit disponible dans plusieurs langages de programmation, il est écrit nativement TypeScript, de sorte que le système de types du langage est utilisé pour définir les types qui composent les constructions L2. L'étude approfondie de ce type de système dépasse le cadre de ce guide ; consultez la TypeScriptdocumentationtype
décrit le type de données que contient une variable particulière. Il peut s'agir de données de base telles que astring
, ou de données plus complexes telles queobject
. A TypeScript interface
est une autre façon d'exprimer le type d' TypeScriptobjet, et a struct
est un autre nom pour une interface.
TypeScript n'utilise pas le terme structure, mais si vous regardez dans la AWS CDK APIréférence, vous verrez qu'une structure n'est en fait qu'une autre TypeScript interface dans le code. La API référence fait également référence à certaines interfaces en tant qu'interfaces. Si les structures et les interfaces sont identiques, pourquoi la AWS CDK documentation fait-elle une distinction entre elles ?
Ce que l'on AWS CDK appelle des structures sont des interfaces qui représentent n'importe quel objet utilisé par une construction L2. Cela inclut les types d'objets pour les arguments de propriété transmis à la construction L2 lors de l'instanciation, tels que BucketProps
pour la construction S3 Bucket et pour TableProps
la construction DynamoDB Table, ainsi que les autres TypeScript interfaces utilisées dans le. AWS CDK En bref, s'il s'agit d'une TypeScript interface dans le AWS CDK et que son nom n'est pas préfixé par la lettreI
, il l' AWS CDK appelle une structure.
Inversement, il AWS CDK utilise le terme interface pour représenter les éléments de base. Un objet simple devrait être considéré comme une représentation appropriée d'une construction ou d'une classe d'assistance particulière. C'est-à-dire qu'une interface décrit ce que doivent être les propriétés publiques d'une construction L2. Tous les noms AWS CDK d'interface sont les noms de structures existantes ou de classes auxiliaires préfixés par la lettre. I
Toutes les constructions L2 étendent la Construct
classe, mais elles implémentent également l'interface correspondante. La construction L2 Bucket
implémente donc l'IBucket
interface.
Méthodes statiques
Chaque instance d'une construction L2 est également une instance de son interface correspondante, mais l'inverse n'est pas vrai. Cela est important lorsque vous parcourez une structure pour voir quels types de données sont requis. Si une structure possède une propriété appeléebucket
, qui nécessite le type de donnéesIBucket
, vous pouvez transmettre soit un objet contenant les propriétés répertoriées dans l'IBucket
interface, soit une instance d'un Bucket
L2. L'un ou l'autre fonctionnerait. Toutefois, si cette bucket
propriété appelait un L2Bucket
, vous ne pouviez transmettre qu'une Bucket
instance dans ce champ.
Cette distinction devient très importante lorsque vous importez des ressources préexistantes dans votre pile. Vous pouvez créer une construction L2 pour n'importe quelle ressource native de votre pile, mais si vous devez référencer une ressource créée en dehors de la pile, vous devez utiliser l'interface de cette construction L2. En effet, la création d'une construction L2 crée une nouvelle ressource s'il n'en existe pas déjà une dans cette pile. Les références aux ressources existantes doivent être des objets simples conformes à l'interface de cette construction L2.
Pour faciliter cela dans la pratique, la plupart des constructions L2 sont associées à un ensemble de méthodes statiques qui renvoient l'interface de cette construction L2. Ces méthodes statiques commencent généralement par le motfrom
. Les deux premiers arguments transmis à ces méthodes sont les mêmes scope
et les id
arguments sont requis pour une construction L2 standard. Cependant, le troisième argument props
n'est qu'un petit sous-ensemble de propriétés (ou parfois une seule propriété) qui définit une interface. Pour cette raison, lorsque vous transmettez une construction L2, dans la plupart des cas, seuls les éléments de l'interface sont requis. Ainsi, vous pouvez également utiliser les ressources importées, dans la mesure du possible.
// Example of referencing an external S3 bucket const preExistingBucket = Bucket.fromBucketName(this, "external-bucket", "name-of-bucket-that-already-exists");
Cependant, vous ne devez pas trop vous fier aux interfaces. Vous ne devez importer des ressources et utiliser les interfaces directement que lorsque cela est absolument nécessaire, car les interfaces ne fournissent pas la plupart des propriétés, telles que les méthodes d'assistance, qui rendent une construction L2 si puissante.
Méthodes auxiliaires
Une construction L2 est une classe programmatique plutôt qu'un simple objet. Elle peut donc exposer des méthodes de classe qui vous permettent de manipuler la configuration de vos ressources après l'instanciation. La construction L2 Role AWS Identity and Access Management (IAM) en est un bon exemple. Les extraits suivants montrent deux manières de créer le même IAM rôle à l'aide de la construction Role
L2.
Sans méthode auxiliaire :
const role = new Role(this, "my-iam-role", { assumedBy: new FederatedPrincipal('my-identity-provider.com'), managedPolicies: [ ManagedPolicy.fromAwsManagedPolicyName("ReadOnlyAccess") ], inlinePolicies: { lambdaPolicy: new PolicyDocument({ statements: [ new PolicyStatement({ effect: Effect.ALLOW, actions: [ 'lambda:UpdateFunctionCode' ], resources: [ 'arn:aws:lambda:us-east-1:123456789012:function:my-function' ] }) ] }) } });
Avec une méthode auxiliaire :
const role = new Role(this, "my-iam-role", { assumedBy: new FederatedPrincipal('my-identity-provider.com') }); role.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName("ReadOnlyAccess")); role.attachInlinePolicy(new Policy(this, "lambda-policy", { policyName: "lambdaPolicy", statements: [ new PolicyStatement({ effect: Effect.ALLOW, actions: [ 'lambda:UpdateFunctionCode' ], resources: [ 'arn:aws:lambda:us-east-1:123456789012:function:my-function' ] }) ] }));
La possibilité d'utiliser des méthodes d'instance pour manipuler la configuration des ressources après l'instanciation donne aux constructions L2 une flexibilité supplémentaire par rapport à la couche précédente. Les constructions L1 héritent également de certaines méthodes de ressources (telles queaddPropertyOverride
), mais ce n'est qu'à partir de la deuxième couche que vous obtenez des méthodes spécifiquement conçues pour cette ressource et ses propriétés.
Enums
CloudFormation la syntaxe vous oblige souvent à spécifier de nombreux détails afin de provisionner correctement une ressource. Cependant, la majorité des cas d'utilisation ne sont souvent couverts que par une poignée de configurations. La représentation de ces configurations à l'aide d'une série de valeurs énumérées peut réduire considérablement la quantité de code nécessaire.
Par exemple, dans l'exemple de code L2 du compartiment S3 décrit plus haut dans cette section, vous devez utiliser la bucketEncryption
propriété du CloudFormation modèle pour fournir tous les détails, y compris le nom de l'algorithme de chiffrement à utiliser. AWS CDK
Il fournit plutôt l'BucketEncryption
énumération, qui reprend les cinq formes les plus courantes de chiffrement des compartiments et vous permet d'exprimer chacune d'elles en utilisant des noms de variables uniques.
Qu'en est-il des cas extrêmes qui ne sont pas couverts par les énumérations ? L'un des objectifs d'une construction L2 est de simplifier la tâche de provisionnement d'une ressource de couche 1, de sorte que certains cas extrêmes moins courants risquent de ne pas être pris en charge dans la couche 2. Pour prendre en charge ces cas extrêmes, vous AWS CDK pouvez manipuler les propriétés CloudFormation des ressources sous-jacentes directement à l'aide de la addPropertyOverrideméthode. Pour en savoir plus sur les remplacements de propriétés, consultez la section Meilleures pratiques de ce guide et la section Abstractions et trappes d'échappement de la documentation. AWS CDK
Cours d'assistance
Parfois, une énumération ne peut pas accomplir la logique de programmation nécessaire pour configurer une ressource pour un cas d'utilisation donné. Dans ces situations, il propose AWS CDK souvent un cours d'assistance à la place. Une énumération est un objet simple qui propose une série de paires clé-valeur, tandis qu'une classe auxiliaire offre toutes les fonctionnalités d'une classe. TypeScript Une classe auxiliaire peut toujours agir comme une énumération en exposant des propriétés statiques, mais ces propriétés peuvent alors avoir leurs valeurs définies en interne avec une logique conditionnelle dans le constructeur de classe auxiliaire ou dans une méthode d'assistance.
Ainsi, bien que l'BucketEncryption
énumération puisse réduire la quantité de code nécessaire pour définir un algorithme de chiffrement sur un compartiment S3, cette même stratégie ne fonctionnerait pas pour définir des durées car les valeurs possibles sont tout simplement trop nombreuses parmi lesquelles choisir. La création d'une énumération pour chaque valeur serait bien plus difficile qu'elle n'en vaut la peine. Pour cette raison, une classe d'assistance est utilisée pour les paramètres de configuration par défaut d'un compartiment S3 Object Lock, tels que représentés par la ObjectLockRetentionclasse. ObjectLockRetention
contient deux méthodes statiques : l'une pour le maintien de la conformité et l'autre pour le maintien de la gouvernance. Les deux méthodes utilisent une instance de la classe d'assistance Duration comme argument pour exprimer la durée pendant laquelle le verrou doit être configuré.
La classe d' AWS Lambda assistance Runtime est un autre exemple. À première vue, il peut sembler que les propriétés statiques associées à cette classe puissent être gérées par une énumération. Cependant, chaque valeur de propriété représente une instance de la Runtime
classe elle-même, de sorte que la logique exécutée dans le constructeur de la classe n'a pas pu être atteinte dans une énumération.