Sélectionner vos préférences de cookies

Nous utilisons des cookies essentiels et des outils similaires qui sont nécessaires au fonctionnement de notre site et à la fourniture de nos services. Nous utilisons des cookies de performance pour collecter des statistiques anonymes afin de comprendre comment les clients utilisent notre site et d’apporter des améliorations. Les cookies essentiels ne peuvent pas être désactivés, mais vous pouvez cliquer sur « Personnaliser » ou « Refuser » pour refuser les cookies de performance.

Si vous êtes d’accord, AWS et les tiers approuvés utiliseront également des cookies pour fournir des fonctionnalités utiles au site, mémoriser vos préférences et afficher du contenu pertinent, y compris des publicités pertinentes. Pour accepter ou refuser tous les cookies non essentiels, cliquez sur « Accepter » ou « Refuser ». Pour effectuer des choix plus détaillés, cliquez sur « Personnaliser ».

AWS CDK Constructions

Mode de mise au point
AWS CDK Constructions - AWS Cloud Development Kit (AWS CDK) v2

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.

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.

Les constructions sont les éléments de base des AWS Cloud Development Kit (AWS CDK) applications. Une construction est un composant de votre application qui représente une ou plusieurs AWS CloudFormation ressources et leur configuration. Vous créez votre application, pièce par pièce, en important et en configurant des constructions.

Importer et utiliser des constructions

Les constructions sont des classes que vous importez dans vos applications CDK depuis la bibliothèque de constructions AWS . Vous pouvez également créer et distribuer vos propres constructions, ou utiliser des constructions créées par des développeurs tiers.

Les constructions font partie du modèle de programmation des constructions (CPM). Ils peuvent être utilisés avec d'autres outils tels que CDK pour Terraform (CDKtf), CDK pour Kubernetes (CDK8s), et Projen.

De nombreux tiers ont également publié des constructions compatibles avec le AWS CDK. Visitez Construct Hub pour découvrir l'écosystème AWS CDK des partenaires de construction.

Construisez des niveaux

Les constructions de la bibliothèque AWS de constructions sont classées en trois niveaux. Chaque niveau offre un niveau d'abstraction croissant. Plus l'abstraction est élevée, plus la configuration est facile et nécessite moins d'expertise. Plus l'abstraction est faible, plus la personnalisation est importante, ce qui nécessite plus d'expertise.

Constructions de niveau 1 (L1)

Les constructions L1, également appelées ressources CFN, sont les constructions de niveau inférieur et n'offrent aucune abstraction. Chaque construction L1 renvoie directement à une seule AWS CloudFormation ressource. Avec les constructions L1, vous importez une construction qui représente une ressource spécifique AWS CloudFormation . Vous définissez ensuite les propriétés de la ressource dans votre instance de construction.

Les constructions L1 sont idéales à utiliser lorsque vous connaissez les propriétés de vos AWS ressources AWS CloudFormation et que vous avez besoin d'un contrôle total sur leur définition.

Dans la AWS bibliothèque de constructions, les constructions L1 sont nommées en commençant parCfn, suivi d'un identifiant pour la AWS CloudFormation ressource qu'elles représentent. Par exemple, la CfnBucket construction est une construction L1 qui représente une AWS::S3::Bucket AWS CloudFormation ressource.

Les constructions L1 sont générées à partir de la spécification de la AWS CloudFormation ressource. Si une ressource existe dans AWS CloudFormation, elle sera disponible AWS CDK sous forme de construction L1. Les nouvelles ressources ou propriétés peuvent prendre jusqu'à une semaine pour être disponibles dans la bibliothèque AWS Construct. Pour plus d'informations, consultez la référence aux types de AWS ressources et de propriétés dans le guide de AWS CloudFormation l'utilisateur.

Constructions de niveau 2 (L2)

Les constructions L2, également appelées constructions sélectionnées, sont soigneusement développées par l'équipe CDK et sont généralement le type de construction le plus utilisé. Les constructions L2 correspondent directement à des AWS CloudFormation ressources uniques, comme les constructions L1. Par rapport aux constructions L1, les constructions L2 fournissent une abstraction de niveau supérieur grâce à une API intuitive basée sur l'intention. Les constructions L2 incluent des configurations de propriétés par défaut judicieuses, des politiques de sécurité conformes aux meilleures pratiques et génèrent une grande partie du code standard et de la logique de collage pour vous.

Les constructions L2 fournissent également des méthodes d'assistance pour la plupart des ressources qui simplifient et accélèrent la définition des propriétés, des autorisations, des interactions basées sur des événements entre les ressources, etc.

La s3.Bucket classe est un exemple de construction L2 pour une ressource de bucket Amazon Simple Storage Service (Amazon S3).

La AWS bibliothèque de constructions contient des constructions L2 désignées comme stables et prêtes à être utilisées en production. Pour les constructions L2 en cours de développement, elles sont désignées comme expérimentales et proposées dans un module distinct.

