Ceci est le guide du AWS CDK développeur de la version 2. L'ancien CDK v1 est entré en maintenance le 1er juin 2022 et a pris fin le 1er juin 2023.
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.
Importez des ressources d'un AWS CloudFormation modèle dans vos AWS Cloud Development Kit (AWS CDK) applications en utilisant la cloudformation-include.CfnInclude
construction pour convertir les ressources en constructions L1.
Après l'importation, vous pouvez utiliser ces ressources dans votre application de la même manière que si elles étaient initialement définies dans le AWS CDK code. Vous pouvez également utiliser ces constructions L1 dans des constructions de niveau supérieur AWS CDK . Par exemple, cela peut vous permettre d'utiliser les méthodes d'octroi d'autorisations L2 avec les ressources qu'elles définissent.
La cloudformation-include.CfnInclude
construction ajoute essentiellement un wrapper d' AWS CDK API à n'importe quelle ressource de votre AWS CloudFormation modèle. Utilisez cette fonctionnalité pour importer vos AWS CloudFormation modèles existants AWS CDK un par un. Ce faisant, vous pouvez gérer vos ressources existantes à l'aide de AWS CDK structures permettant de tirer parti des avantages des abstractions de haut niveau. Vous pouvez également utiliser cette fonctionnalité pour vendre vos AWS CloudFormation modèles aux AWS CDK développeurs en fournissant une API de AWS CDK construction.
Note
AWS CDK La v1 était également incluse aws-cdk-lib.CfnInclude
, qui était auparavant utilisée dans le même but général. Cependant, il lui manque une grande partie des fonctionnalités decloudformation-include.CfnInclude
.
Rubriques
Importer un AWS CloudFormation modèle
Voici un exemple de AWS CloudFormation modèle que nous utiliserons pour fournir des exemples dans cette rubrique. Copiez et enregistrez le modèle comme my-template.json
suit. Après avoir étudié ces exemples, vous pouvez approfondir votre exploration en utilisant l'un de vos AWS CloudFormation modèles déployés existants. Vous pouvez les obtenir depuis la AWS CloudFormation
console.
{
"Resources": {
"amzn-s3-demo-bucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "amzn-s3-demo-bucket",
}
}
}
}
Vous pouvez utiliser des modèles JSON ou YAML. Nous recommandons le format JSON s'il est disponible, car les analyseurs YAML peuvent légèrement varier quant à ce qu'ils acceptent.
Voici un exemple d'importation de l'exemple de modèle dans votre AWS CDK application à l'aide decloudformation-include
. Les modèles sont importés dans le contexte d'une pile CDK.
import * as cdk from 'aws-cdk-lib';
import * as cfninc from 'aws-cdk-lib/cloudformation-include';
import { Construct } from 'constructs';
export class MyStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const template = new cfninc.CfnInclude(this, 'Template', {
templateFile: 'my-template.json',
});
}
}
Par défaut, l'importation d'une ressource préserve l'ID logique d'origine de la ressource tel qu'il figure dans le modèle. Ce comportement convient à l'importation d'un AWS CloudFormation modèle dans le AWS CDK, où la logique IDs doit être conservée. AWS CloudFormation a besoin de ces informations pour reconnaître ces ressources importées comme étant les mêmes ressources que celles du AWS CloudFormation modèle.
Si vous développez un wrapper de AWS CDK construction pour le modèle afin qu'il puisse être utilisé par d'autres AWS CDK développeurs, demandez IDs plutôt de AWS CDK générer une nouvelle ressource. Ce faisant, la construction peut être utilisée plusieurs fois dans une pile sans conflits de noms. Pour ce faire, définissez la preserveLogicalIds
propriété sur false
lors de l'importation du modèle. Voici un exemple :
const template = new cfninc.CfnInclude(this, 'MyConstruct', {
templateFile: 'my-template.json',
preserveLogicalIds: false
});
Pour placer les ressources importées sous le contrôle de votre AWS CDK application, ajoutez la pile à App
:
import * as cdk from 'aws-cdk-lib';
import { MyStack } from '../lib/my-stack';
const app = new cdk.App();
new MyStack(app, 'MyStack');
Pour vérifier qu'aucune modification involontaire n'est apportée aux AWS ressources de la pile, vous pouvez effectuer une différence. Utilisez le AWS CDK CLI cdk diff
commande et omettez toute AWS CDK métadonnée spécifique. Voici un exemple :
cdk diff --no-version-reporting --no-path-metadata --no-asset-metadata
Une fois que vous avez importé un AWS CloudFormation modèle, l' AWS CDK application doit devenir la source fiable de vos ressources importées. Pour apporter des modifications à vos ressources, modifiez-les dans votre AWS CDK application et déployez-les à l'aide du AWS CDK CLI cdk deploycommande.
Accès aux ressources importées
Le nom template
figurant dans l'exemple de code représente le AWS CloudFormation modèle importé. Pour accéder à une ressource à partir de celui-ci, utilisez la getResource()
méthode de l'objet. Pour accéder à la ressource renvoyée en tant que type de ressource spécifique, convertissez le résultat dans le type souhaité. Cela n'est pas nécessaire en Python ou JavaScript. Voici un exemple :
const cfnBucket = template.getResource('amzn-s3-demo-bucket') as s3.CfnBucket;
À partir de cet exemple, cfnBucket
il s'agit désormais d'une instance de la aws-s3.CfnBucket
classe. Il s'agit d'une construction L1 qui représente la AWS CloudFormation ressource correspondante. Vous pouvez la traiter comme n'importe quelle autre ressource de ce type. Par exemple, vous pouvez obtenir sa valeur ARN à l'aide de la bucket.attrArn
propriété.
Pour encapsuler la CfnBucket
ressource L1 dans une aws-s3.Bucket
instance L2 à la place, utilisez les méthodes statiques fromBucketArn()
fromBucketAttributes()
, ou. fromBucketName()
Habituellement, la fromBucketName()
méthode est la plus pratique. Voici un exemple :
const bucket = s3.Bucket.fromBucketName(this, 'Bucket', cfnBucket.ref);
D'autres constructions L2 ont des méthodes similaires pour créer la construction à partir d'une ressource existante.
Lorsque vous encapsulez une construction L1 dans une construction L2, cela ne crée pas de nouvelle ressource. D'après notre exemple, nous ne créons pas un deuxième compartiment S3 ;. Au lieu de cela, la nouvelle Bucket
instance encapsule l'instance existanteCfnBucket
.
D'après l'exemple, bucket
il s'agit désormais d'une Bucket
construction L2 qui se comporte comme n'importe quelle autre construction L2. Par exemple, vous pouvez accorder à une AWS Lambda fonction l'accès en écriture au bucket en utilisant la grantWrite()
méthode pratique du bucket. Il n'est pas nécessaire de définir manuellement la politique AWS Identity and Access Management (IAM) nécessaire. Voici un exemple :
bucket.grantWrite(lambdaFunc);
Remplacer les paramètres
Si votre AWS CloudFormation modèle contient des paramètres, vous pouvez les remplacer par des valeurs de temps de construction lors de l'importation en utilisant la parameters
propriété. Dans l'exemple suivant, nous remplaçons le UploadBucket
paramètre par l'ARN d'un bucket défini ailleurs dans notre AWS CDK code.
const template = new cfninc.CfnInclude(this, 'Template', {
templateFile: 'my-template.json',
parameters: {
'UploadBucket': bucket.bucketArn,
},
});
Importer d'autres éléments du modèle
Vous pouvez importer n'importe quel élément de AWS CloudFormation modèle, pas uniquement des ressources. Les éléments importés font partie de la AWS CDK
pile. Pour importer ces éléments, utilisez les méthodes suivantes de l'CfnInclude
objet :
-
getCondition()
— AWS CloudFormation conditions. -
getHook()
— AWS CloudFormation crochets pour les déploiements bleu/vert. -
getMapping()
— AWS CloudFormation mappages. -
getOutput()
— AWS CloudFormation sorties. -
getParameter()
— AWS CloudFormation paramètres. -
getRule()
— AWS CloudFormation règles pour les AWS Service Catalog modèles.
Chacune de ces méthodes renvoie une instance d'une classe qui représente le type spécifique d' AWS CloudFormation élément. Ces objets sont mutables. Les modifications que vous leur apportez apparaîtront dans le modèle généré à partir de la AWS CDK pile. Voici un exemple d'importation d'un paramètre depuis le modèle et de modification de sa valeur par défaut :
const param = template.getParameter('MyParameter');
param.default = "AWS CDK"
Importer des piles imbriquées
Vous pouvez importer des piles imbriquées en les spécifiant soit lors de l'importation de leur modèle principal, soit ultérieurement. Le modèle imbriqué doit être stocké dans un fichier local, mais référencé en tant que NestedStack
ressource dans le modèle principal. En outre, le nom de ressource utilisé dans le AWS CDK code doit correspondre au nom utilisé pour la pile imbriquée dans le modèle principal.
Compte tenu de cette définition de ressource dans le modèle principal, le code suivant montre comment importer la pile imbriquée référencée dans les deux sens.
"NestedStack": {
"Type": "AWS::CloudFormation::Stack",
"Properties": {
"TemplateURL": "https://my-s3-template-source.s3.amazonaws.com/nested-stack.json"
}
// include nested stack when importing main stack
const mainTemplate = new cfninc.CfnInclude(this, 'MainStack', {
templateFile: 'main-template.json',
loadNestedStacks: {
'NestedStack': {
templateFile: 'nested-template.json',
},
},
});
// or add it some time after importing the main stack
const nestedTemplate = mainTemplate.loadNestedStack('NestedTemplate', {
templateFile: 'nested-template.json',
});
Vous pouvez importer plusieurs piles imbriquées avec l'une ou l'autre méthode. Lorsque vous importez le modèle principal, vous fournissez un mappage entre le nom de ressource de chaque pile imbriquée et son fichier modèle. Ce mappage peut contenir autant d'entrées que vous le souhaitez. Pour le faire après l'importation initiale, appelez loadNestedStack()
une fois pour chaque pile imbriquée.
Après avoir importé une pile imbriquée, vous pouvez y accéder en utilisant la getNestedStack()
méthode du modèle principal.
const nestedStack = mainTemplate.getNestedStack('NestedStack').stack;
La getNestedStack()
méthode renvoie une IncludedNestedStack
instance. À partir de cette instance, vous pouvez accéder à l' AWS CDK NestedStack
instance via la stack
propriété, comme indiqué dans l'exemple. Vous pouvez également accéder à l'objet AWS CloudFormation modèle d'origine via includedTemplate
lequel vous pouvez charger des ressources et d'autres AWS CloudFormation éléments.