Constructions de niveau 3 (L3)

Les constructions L3, également appelées modèles, constituent le plus haut niveau d'abstraction. Chaque construction L3 peut contenir un ensemble de ressources configurées pour fonctionner ensemble afin d'accomplir une tâche ou un service spécifique au sein de votre application. Les constructions L3 sont utilisées pour créer des AWS architectures complètes pour des cas d'utilisation particuliers dans votre application.

Pour fournir des conceptions de système complètes ou des parties importantes d'un système plus vaste, les constructions L3 proposent des configurations de propriétés par défaut bien définies. Ils sont construits autour d'une approche particulière visant à résoudre un problème et à fournir une solution. Avec les constructions L3, vous pouvez créer et configurer plusieurs ressources rapidement, avec un minimum d'entrées et de code.

La ecsPatterns.ApplicationLoadBalancedFargateService classe est un exemple de construction L3 qui représente un AWS Fargate service exécuté sur un cluster Amazon Elastic Container Service (Amazon ECS) et dirigé par un équilibreur de charge d'application.

À l'instar des constructions L2, les constructions L3 prêtes à être utilisées en production sont incluses dans la bibliothèque de constructions. AWS Les modules en cours de développement sont proposés dans des modules distincts.

Définition de constructions

Montage

La composition est le modèle clé pour définir des abstractions de haut niveau par le biais de constructions. Une construction de haut niveau peut être composée d'un nombre quelconque de constructions de niveau inférieur. Du bas vers le haut, vous utilisez des structures pour organiser les AWS ressources individuelles que vous souhaitez déployer. Vous utilisez les abstractions qui conviennent à votre objectif, avec autant de niveaux que vous le souhaitez.

Avec la composition, vous définissez des composants réutilisables et vous les partagez comme n'importe quel autre code. Par exemple, une équipe peut définir une construction qui met en œuvre les meilleures pratiques de l'entreprise pour une table Amazon DynamoDB, notamment la sauvegarde, la réplication globale, le dimensionnement automatique et la surveillance. L'équipe peut partager le concept en interne avec d'autres équipes ou en public.

Les équipes peuvent utiliser des constructions comme n'importe quel autre package de bibliothèque. Lorsque la bibliothèque est mise à jour, les développeurs ont accès aux améliorations et aux corrections de bogues de la nouvelle version, comme pour toute autre bibliothèque de code.

Initialisation

Les constructions sont implémentées dans des classes qui étendent la classe de base Construct. Vous définissez une construction en instanciant la classe. Toutes les constructions prennent trois paramètres lorsqu'elles sont initialisées :

  • scope — Le parent ou le propriétaire de la construction. Il peut s'agir d'une pile ou d'une autre construction. La portée détermine la place de la construction dans l'arbre de construction. Vous devez généralement transmettre this self Python), qui représente l'objet actuel, pour le scope.

  • idIdentifiant qui doit être unique dans le champ d'application. L'identifiant sert d'espace de noms pour tout ce qui est défini dans la construction. Il est utilisé pour générer des identifiants uniques, tels que des noms de ressources et des éléments AWS CloudFormation logiques IDs.

    Les identifiants doivent uniquement être uniques au sein d'un périmètre. Cela vous permet d'instancier et de réutiliser des constructions sans vous soucier des constructions et des identifiants qu'elles peuvent contenir, et de composer des constructions sous forme d'abstractions de niveau supérieur. De plus, les portées permettent de faire référence à des groupes de constructions en une seule fois. Les exemples incluent le balisage ou la spécification de l'endroit où les constructions seront déployées.

  • props — Ensemble de propriétés ou d'arguments de mots clés, selon le langage, qui définissent la configuration initiale de la construction. Les constructions de niveau supérieur fournissent davantage de valeurs par défaut, et si tous les éléments accessoires sont facultatifs, vous pouvez complètement omettre le paramètre props.

Configuration

La plupart des constructions acceptent props comme troisième argument (ou en Python, des arguments de mots clés) une collection nom/valeur qui définit la configuration de la construction. L'exemple suivant définit un bucket avec le chiffrement AWS Key Management Service (AWS KMS) et l'hébergement statique de sites Web activés. Comme elle ne spécifie pas explicitement de clé de chiffrement, la Bucket construction en définit une nouvelle kms.Key et l'associe au bucket.

TypeScript
new s3.Bucket(this, 'MyEncryptedBucket', { encryption: s3.BucketEncryption.KMS, websiteIndexDocument: 'index.html' });
JavaScript
new s3.Bucket(this, 'MyEncryptedBucket', { encryption: s3.BucketEncryption.KMS, websiteIndexDocument: 'index.html' });
Python
s3.Bucket(self, "MyEncryptedBucket", encryption=s3.BucketEncryption.KMS, website_index_document="index.html")
Java
Bucket.Builder.create(this, "MyEncryptedBucket") .encryption(BucketEncryption.KMS_MANAGED) .websiteIndexDocument("index.html").build();
C#
new Bucket(this, "MyEncryptedBucket", new BucketProps { Encryption = BucketEncryption.KMS_MANAGED, WebsiteIndexDocument = "index.html" });
Go
awss3.NewBucket(stack, jsii.String("MyEncryptedBucket"), &awss3.BucketProps{ Encryption: awss3.BucketEncryption_KMS, WebsiteIndexDocument: jsii.String("index.html"), })
new s3.Bucket(this, 'MyEncryptedBucket', { encryption: s3.BucketEncryption.KMS, websiteIndexDocument: 'index.html' });

Interaction avec les constructions

Les constructions sont des classes qui étendent la classe Construct de base. Après avoir instancié une construction, l'objet de construction expose un ensemble de méthodes et de propriétés qui vous permettent d'interagir avec la construction et de la transmettre comme référence à d'autres parties du système.

Le AWS CDK framework n'impose aucune restriction sur APIs les constructions. Les auteurs peuvent définir l'API de leur choix. Cependant, les AWS constructions incluses dans la AWS bibliothèque de constructions, telles ques3.Bucket, suivent les directives et les modèles courants. Cela garantit une expérience cohérente sur toutes les AWS ressources.

La plupart AWS des constructions comportent un ensemble de méthodes d'octroi que vous pouvez utiliser pour accorder des autorisations AWS Identity and Access Management (IAM) sur cette construction à un principal. L'exemple suivant accorde au groupe IAM data-science l'autorisation de lire depuis le compartiment Amazon S3raw-data.

TypeScript
const rawData = new s3.Bucket(this, 'raw-data'); const dataScience = new iam.Group(this, 'data-science'); rawData.grantRead(dataScience);
JavaScript
const rawData = new s3.Bucket(this, 'raw-data'); const dataScience = new iam.Group(this, 'data-science'); rawData.grantRead(dataScience);
Python
raw_data = s3.Bucket(self, 'raw-data') data_science = iam.Group(self, 'data-science') raw_data.grant_read(data_science)
Java
Bucket rawData = new Bucket(this, "raw-data"); Group dataScience = new Group(this, "data-science"); rawData.grantRead(dataScience);
C#
var rawData = new Bucket(this, "raw-data"); var dataScience = new Group(this, "data-science"); rawData.GrantRead(dataScience);
Go
rawData := awss3.NewBucket(stack, jsii.String("raw-data"), nil) dataScience := awsiam.NewGroup(stack, jsii.String("data-science"), nil) rawData.GrantRead(dataScience, nil)
const rawData = new s3.Bucket(this, 'raw-data'); const dataScience = new iam.Group(this, 'data-science'); rawData.grantRead(dataScience);

Un autre modèle courant est que AWS les constructions définissent l'un des attributs de la ressource à partir de données fournies ailleurs. Les attributs peuvent inclure les noms des ressources Amazon (ARNs), les noms ou URLs.

Le code suivant définit une AWS Lambda fonction et l'associe à une file d'attente Amazon Simple Queue Service (Amazon SQS) via l'URL de la file d'attente dans une variable d'environnement.

TypeScript
const jobsQueue = new sqs.Queue(this, 'jobs'); const createJobLambda = new lambda.Function(this, 'create-job', { runtime: lambda.Runtime.NODEJS_18_X, handler: 'index.handler', code: lambda.Code.fromAsset('./create-job-lambda-code'), environment: { QUEUE_URL: jobsQueue.queueUrl } });
JavaScript
const jobsQueue = new sqs.Queue(this, 'jobs'); const createJobLambda = new lambda.Function(this, 'create-job', { runtime: lambda.Runtime.NODEJS_18_X, handler: 'index.handler', code: lambda.Code.fromAsset('./create-job-lambda-code'), environment: { QUEUE_URL: jobsQueue.queueUrl } });
Python
jobs_queue = sqs.Queue(self, "jobs") create_job_lambda = lambda_.Function(self, "create-job", runtime=lambda_.Runtime.NODEJS_18_X, handler="index.handler", code=lambda_.Code.from_asset("./create-job-lambda-code"), environment=dict( QUEUE_URL=jobs_queue.queue_url ) )
Java
final Queue jobsQueue = new Queue(this, "jobs"); Function createJobLambda = Function.Builder.create(this, "create-job") .handler("index.handler") .code(Code.fromAsset("./create-job-lambda-code")) .environment(java.util.Map.of( // Map.of is Java 9 or later "QUEUE_URL", jobsQueue.getQueueUrl()) .build();
C#
var jobsQueue = new Queue(this, "jobs"); var createJobLambda = new Function(this, "create-job", new FunctionProps { Runtime = Runtime.NODEJS_18_X, Handler = "index.handler", Code = Code.FromAsset(@".\create-job-lambda-code"), Environment = new Dictionary<string, string> { ["QUEUE_URL"] = jobsQueue.QueueUrl } });
Go
createJobLambda := awslambda.NewFunction(stack, jsii.String("create-job"), &awslambda.FunctionProps{ Runtime: awslambda.Runtime_NODEJS_18_X(), Handler: jsii.String("index.handler"), Code: awslambda.Code_FromAsset(jsii.String(".\\create-job-lambda-code"), nil), Environment: &map[string]*string{ "QUEUE_URL": jsii.String(*jobsQueue.QueueUrl()), }, })
const jobsQueue = new sqs.Queue(this, 'jobs'); const createJobLambda = new lambda.Function(this, 'create-job', { runtime: lambda.Runtime.NODEJS_18_X, handler: 'index.handler', code: lambda.Code.fromAsset('./create-job-lambda-code'), environment: { QUEUE_URL: jobsQueue.queueUrl } });

Pour plus d'informations sur les modèles d'API les plus courants de la bibliothèque AWS Construct, consultezLes ressources et le AWS CDK.

Structure de l'application et de la pile

Les Stack classes App et de la bibliothèque AWS de constructions sont des constructions uniques. Comparées à d'autres constructions, elles ne configurent pas AWS les ressources par elles-mêmes. Ils sont plutôt utilisés pour fournir un contexte à vos autres constructions. Toutes les constructions qui représentent AWS des ressources doivent être définies, directement ou indirectement, dans le cadre d'une Stack construction. Stackles constructions sont définies dans le cadre d'une App construction.

Pour en savoir plus sur les applications CDK, consultezAWS CDK applis. Pour en savoir plus sur les piles CDK, consultez. Présentation des AWS CDK piles

L'exemple suivant définit une application avec une pile unique. Au sein de la pile, une construction L2 est utilisée pour configurer une ressource de compartiment Amazon S3.

TypeScript
import { App, Stack, StackProps } from 'aws-cdk-lib'; import * as s3 from 'aws-cdk-lib/aws-s3'; class HelloCdkStack extends Stack { constructor(scope: App, id: string, props?: StackProps) { super(scope, id, props); new s3.Bucket(this, 'MyFirstBucket', { versioned: true }); } } const app = new App(); new HelloCdkStack(app, "HelloCdkStack");
JavaScript
const { App , Stack } = require('aws-cdk-lib'); const s3 = require('aws-cdk-lib/aws-s3'); class HelloCdkStack extends Stack { constructor(scope, id, props) { super(scope, id, props); new s3.Bucket(this, 'MyFirstBucket', { versioned: true }); } } const app = new App(); new HelloCdkStack(app, "HelloCdkStack");
Python
from aws_cdk import App, Stack import aws_cdk.aws_s3 as s3 from constructs import Construct class HelloCdkStack(Stack): def __init__(self, scope: Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) s3.Bucket(self, "MyFirstBucket", versioned=True) app = App() HelloCdkStack(app, "HelloCdkStack")
Java

Pile définie dans HelloCdkStack.java le fichier :

import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.services.s3.*; public class HelloCdkStack extends Stack { public HelloCdkStack(final Construct scope, final String id) { this(scope, id, null); } public HelloCdkStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Bucket.Builder.create(this, "MyFirstBucket") .versioned(true).build(); } }

Application définie dans HelloCdkApp.java le fichier :

import software.amazon.awscdk.App; import software.amazon.awscdk.StackProps; public class HelloCdkApp { public static void main(final String[] args) { App app = new App(); new HelloCdkStack(app, "HelloCdkStack", StackProps.builder() .build()); app.synth(); } }
C#
using Amazon.CDK; using Amazon.CDK.AWS.S3; namespace HelloCdkApp { internal static class Program { public static void Main(string[] args) { var app = new App(); new HelloCdkStack(app, "HelloCdkStack"); app.Synth(); } } public class HelloCdkStack : Stack { public HelloCdkStack(Construct scope, string id, IStackProps props=null) : base(scope, id, props) { new Bucket(this, "MyFirstBucket", new BucketProps { Versioned = true }); } } }
Go
func NewHelloCdkStack(scope constructs.Construct, id string, props *HelloCdkStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) awss3.NewBucket(stack, jsii.String("MyFirstBucket"), &awss3.BucketProps{ Versioned: jsii.Bool(true), }) return stack }
import { App, Stack, StackProps } from 'aws-cdk-lib'; import * as s3 from 'aws-cdk-lib/aws-s3'; class HelloCdkStack extends Stack { constructor(scope: App, id: string, props?: StackProps) { super(scope, id, props); new s3.Bucket(this, 'MyFirstBucket', { versioned: true }); } } const app = new App(); new HelloCdkStack(app, "HelloCdkStack");

Travailler avec des constructions

Utilisation des constructions L1

Les constructions L1 mappent directement aux ressources individuelles AWS CloudFormation . Vous devez fournir la configuration requise pour la ressource.

Dans cet exemple, nous créons un bucket objet à l'aide de la construction CfnBucket L1 :

TypeScript
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", { bucketName: "amzn-s3-demo-bucket" });
JavaScript
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", { bucketName: "amzn-s3-demo-bucket" });
Python
bucket = s3.CfnBucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket")
Java
CfnBucket bucket = new CfnBucket.Builder().bucketName("amzn-s3-demo-bucket").build();
C#
var bucket = new CfnBucket(this, "amzn-s3-demo-bucket", new CfnBucketProps { BucketName= "amzn-s3-demo-bucket" });
Go
awss3.NewCfnBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.CfnBucketProps{ BucketName: jsii.String("amzn-s3-demo-bucket"), })
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", { bucketName: "amzn-s3-demo-bucket" });

Les propriétés de construction qui ne sont pas de simples booléens, chaînes, nombres ou conteneurs sont traitées différemment dans les langues prises en charge.

TypeScript
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", { bucketName: "amzn-s3-demo-bucket", corsConfiguration: { corsRules: [{ allowedOrigins: ["*"], allowedMethods: ["GET"] }] } });
JavaScript
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", { bucketName: "amzn-s3-demo-bucket", corsConfiguration: { corsRules: [{ allowedOrigins: ["*"], allowedMethods: ["GET"] }] } });
Python

En Python, ces propriétés sont représentées par des types définis comme des classes internes de la construction L1. Par exemple, la propriété optionnelle cors_configuration de a CfnBucket nécessite un wrapper de typeCfnBucket.CorsConfigurationProperty. Nous définissons ici cors_configuration sur une CfnBucket instance.

bucket = CfnBucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket", cors_configuration=CfnBucket.CorsConfigurationProperty( cors_rules=[CfnBucket.CorsRuleProperty( allowed_origins=["*"], allowed_methods=["GET"] )] ) )
Java

En Java, ces propriétés sont représentées par des types définis comme des classes internes de la construction L1. Par exemple, la propriété optionnelle corsConfiguration de a CfnBucket nécessite un wrapper de typeCfnBucket.CorsConfigurationProperty. Nous définissons ici corsConfiguration sur une CfnBucket instance.

CfnBucket bucket = CfnBucket.Builder.create(this, "amzn-s3-demo-bucket") .bucketName("amzn-s3-demo-bucket") .corsConfiguration(new CfnBucket.CorsConfigurationProperty.Builder() .corsRules(Arrays.asList(new CfnBucket.CorsRuleProperty.Builder() .allowedOrigins(Arrays.asList("*")) .allowedMethods(Arrays.asList("GET")) .build())) .build()) .build();
C#

En C#, ces propriétés sont représentées par des types définis comme des classes internes de la construction L1. Par exemple, la propriété optionnelle CorsConfiguration de a CfnBucket nécessite un wrapper de typeCfnBucket.CorsConfigurationProperty. Nous définissons ici CorsConfiguration sur une CfnBucket instance.

var bucket = new CfnBucket(this, "amzn-s3-demo-bucket", new CfnBucketProps { BucketName = "amzn-s3-demo-bucket", CorsConfiguration = new CfnBucket.CorsConfigurationProperty { CorsRules = new object[] { new CfnBucket.CorsRuleProperty { AllowedOrigins = new string[] { "*" }, AllowedMethods = new string[] { "GET" }, } } } });
Go

Dans Go, ces types sont nommés à l'aide du nom de la construction L1, d'un trait de soulignement et du nom de la propriété. Par exemple, la propriété optionnelle CorsConfiguration de a CfnBucket nécessite un wrapper de typeCfnBucket_CorsConfigurationProperty. Nous définissons ici CorsConfiguration sur une CfnBucket instance.

awss3.NewCfnBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.CfnBucketProps{ BucketName: jsii.String("amzn-s3-demo-bucket"), CorsConfiguration: &awss3.CfnBucket_CorsConfigurationProperty{ CorsRules: []awss3.CorsRule{ awss3.CorsRule{ AllowedOrigins: jsii.Strings("*"), AllowedMethods: &[]awss3.HttpMethods{"GET"}, }, }, }, })
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", { bucketName: "amzn-s3-demo-bucket", corsConfiguration: { corsRules: [{ allowedOrigins: ["*"], allowedMethods: ["GET"] }] } });
Important

Vous ne pouvez pas utiliser de types de propriétés L2 avec des constructions L1, ou vice versa. Lorsque vous travaillez avec des constructions L1, utilisez toujours les types définis pour la construction L1 que vous utilisez. N'utilisez pas de types provenant d'autres constructions L1 (certains peuvent porter le même nom, mais ils ne sont pas du même type).

Certaines de nos références d'API spécifiques au langage contiennent actuellement des erreurs dans les chemins d'accès aux types de propriétés L1, ou ne documentent pas du tout ces classes. Nous espérons pouvoir régler ce problème bientôt. En attendant, n'oubliez pas que ces types sont toujours des classes internes de la construction L1 avec laquelle ils sont utilisés.

Utilisation de constructions L2

Dans l'exemple suivant, nous définissons un compartiment Amazon S3 en créant un objet à partir de la construction BucketL2 :

TypeScript
import * as s3 from 'aws-cdk-lib/aws-s3'; // "this" is HelloCdkStack new s3.Bucket(this, 'MyFirstBucket', { versioned: true });
JavaScript
const s3 = require('aws-cdk-lib/aws-s3'); // "this" is HelloCdkStack new s3.Bucket(this, 'MyFirstBucket', { versioned: true });
Python
import aws_cdk.aws_s3 as s3 # "self" is HelloCdkStack s3.Bucket(self, "MyFirstBucket", versioned=True)
Java
import software.amazon.awscdk.services.s3.*; public class HelloCdkStack extends Stack { public HelloCdkStack(final Construct scope, final String id) { this(scope, id, null); } public HelloCdkStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Bucket.Builder.create(this, "MyFirstBucket") .versioned(true).build(); } }
C#
using Amazon.CDK.AWS.S3; // "this" is HelloCdkStack new Bucket(this, "MyFirstBucket", new BucketProps { Versioned = true });
Go
import ( "github.com/aws/aws-cdk-go/awscdk/v2/awss3" "github.com/aws/jsii-runtime-go" ) // stack is HelloCdkStack awss3.NewBucket(stack, jsii.String("MyFirstBucket"), &awss3.BucketProps{ Versioned: jsii.Bool(true), })>
import * as s3 from 'aws-cdk-lib/aws-s3'; // "this" is HelloCdkStack new s3.Bucket(this, 'MyFirstBucket', { versioned: true });

MyFirstBucketn'est pas le nom du bucket AWS CloudFormation créé. Il s'agit d'un identifiant logique attribué à la nouvelle construction dans le contexte de votre application CDK. La valeur PhysicalName sera utilisée pour nommer la AWS CloudFormation ressource.

Utilisation de constructions tierces

Construct Hub est une ressource qui vous aidera à découvrir des constructions supplémentaires provenant de AWS tiers et de la communauté des CDK open source.

Écrire vos propres constructions

En plus d'utiliser des constructions existantes, vous pouvez également écrire vos propres constructions et permettre à n'importe qui de les utiliser dans ses applications. Toutes les constructions sont égales dans le AWS CDK. Les constructions de la AWS bibliothèque de constructions sont traitées de la même manière qu'une construction d'une bibliothèque tierce publiée via NPM, Maven, ou PyPI. Les constructions publiées dans le référentiel de packages interne de votre entreprise sont également traitées de la même manière.

Pour déclarer une nouvelle construction, créez une classe qui étend la classe de base Construct, dans le constructs package, puis suivez le modèle pour les arguments de l'initialiseur.

L'exemple suivant montre comment déclarer une construction qui représente un compartiment Amazon S3. Le compartiment S3 envoie une notification Amazon Simple Notification Service (Amazon SNS) chaque fois que quelqu'un y télécharge un fichier.

TypeScript
export interface NotifyingBucketProps { prefix?: string; } export class NotifyingBucket extends Construct { constructor(scope: Construct, id: string, props: NotifyingBucketProps = {}) { super(scope, id); const bucket = new s3.Bucket(this, 'bucket'); const topic = new sns.Topic(this, 'topic'); bucket.addObjectCreatedNotification(new s3notify.SnsDestination(topic), { prefix: props.prefix }); } }
JavaScript
class NotifyingBucket extends Construct { constructor(scope, id, props = {}) { super(scope, id); const bucket = new s3.Bucket(this, 'bucket'); const topic = new sns.Topic(this, 'topic'); bucket.addObjectCreatedNotification(new s3notify.SnsDestination(topic), { prefix: props.prefix }); } } module.exports = { NotifyingBucket }
Python
class NotifyingBucket(Construct): def __init__(self, scope: Construct, id: str, *, prefix=None): super().__init__(scope, id) bucket = s3.Bucket(self, "bucket") topic = sns.Topic(self, "topic") bucket.add_object_created_notification(s3notify.SnsDestination(topic), s3.NotificationKeyFilter(prefix=prefix))
Java
public class NotifyingBucket extends Construct { public NotifyingBucket(final Construct scope, final String id) { this(scope, id, null, null); } public NotifyingBucket(final Construct scope, final String id, final BucketProps props) { this(scope, id, props, null); } public NotifyingBucket(final Construct scope, final String id, final String prefix) { this(scope, id, null, prefix); } public NotifyingBucket(final Construct scope, final String id, final BucketProps props, final String prefix) { super(scope, id); Bucket bucket = new Bucket(this, "bucket"); Topic topic = new Topic(this, "topic"); if (prefix != null) bucket.addObjectCreatedNotification(new SnsDestination(topic), NotificationKeyFilter.builder().prefix(prefix).build()); } }
C#
public class NotifyingBucketProps : BucketProps { public string Prefix { get; set; } } public class NotifyingBucket : Construct { public NotifyingBucket(Construct scope, string id, NotifyingBucketProps props = null) : base(scope, id) { var bucket = new Bucket(this, "bucket"); var topic = new Topic(this, "topic"); bucket.AddObjectCreatedNotification(new SnsDestination(topic), new NotificationKeyFilter { Prefix = props?.Prefix }); } }
Go
type NotifyingBucketProps struct { awss3.BucketProps Prefix *string } func NewNotifyingBucket(scope constructs.Construct, id *string, props *NotifyingBucketProps) awss3.Bucket { var bucket awss3.Bucket if props == nil { bucket = awss3.NewBucket(scope, jsii.String(*id+"Bucket"), nil) } else { bucket = awss3.NewBucket(scope, jsii.String(*id+"Bucket"), &props.BucketProps) } topic := awssns.NewTopic(scope, jsii.String(*id+"Topic"), nil) if props == nil { bucket.AddObjectCreatedNotification(awss3notifications.NewSnsDestination(topic)) } else { bucket.AddObjectCreatedNotification(awss3notifications.NewSnsDestination(topic), &awss3.NotificationKeyFilter{ Prefix: props.Prefix, }) } return bucket }
export interface NotifyingBucketProps { prefix?: string; } export class NotifyingBucket extends Construct { constructor(scope: Construct, id: string, props: NotifyingBucketProps = {}) { super(scope, id); const bucket = new s3.Bucket(this, 'bucket'); const topic = new sns.Topic(this, 'topic'); bucket.addObjectCreatedNotification(new s3notify.SnsDestination(topic), { prefix: props.prefix }); } }
Note

Notre NotifyingBucket construction n'hérite pas de Bucket mais plutôt deConstruct. Nous utilisons la composition, et non l'héritage, pour regrouper un compartiment Amazon S3 et une rubrique Amazon SNS. En général, la composition est préférée à l'héritage lors du développement de AWS CDK constructions.

Le NotifyingBucket constructeur possède une signature de construction typique : scopeid, etprops. Le dernier argumentprops, est facultatif (obtient la valeur par défaut{}) car tous les accessoires sont facultatifs. (La Construct classe de base ne prend aucun props argument.) Vous pouvez définir une instance de cette construction dans votre application sansprops, par exemple :

TypeScript
new NotifyingBucket(this, 'MyNotifyingBucket');
JavaScript
new NotifyingBucket(this, 'MyNotifyingBucket');
Python
NotifyingBucket(self, "MyNotifyingBucket")
Java
new NotifyingBucket(this, "MyNotifyingBucket");
C#
new NotifyingBucket(this, "MyNotifyingBucket");
Go
NewNotifyingBucket(stack, jsii.String("MyNotifyingBucket"), nil)
new NotifyingBucket(this, 'MyNotifyingBucket');

Vous pouvez également utiliser props (en Java, un paramètre supplémentaire) pour spécifier le préfixe de chemin à filtrer, par exemple :

TypeScript
new NotifyingBucket(this, 'MyNotifyingBucket', { prefix: 'images/' });
JavaScript
new NotifyingBucket(this, 'MyNotifyingBucket', { prefix: 'images/' });
Python
NotifyingBucket(self, "MyNotifyingBucket", prefix="images/")
Java
new NotifyingBucket(this, "MyNotifyingBucket", "/images");
C#
new NotifyingBucket(this, "MyNotifyingBucket", new NotifyingBucketProps { Prefix = "/images" });
Go
NewNotifyingBucket(stack, jsii.String("MyNotifyingBucket"), &NotifyingBucketProps{ Prefix: jsii.String("images/"), })
new NotifyingBucket(this, 'MyNotifyingBucket', { prefix: 'images/' });

Généralement, vous souhaiterez également exposer certaines propriétés ou méthodes de vos constructions. Il n'est pas très utile d'avoir un sujet caché derrière votre construction, car les utilisateurs de votre construction ne peuvent pas s'y abonner. L'ajout d'une topic propriété permet aux consommateurs d'accéder au sujet interne, comme illustré dans l'exemple suivant :

TypeScript
export class NotifyingBucket extends Construct { public readonly topic: sns.Topic; constructor(scope: Construct, id: string, props: NotifyingBucketProps) { super(scope, id); const bucket = new s3.Bucket(this, 'bucket'); this.topic = new sns.Topic(this, 'topic'); bucket.addObjectCreatedNotification(new s3notify.SnsDestination(this.topic), { prefix: props.prefix }); } }
JavaScript
class NotifyingBucket extends Construct { constructor(scope, id, props) { super(scope, id); const bucket = new s3.Bucket(this, 'bucket'); this.topic = new sns.Topic(this, 'topic'); bucket.addObjectCreatedNotification(new s3notify.SnsDestination(this.topic), { prefix: props.prefix }); } } module.exports = { NotifyingBucket };
Python
class NotifyingBucket(Construct): def __init__(self, scope: Construct, id: str, *, prefix=None, **kwargs): super().__init__(scope, id) bucket = s3.Bucket(self, "bucket") self.topic = sns.Topic(self, "topic") bucket.add_object_created_notification(s3notify.SnsDestination(self.topic), s3.NotificationKeyFilter(prefix=prefix))
Java
public class NotifyingBucket extends Construct { public Topic topic = null; public NotifyingBucket(final Construct scope, final String id) { this(scope, id, null, null); } public NotifyingBucket(final Construct scope, final String id, final BucketProps props) { this(scope, id, props, null); } public NotifyingBucket(final Construct scope, final String id, final String prefix) { this(scope, id, null, prefix); } public NotifyingBucket(final Construct scope, final String id, final BucketProps props, final String prefix) { super(scope, id); Bucket bucket = new Bucket(this, "bucket"); topic = new Topic(this, "topic"); if (prefix != null) bucket.addObjectCreatedNotification(new SnsDestination(topic), NotificationKeyFilter.builder().prefix(prefix).build()); } }
C#
public class NotifyingBucket : Construct { public readonly Topic topic; public NotifyingBucket(Construct scope, string id, NotifyingBucketProps props = null) : base(scope, id) { var bucket = new Bucket(this, "bucket"); topic = new Topic(this, "topic"); bucket.AddObjectCreatedNotification(new SnsDestination(topic), new NotificationKeyFilter { Prefix = props?.Prefix }); } }
Go

Pour ce faire dans Go, nous aurons besoin d'un peu plus de plomberie. Notre NewNotifyingBucket fonction d'origine renvoyait unawss3.Bucket. Nous devrons étendre Bucket pour inclure un topic membre en créant une NotifyingBucket structure. Notre fonction renverra alors ce type.

type NotifyingBucket struct { awss3.Bucket topic awssns.Topic } func NewNotifyingBucket(scope constructs.Construct, id *string, props *NotifyingBucketProps) NotifyingBucket { var bucket awss3.Bucket if props == nil { bucket = awss3.NewBucket(scope, jsii.String(*id+"Bucket"), nil) } else { bucket = awss3.NewBucket(scope, jsii.String(*id+"Bucket"), &props.BucketProps) } topic := awssns.NewTopic(scope, jsii.String(*id+"Topic"), nil) if props == nil { bucket.AddObjectCreatedNotification(awss3notifications.NewSnsDestination(topic)) } else { bucket.AddObjectCreatedNotification(awss3notifications.NewSnsDestination(topic), &awss3.NotificationKeyFilter{ Prefix: props.Prefix, }) } var nbucket NotifyingBucket nbucket.Bucket = bucket nbucket.topic = topic return nbucket }
export class NotifyingBucket extends Construct { public readonly topic: sns.Topic; constructor(scope: Construct, id: string, props: NotifyingBucketProps) { super(scope, id); const bucket = new s3.Bucket(this, 'bucket'); this.topic = new sns.Topic(this, 'topic'); bucket.addObjectCreatedNotification(new s3notify.SnsDestination(this.topic), { prefix: props.prefix }); } }

Désormais, les consommateurs peuvent s'abonner au sujet, par exemple :

TypeScript
const queue = new sqs.Queue(this, 'NewImagesQueue'); const images = new NotifyingBucket(this, '/images'); images.topic.addSubscription(new sns_sub.SqsSubscription(queue));
JavaScript
const queue = new sqs.Queue(this, 'NewImagesQueue'); const images = new NotifyingBucket(this, '/images'); images.topic.addSubscription(new sns_sub.SqsSubscription(queue));
Python
queue = sqs.Queue(self, "NewImagesQueue") images = NotifyingBucket(self, prefix="Images") images.topic.add_subscription(sns_sub.SqsSubscription(queue))
Java
NotifyingBucket images = new NotifyingBucket(this, "MyNotifyingBucket", "/images"); images.topic.addSubscription(new SqsSubscription(queue));
C#
var queue = new Queue(this, "NewImagesQueue"); var images = new NotifyingBucket(this, "MyNotifyingBucket", new NotifyingBucketProps { Prefix = "/images" }); images.topic.AddSubscription(new SqsSubscription(queue));
Go
queue := awssqs.NewQueue(stack, jsii.String("NewImagesQueue"), nil) images := NewNotifyingBucket(stack, jsii.String("MyNotifyingBucket"), &NotifyingBucketProps{ Prefix: jsii.String("/images"), }) images.topic.AddSubscription(awssnssubscriptions.NewSqsSubscription(queue, nil))
const queue = new sqs.Queue(this, 'NewImagesQueue'); const images = new NotifyingBucket(this, '/images'); images.topic.addSubscription(new sns_sub.SqsSubscription(queue));

En savoir plus

La vidéo suivante fournit un aperçu complet des constructions CDK et explique comment les utiliser dans vos applications CDK.

Rubrique suivante :

Environnements

Rubrique précédente :

Étapes du CDK
ConfidentialitéConditions d'utilisation du sitePréférences de cookies
© 2025, Amazon Web Services, Inc. ou ses affiliés. Tous droits réservés.