Il s'agit du guide du développeur AWS CDK v2. 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.
Ressources et AWS CDK
Les ressources sont les éléments que vous configurez pour utiliser AWS les services de vos applications. Les ressources sont une caractéristique de AWS CloudFormation. En configurant les ressources et leurs propriétés dans un AWS CloudFormation modèle, vous pouvez les déployer AWS CloudFormation pour provisionner vos ressources. Avec le AWS Cloud Development Kit (AWS CDK), vous pouvez configurer les ressources via des constructions. Vous déployez ensuite votre application CDK, ce qui implique de synthétiser un AWS CloudFormation modèle et de le déployer pour AWS CloudFormation provisionner vos ressources.
Comme décrit dans AWS CDK Constructs, le AWS CDK fournit une riche bibliothèque de classes de constructions, appelées constructions, qui représentent toutes les ressources. AWS
Pour créer une instance d'une ressource à l'aide de sa construction correspondante, transmettez la portée comme premier argument, l'ID logique de la construction et un ensemble de propriétés de configuration (props). Par exemple, voici comment créer une file d'attente Amazon SQS avec chiffrement AWS KMS à l'aide de la sqs.Queue construction de la bibliothèque AWS Construct.
Exemple
- TypeScript
-
import * as sqs from '@aws-cdk/aws-sqs';
new sqs.Queue(this, 'MyQueue', {
encryption: sqs.QueueEncryption.KMS_MANAGED
});
- JavaScript
-
const sqs = require('@aws-cdk/aws-sqs');
new sqs.Queue(this, 'MyQueue', {
encryption: sqs.QueueEncryption.KMS_MANAGED
});
- Python
-
import aws_cdk.aws_sqs as sqs
sqs.Queue(self, "MyQueue", encryption=sqs.QueueEncryption.KMS_MANAGED)
- Java
-
import software.amazon.awscdk.services.sqs.*;
Queue.Builder.create(this, "MyQueue").encryption(
QueueEncryption.KMS_MANAGED).build();
- C#
-
using Amazon.CDK.AWS.SQS;
new Queue(this, "MyQueue", new QueueProps
{
Encryption = QueueEncryption.KMS_MANAGED
});
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
sqs "github.com/aws/aws-cdk-go/awscdk/v2/awssqs"
)
sqs.NewQueue(stack, jsii.String("MyQueue"), &sqs.QueueProps{
Encryption: sqs.QueueEncryption_KMS_MANAGED,
})
Certains accessoires de configuration sont facultatifs et, dans de nombreux cas, ont des valeurs par défaut. Dans certains cas, tous les accessoires sont facultatifs et le dernier argument peut être complètement omis.
Attributs de ressource
La plupart des ressources de la bibliothèque AWS Construct exposent des attributs, qui sont résolus au moment du déploiement par AWS CloudFormation. Les attributs sont exposés sous forme de propriétés sur les classes de ressources avec le nom du type comme préfixe. L'exemple suivant montre comment obtenir l'URL d'une file d'attente Amazon SQS à l'aide de la propriété queueUrl (Python :queue_url).
Exemple
- TypeScript
-
import * as sqs from '@aws-cdk/aws-sqs';
const queue = new sqs.Queue(this, 'MyQueue');
const url = queue.queueUrl; // => A string representing a deploy-time value
- JavaScript
-
const sqs = require('@aws-cdk/aws-sqs');
const queue = new sqs.Queue(this, 'MyQueue');
const url = queue.queueUrl; // => A string representing a deploy-time value
- Python
-
import aws_cdk.aws_sqs as sqs
queue = sqs.Queue(self, "MyQueue")
url = queue.queue_url # => A string representing a deploy-time value
- Java
-
Queue queue = new Queue(this, "MyQueue");
String url = queue.getQueueUrl(); // => A string representing a deploy-time value
- C#
-
var queue = new Queue(this, "MyQueue");
var url = queue.QueueUrl; // => A string representing a deploy-time value
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
sqs "github.com/aws/aws-cdk-go/awscdk/v2/awssqs"
)
queue := sqs.NewQueue(stack, jsii.String("MyQueue"), &sqs.QueueProps{})
url := queue.QueueUrl() // => A string representing a deploy-time value
Reportez-vous à la section Tokens et AWS CDK pour plus d'informations sur la façon dont le AWS CDK code les attributs de déploiement sous forme de chaînes.
Référencement des ressources
Lorsque vous configurez des ressources, vous devrez souvent référencer les propriétés d'une autre ressource. Voici quelques exemples :
-
Une ressource Amazon Elastic Container Service (Amazon ECS) nécessite une référence au cluster sur lequel elle s'exécute.
-
Une CloudFront distribution Amazon nécessite une référence au compartiment Amazon Simple Storage Service (Amazon S3) contenant le code source.
Vous pouvez référencer des ressources de l'une des manières suivantes :
-
En transmettant une ressource définie dans votre application CDK, soit dans la même pile, soit dans une autre
-
En transmettant un objet proxy référençant une ressource définie dans votre AWS compte, créé à partir d'un identifiant unique de la ressource (tel qu'un ARN)
Si la propriété d'une construction représente une construction pour une autre ressource, son type est celui du type d'interface de la construction. Par exemple, la construction Amazon ECS utilise une propriété cluster de typeecs.ICluster. Un autre exemple est la construction CloudFront de distribution qui prend une propriété sourceBucket (Python :source_bucket) de types3.IBucket.
Vous pouvez transmettre directement n'importe quel objet de ressource du type approprié défini dans la même application AWS CDK. L'exemple suivant définit un cluster Amazon ECS, puis l'utilise pour définir un service Amazon ECS.
Exemple
- TypeScript
-
const cluster = new ecs.Cluster(this, 'Cluster', { /*...*/ });
const service = new ecs.Ec2Service(this, 'Service', { cluster: cluster });
- JavaScript
-
const cluster = new ecs.Cluster(this, 'Cluster', { /*...*/ });
const service = new ecs.Ec2Service(this, 'Service', { cluster: cluster });
- Python
-
cluster = ecs.Cluster(self, "Cluster")
service = ecs.Ec2Service(self, "Service", cluster=cluster)
- Java
-
Cluster cluster = new Cluster(this, "Cluster");
Ec2Service service = new Ec2Service(this, "Service",
new Ec2ServiceProps.Builder().cluster(cluster).build());
- C#
-
var cluster = new Cluster(this, "Cluster");
var service = new Ec2Service(this, "Service", new Ec2ServiceProps { Cluster = cluster });
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
ecs "github.com/aws/aws-cdk-go/awscdk/v2/awsecs"
)
cluster := ecs.NewCluster(stack, jsii.String("MyCluster"), &ecs.ClusterProps{})
service := ecs.NewEc2Service(stack, jsii.String("MyService"), &ecs.Ec2ServiceProps{
Cluster: cluster,
})
Référencement de ressources dans une pile différente
Vous pouvez faire référence à des ressources d'une autre pile, à condition qu'elles soient définies dans la même application. Les piles peuvent se trouver dans des AWS environnements identiques ou différents (comptes et régions). Le schéma suivant est généralement utilisé :
-
Stockez une référence à la construction en tant qu'attribut de la pile qui produit la ressource. (Pour obtenir une référence à la pile de la construction actuelle, utilisezStack.of(this).)
-
Transmettez cette référence au constructeur de la pile qui consomme la ressource en tant que paramètre ou propriété. La pile consommatrice la transmet ensuite en tant que propriété à toute construction qui en a besoin.
L'exemple suivant définit une pilestack1. Cette pile définit un compartiment Amazon S3 et stocke une référence à la construction du compartiment en tant qu'attribut de la pile. Ensuite, l'application définit une deuxième pilestack2, qui accepte un compartiment lors de l'instanciation. stack2peut, par exemple, définir une table AWS Glue qui utilise le compartiment pour le stockage des données.
Exemple
- TypeScript
-
const prod = { account: '123456789012', region: 'us-east-1' };
const stack1 = new StackThatProvidesABucket(app, 'Stack1', { env: prod });
// stack2 will take a property { bucket: IBucket }
const stack2 = new StackThatExpectsABucket(app, 'Stack2', {
bucket: stack1.bucket,
env: prod
});
- JavaScript
-
const prod = { account: '123456789012', region: 'us-east-1' };
const stack1 = new StackThatProvidesABucket(app, 'Stack1', { env: prod });
// stack2 will take a property { bucket: IBucket }
const stack2 = new StackThatExpectsABucket(app, 'Stack2', {
bucket: stack1.bucket,
env: prod
});
- Python
-
prod = core.Environment(account="123456789012", region="us-east-1")
stack1 = StackThatProvidesABucket(app, "Stack1", env=prod)
# stack2 will take a property "bucket"
stack2 = StackThatExpectsABucket(app, "Stack2", bucket=stack1.bucket, env=prod)
- Java
-
// Helper method to build an environment
static Environment makeEnv(String account, String region) {
return Environment.builder().account(account).region(region)
.build();
}
App app = new App();
Environment prod = makeEnv("123456789012", "us-east-1");
StackThatProvidesABucket stack1 = new StackThatProvidesABucket(app, "Stack1",
StackProps.builder().env(prod).build());
// stack2 will take an argument "bucket"
StackThatExpectsABucket stack2 = new StackThatExpectsABucket(app, "Stack,",
StackProps.builder().env(prod).build(), stack1.bucket);
- C#
-
Amazon.CDK.Environment makeEnv(string account, string region)
{
return new Amazon.CDK.Environment { Account = account, Region = region };
}
var prod = makeEnv(account: "123456789012", region: "us-east-1");
var stack1 = new StackThatProvidesABucket(app, "Stack1", new StackProps { Env = prod });
// stack2 will take a property "bucket"
var stack2 = new StackThatExpectsABucket(app, "Stack2", new StackProps { Env = prod,
bucket = stack1.Bucket});
Si le AWS CDK détermine que la ressource se trouve dans le même environnement, mais dans une pile différente, il synthétise automatiquement les AWS CloudFormation exportations dans la pile productrice et Fn::ImportValue dans la pile consommatrice pour transférer ces informations d'une pile à l'autre. Il s'agit d'une référence solide : le comportement par défaut. Vous pouvez contrôler la force des références croisées pour éviter les blocages de dépendances.
Intensité de référence
Chaque référence croisée a une résistance qui détermine le CloudFormation mécanisme utilisé et le couplage entre les piles :
- Fort (par défaut)
-
La pile de production crée une CloudFormation exportation et la pile consommatrice utiliseFn::ImportValue. Cela signifie que la chaîne de production ne peut pas être mise à jour pour supprimer l'exportation tant qu'un consommateur l'importe encore. CloudFormation applique cette contrainte.
- Faible
-
La pile consommatrice sert Fn::GetStackOutput à lire les sorties directement depuis la pile productrice. Aucun couplage d'exportation n'est créé ; chaque pile peut être mise à jour ou supprimée indépendamment.
- Les deux
-
État de transition permettant de passer du statut de pays fort à celui de pays faible. La chaîne de production conserve ses exportations (afin de ne pas ruiner les consommateurs puissants existants), tandis que la chaîne de consommation passe àFn::GetStackOutput.
L'impasse de la dépendance (étreinte mortelle)
Des références fortes peuvent créer un blocage qui empêche les mises à jour de la pile. Cela se produit car il est CloudFormation impossible de supprimer une exportation alors qu'une autre pile l'importe encore, et la pile consommatrice ne peut pas être mise à jour pour arrêter l'importation tant que l'exportation n'existe pas déjà. Il se peut que vous voyiez une erreur telle que :
Export Stack1:ExportsOutputFnGetAtt-****** cannot be deleted as it is in use by Stack2
Cela se produit généralement lorsque vous essayez de supprimer une ressource partagée ou de restructurer vos piles. Les références faibles permettent d'éviter totalement ce problème, car elles ne créent pas d'exportations.
Contrôle de l'intensité de référence
Vous pouvez contrôler l'intensité des références à trois niveaux : à l'échelle de l'application, par ressource ou par utilisation.
App-wide par défaut
Définissez la clé contextuelle suivante cdk.json pour modifier la valeur par défaut pour toutes les références cross-stack de l'application :
{
"context": {
"@aws-cdk/core:defaultCrossStackReferences": "weak"
}
}
Per-resource
Remplacez la force de toutes les références pointant vers une ressource spécifique en utilisant CrossStackReferences.of(resource).produce(strength) :
Exemple
- TypeScript
-
declare const bucket: s3.Bucket;
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK);
- JavaScript
-
const { CrossStackReferences, ReferenceStrength } = require('aws-cdk-lib');
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK);
- Python
-
from aws_cdk import CrossStackReferences, ReferenceStrength
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK)
- Java
-
import software.amazon.awscdk.CrossStackReferences;
import software.amazon.awscdk.ReferenceStrength;
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK);
- C#
-
using Amazon.CDK;
CrossStackReferences.Of(bucket).Produce(ReferenceStrength.WEAK);
- Go
-
import "github.com/aws/aws-cdk-go/awscdk/v2"
awscdk.CrossStackReferences_Of(bucket).Produce(awscdk.ReferenceStrength_WEAK)
Toutes les références bucket provenant d'autres piles seront désormais utilisées Fn::GetStackOutput indépendamment de la valeur par défaut à l'échelle de l'application.
Per-usage
Remplacez la puissance d'une référence unique au point de consommation en utilisant Stack.consumeReference() :
Exemple
- TypeScript
-
declare const topic: sns.Topic;
const consumer = new Stack(app, 'Consumer', {
env: { account: '123456789012', region: 'us-east-1' },
});
new sns.Subscription(consumer, 'Subscription', {
topic: sns.Topic.fromTopicArn(consumer, 'Topic',
Stack.consumeReference(topic.topicArn, ReferenceStrength.WEAK)),
endpoint: 'https://example.com/webhook',
protocol: sns.SubscriptionProtocol.HTTPS,
});
- JavaScript
-
const { Stack, ReferenceStrength } = require('aws-cdk-lib');
const sns = require('aws-cdk-lib/aws-sns');
const subscriptions = require('aws-cdk-lib/aws-sns-subscriptions');
const consumer = new Stack(app, 'Consumer', {
env: { account: '123456789012', region: 'us-east-1' },
});
new sns.Subscription(consumer, 'Subscription', {
topic: sns.Topic.fromTopicArn(consumer, 'Topic',
Stack.consumeReference(topic.topicArn, ReferenceStrength.WEAK)),
endpoint: 'https://example.com/webhook',
protocol: sns.SubscriptionProtocol.HTTPS,
});
- Python
-
from aws_cdk import Stack, ReferenceStrength
import aws_cdk.aws_sns as sns
consumer = Stack(app, "Consumer",
env=core.Environment(account="123456789012", region="us-east-1")
)
sns.Subscription(consumer, "Subscription",
topic=sns.Topic.from_topic_arn(consumer, "Topic",
Stack.consume_reference(topic.topic_arn, ReferenceStrength.WEAK)),
endpoint="https://example.com/webhook",
protocol=sns.SubscriptionProtocol.HTTPS
)
- Java
-
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.ReferenceStrength;
import software.amazon.awscdk.services.sns.*;
Stack consumer = new Stack(app, "Consumer", StackProps.builder()
.env(Environment.builder().account("123456789012").region("us-east-1").build())
.build());
Subscription.Builder.create(consumer, "Subscription")
.topic(Topic.fromTopicArn(consumer, "Topic",
Stack.consumeReference(topic.getTopicArn(), ReferenceStrength.WEAK)))
.endpoint("https://example.com/webhook")
.protocol(SubscriptionProtocol.HTTPS)
.build();
- C#
-
using Amazon.CDK;
using Amazon.CDK.AWS.SNS;
var consumer = new Stack(app, "Consumer", new StackProps
{
Env = new Amazon.CDK.Environment { Account = "123456789012", Region = "us-east-1" }
});
new Subscription(consumer, "Subscription", new SubscriptionProps
{
Topic = Topic.FromTopicArn(consumer, "Topic",
Stack.ConsumeReference(topic.TopicArn, ReferenceStrength.WEAK)),
Endpoint = "https://example.com/webhook",
Protocol = SubscriptionProtocol.HTTPS
});
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/aws-cdk-go/awscdk/v2/awssns"
"github.com/aws/jsii-runtime-go"
)
consumer := awscdk.NewStack(app, jsii.String("Consumer"), &awscdk.StackProps{
Env: &awscdk.Environment{Account: jsii.String("123456789012"), Region: jsii.String("us-east-1")},
})
awssns.NewSubscription(consumer, jsii.String("Subscription"), &awssns.SubscriptionProps{
Topic: awssns.Topic_FromTopicArn(consumer, jsii.String("Topic"),
awscdk.Stack_ConsumeReference(topic.TopicArn(), awscdk.ReferenceStrength_WEAK)),
Endpoint: jsii.String("https://example.com/webhook"),
Protocol: awssns.SubscriptionProtocol_HTTPS,
})
À utiliser Stack.consumeListReference() pour les références à des listes de chaînes.
DéroGATION étendue
Vous pouvez également définir l'intensité de référence pour un sous-arbre de constructions à l'aide de. CrossStackReferences.of(scope).consume(strength) Toutes les références cross-stack consommées dans cette étendue utiliseront l'intensité spécifiée.
Migration de références fortes vers des références faibles
Si vous avez déjà déployé des piles avec des références fortes, vous ne pouvez pas passer directement à la version faible. Cela CloudFormation échouerait car l'exportation est toujours en cours d'utilisation. Utilisez plutôt une migration en deux phases via l'état de BOTH transition.
L'API à utiliser dépend de votre objectif :
-
Supprimer une seule référence (tout en conservant les piles et la ressource en place) : utilisez Stack.consumeReference() pour affaiblir uniquement cette utilisation spécifique.
-
Supprimer ou restructurer la ressource productrice : utilisez cette option CrossStackReferences.of(producer).produce() pour affaiblir toutes les références pointant vers cette ressource à la fois.
Les deux approches suivent le même schéma en deux phases décrit ci-dessous. Les exemples montrent l'approche par ressource. Pour une utilisation par utilisation, insérez la référence Stack.consumeReference(ref, ReferenceStrength.BOTH) dans la phase 1 et Stack.consumeReference(ref, ReferenceStrength.WEAK) dans la phase 2.
Phase 1 : Déploiement avec les DEUX
Réglez l'intensité de référence surBOTH. Cela permet à la pile consommatrice de commencer à utiliserFn::GetStackOutput, mais conserve l'exportation dans la pile de production afin que la transition soit sûre :
Exemple
- TypeScript
-
declare const bucket: s3.Bucket;
CrossStackReferences.of(bucket).produce(ReferenceStrength.BOTH);
- JavaScript
-
const { CrossStackReferences, ReferenceStrength } = require('aws-cdk-lib');
CrossStackReferences.of(bucket).produce(ReferenceStrength.BOTH);
- Python
-
from aws_cdk import CrossStackReferences, ReferenceStrength
CrossStackReferences.of(bucket).produce(ReferenceStrength.BOTH)
- Java
-
import software.amazon.awscdk.CrossStackReferences;
import software.amazon.awscdk.ReferenceStrength;
CrossStackReferences.of(bucket).produce(ReferenceStrength.BOTH);
- C#
-
using Amazon.CDK;
CrossStackReferences.Of(bucket).Produce(ReferenceStrength.BOTH);
- Go
-
import "github.com/aws/aws-cdk-go/awscdk/v2"
awscdk.CrossStackReferences_Of(bucket).Produce(awscdk.ReferenceStrength_BOTH)
Déployez les deux piles.
Phase 2 : Déploiement avec WEAK
Maintenant qu'aucun consommateur ne l'utiliseFn::ImportValue, l'exportation peut être supprimée en toute sécurité. Passez à WEAK :
Exemple
- TypeScript
-
declare const bucket: s3.Bucket;
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK);
- JavaScript
-
const { CrossStackReferences, ReferenceStrength } = require('aws-cdk-lib');
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK);
- Python
-
from aws_cdk import CrossStackReferences, ReferenceStrength
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK)
- Java
-
import software.amazon.awscdk.CrossStackReferences;
import software.amazon.awscdk.ReferenceStrength;
CrossStackReferences.of(bucket).produce(ReferenceStrength.WEAK);
- C#
-
using Amazon.CDK;
CrossStackReferences.Of(bucket).Produce(ReferenceStrength.WEAK);
- Go
-
import "github.com/aws/aws-cdk-go/awscdk/v2"
awscdk.CrossStackReferences_Of(bucket).Produce(awscdk.ReferenceStrength_WEAK)
Déployez les deux piles. L'exportation est supprimée et la référence est désormais totalement faible.
Après cette migration, vous pouvez librement supprimer, déplacer ou restructurer la ressource sans vous ruiner.
Solution de contournement manuelle (ancienne)
Si vous n'utilisez pas encore les commandes d'intensité de référence, vous pouvez contourner le blocage manuellement. Supprimez l'utilisation de la ressource partagée de la pile consommatrice. Ajoutez ensuite manuellement la même exportation à la pile de production en utilisant exactement le même identifiant logique que l'exportation générée automatiquement. Déployez les deux piles pour supprimer leFn::ImportValue. Supprimez ensuite l'exportation manuelle (et la ressource partagée si elle n'est plus nécessaire) et déployez à nouveau les deux piles. La exportValue() méthode de la pile est un moyen pratique de créer l'exportation manuelle à cette fin.
Référencement de ressources dans votre AWS compte
Supposons que vous souhaitiez utiliser une ressource déjà disponible dans votre AWS compte dans votre application AWS CDK. Il peut s'agir d'une ressource définie via la console, un AWS SDK, directement avec AWS CloudFormation ou dans une autre application AWS CDK. Vous pouvez transformer l'ARN de la ressource (ou un autre attribut d'identification ou un groupe d'attributs) en objet proxy. L'objet proxy sert de référence à la ressource en appelant une méthode de fabrique statique sur la classe de la ressource.
Lorsque vous créez un tel proxy, la ressource externe ne fait pas partie de votre application AWS CDK. Par conséquent, les modifications que vous apportez au proxy dans votre application AWS CDK n'affectent pas la ressource déployée. Le proxy peut toutefois être transmis à n'importe quelle méthode AWS CDK nécessitant une ressource de ce type.
L'exemple suivant montre comment référencer un bucket basé sur un bucket existant avec l'ARNarn:aws:s3:::amzn-s3-demo-bucket1, et un Amazon Virtual Private Cloud basé sur un VPC existant ayant un ID spécifique.
Exemple
- TypeScript
-
// Construct a proxy for a bucket by its name (must be same account)
s3.Bucket.fromBucketName(this, 'MyBucket', 'amzn-s3-demo-bucket1');
// Construct a proxy for a bucket by its full ARN (can be another account)
s3.Bucket.fromBucketArn(this, 'MyBucket', 'arn:aws:s3:::amzn-s3-demo-bucket1');
// Construct a proxy for an existing VPC from its attribute(s)
ec2.Vpc.fromVpcAttributes(this, 'MyVpc', {
vpcId: 'vpc-1234567890abcde',
});
- JavaScript
-
// Construct a proxy for a bucket by its name (must be same account)
s3.Bucket.fromBucketName(this, 'MyBucket', 'amzn-s3-demo-bucket1');
// Construct a proxy for a bucket by its full ARN (can be another account)
s3.Bucket.fromBucketArn(this, 'MyBucket', 'arn:aws:s3:::amzn-s3-demo-bucket1');
// Construct a proxy for an existing VPC from its attribute(s)
ec2.Vpc.fromVpcAttributes(this, 'MyVpc', {
vpcId: 'vpc-1234567890abcde'
});
- Python
-
# Construct a proxy for a bucket by its name (must be same account)
s3.Bucket.from_bucket_name(self, "MyBucket", "amzn-s3-demo-bucket1")
# Construct a proxy for a bucket by its full ARN (can be another account)
s3.Bucket.from_bucket_arn(self, "MyBucket", "arn:aws:s3:::amzn-s3-demo-bucket1")
# Construct a proxy for an existing VPC from its attribute(s)
ec2.Vpc.from_vpc_attributes(self, "MyVpc", vpc_id="vpc-1234567890abcdef")
- Java
-
// Construct a proxy for a bucket by its name (must be same account)
Bucket.fromBucketName(this, "MyBucket", "amzn-s3-demo-bucket1");
// Construct a proxy for a bucket by its full ARN (can be another account)
Bucket.fromBucketArn(this, "MyBucket",
"arn:aws:s3:::amzn-s3-demo-bucket1");
// Construct a proxy for an existing VPC from its attribute(s)
Vpc.fromVpcAttributes(this, "MyVpc", VpcAttributes.builder()
.vpcId("vpc-1234567890abcdef").build());
- C#
-
// Construct a proxy for a bucket by its name (must be same account)
Bucket.FromBucketName(this, "MyBucket", "amzn-s3-demo-bucket1");
// Construct a proxy for a bucket by its full ARN (can be another account)
Bucket.FromBucketArn(this, "MyBucket", "arn:aws:s3:::amzn-s3-demo-bucket1");
// Construct a proxy for an existing VPC from its attribute(s)
Vpc.FromVpcAttributes(this, "MyVpc", new VpcAttributes
{
VpcId = "vpc-1234567890abcdef"
});
- Go
-
// Define a proxy for a bucket by its name (must be same account)
s3.Bucket_FromBucketName(stack, jsii.String("MyBucket"), jsii.String("amzn-s3-demo-bucket1"))
// Define a proxy for a bucket by its full ARN (can be another account)
s3.Bucket_FromBucketArn(stack, jsii.String("MyBucket"), jsii.String("arn:aws:s3:::amzn-s3-demo-bucket1"))
// Define a proxy for an existing VPC from its attributes
ec2.Vpc_FromVpcAttributes(stack, jsii.String("MyVpc"), &ec2.VpcAttributes{
VpcId: jsii.String("vpc-1234567890abcde"),
})
Regardons la Vpc.fromLookup() méthode de plus près. La ec2.Vpc structure étant complexe, il existe de nombreuses manières de sélectionner le VPC à utiliser avec votre application CDK. Pour résoudre ce problème, la construction VPC utilise une méthode fromLookup statique (Python :from_lookup) qui vous permet de rechercher le VPC Amazon souhaité en interrogeant votre AWS compte au moment de la synthèse.
Pour l'utiliserVpc.fromLookup(), le système qui synthétise la pile doit avoir accès au compte propriétaire de l'Amazon VPC. En effet, le CDK Toolkit interroge le compte pour trouver le bon Amazon VPC au moment de la synthèse.
De plus, ne Vpc.fromLookup() fonctionne que dans les piles définies avec un compte et une région explicites (voir Environnements pour le AWS CDK). Si le AWS CDK essaie de rechercher un Amazon VPC à partir d'une pile indépendante de l'environnement, le CDK Toolkit ne sait pas quel environnement interroger pour trouver le VPC.
Vous devez fournir des Vpc.fromLookup() attributs suffisants pour identifier de manière unique un VPC dans votre AWS compte. Par exemple, il ne peut y avoir qu'un seul VPC par défaut, il suffit donc de spécifier le VPC comme VPC par défaut.
Exemple
- TypeScript
-
ec2.Vpc.fromLookup(this, 'DefaultVpc', {
isDefault: true
});
- JavaScript
-
ec2.Vpc.fromLookup(this, 'DefaultVpc', {
isDefault: true
});
- Python
-
ec2.Vpc.from_lookup(self, "DefaultVpc", is_default=True)
- Java
-
Vpc.fromLookup(this, "DefaultVpc", VpcLookupOptions.builder()
.isDefault(true).build());
- C#
-
Vpc.FromLookup(this, id = "DefaultVpc", new VpcLookupOptions { IsDefault = true });
- Go
-
ec2.Vpc_FromLookup(this, jsii.String("DefaultVpc"), &ec2.VpcLookupOptions{
IsDefault: jsii.Bool(true),
})
Vous pouvez également utiliser cette tags propriété pour rechercher des VPC par tag. Vous pouvez ajouter des balises à Amazon VPC au moment de sa création à l'aide du CDK AWS CloudFormation ou du AWS CDK. Vous pouvez modifier les balises à tout moment après leur création à l'aide de la console AWS de gestion, de l' AWS interface de ligne de commande ou d'un AWS SDK. Outre les balises que vous ajoutez vous-même, le AWS CDK ajoute automatiquement les balises suivantes à tous les VPC qu'il crée.
-
Nom : nom du VPC.
-
aws-cdk:subnet-name — Nom du sous-réseau.
-
aws-cdk:subnet-type — Type du sous-réseau : public, privé ou isolé.
Exemple
- TypeScript
-
ec2.Vpc.fromLookup(this, 'PublicVpc',
{tags: {'aws-cdk:subnet-type': "Public"}});
- JavaScript
-
ec2.Vpc.fromLookup(this, 'PublicVpc',
{tags: {'aws-cdk:subnet-type': "Public"}});
- Python
-
ec2.Vpc.from_lookup(self, "PublicVpc",
tags={"aws-cdk:subnet-type": "Public"})
- Java
-
Vpc.fromLookup(this, "PublicVpc", VpcLookupOptions.builder()
.tags(java.util.Map.of("aws-cdk:subnet-type", "Public")) // Java 9 or later
.build());
- C#
-
Vpc.FromLookup(this, id: "PublicVpc", new VpcLookupOptions
{
Tags = new Dictionary<string, string> { ["aws-cdk:subnet-type"] = "Public" }
});
- Go
-
ec2.Vpc_FromLookup(this, jsii.String("DefaultVpc"), &ec2.VpcLookupOptions{
Tags: &map[string]*string{"aws-cdk:subnet-type": jsii.String("Public")},
})
Les résultats de Vpc.fromLookup() sont mis en cache dans le cdk.context.json fichier du projet. (Voir Valeurs contextuelles et AWS CDK.) Confiez ce fichier au contrôle de version afin que votre application continue à faire référence au même Amazon VPC. Cela fonctionne même si vous modifiez ultérieurement les attributs de vos VPC de telle sorte qu'un autre VPC soit sélectionné. Cela est particulièrement important si vous déployez la pile dans un environnement qui n'a pas accès au AWS compte qui définit le VPC, tel que CDK Pipelines.
Bien que vous puissiez utiliser une ressource externe partout où vous utiliseriez une ressource similaire définie dans votre application AWS CDK, vous ne pouvez pas la modifier. Par exemple, appeler addToResourcePolicy (Python :add_to_resource_policy) sur un périphérique externe s3.Bucket ne fait rien.
Noms physiques des ressources
Les noms logiques des ressources dans AWS CloudFormation sont différents des noms des ressources qui apparaissent dans la console de AWS gestion après leur déploiement par AWS CloudFormation. Le AWS CDK appelle ces derniers noms des noms physiques.
Par exemple, AWS CloudFormation vous pouvez créer le compartiment Amazon S3 avec l'ID logique Stack2MyBucket4DD88B4F et le nom physiquestack2MyBucket4dd88b4f-iuv1rbv9z3to.
Vous pouvez spécifier un nom physique lors de la création de constructions qui représentent des ressources à l'aide de la propriété<resourceType>Name. L'exemple suivant crée un compartiment Amazon S3 avec le nom physiqueamzn-s3-demo-bucket.
Exemple
- TypeScript
-
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: 'amzn-s3-demo-bucket',
});
- JavaScript
-
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: 'amzn-s3-demo-bucket'
});
- Python
-
bucket = s3.Bucket(self, "MyBucket", bucket_name="amzn-s3-demo-bucket")
- Java
-
Bucket bucket = Bucket.Builder.create(this, "MyBucket")
.bucketName("amzn-s3-demo-bucket").build();
- C#
-
var bucket = new Bucket(this, "MyBucket", new BucketProps { BucketName = "amzn-s3-demo-bucket" });
- Go
-
bucket := s3.NewBucket(this, jsii.String("MyBucket"), &s3.BucketProps{
BucketName: jsii.String("amzn-s3-demo-bucket"),
})
L'attribution de noms physiques aux ressources présente certains inconvénients. AWS CloudFormation Plus important encore, toute modification des ressources déployées nécessitant un remplacement de ressource, telle que la modification des propriétés d'une ressource qui sont immuables après sa création, échouera si un nom physique est attribué à une ressource. Si vous vous retrouvez dans cet état, la seule solution est de supprimer la AWS CloudFormation pile, puis de déployer à nouveau l'application AWS CDK. Consultez la AWS CloudFormation documentation pour plus de détails.
Dans certains cas, par exemple lors de la création d'une application AWS CDK avec des références inter-environnements, des noms physiques sont requis pour que le AWS CDK fonctionne correctement. Dans ces cas, si vous ne voulez pas vous donner la peine de trouver vous-même un nom physique, vous pouvez laisser le AWS CDK le nommer pour vous. Pour ce faire, utilisez la valeur spécialePhysicalName.GENERATE_IF_NEEDED, comme suit.
Exemple
- TypeScript
-
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: core.PhysicalName.GENERATE_IF_NEEDED,
});
- JavaScript
-
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: core.PhysicalName.GENERATE_IF_NEEDED
});
- Python
-
bucket = s3.Bucket(self, "MyBucket",
bucket_name=core.PhysicalName.GENERATE_IF_NEEDED)
- Java
-
Bucket bucket = Bucket.Builder.create(this, "MyBucket")
.bucketName(PhysicalName.GENERATE_IF_NEEDED).build();
- C#
-
var bucket = new Bucket(this, "MyBucket", new BucketProps
{ BucketName = PhysicalName.GENERATE_IF_NEEDED });
- Go
-
bucket := s3.NewBucket(this, jsii.String("MyBucket"), &s3.BucketProps{
BucketName: awscdk.PhysicalName_GENERATE_IF_NEEDED(),
})
Transmettre des identifiants de ressources uniques
Dans la mesure du possible, vous devez transmettre les ressources par référence, comme décrit dans la section précédente. Cependant, dans certains cas, vous n'avez pas d'autre choix que de faire référence à une ressource par l'un de ses attributs. Les exemples de cas d'utilisation sont les suivants :
-
Lorsque vous utilisez des AWS CloudFormation ressources de faible niveau.
-
Lorsque vous devez exposer des ressources aux composants d'exécution d'une application AWS CDK, par exemple lorsque vous faites référence à des fonctions Lambda via des variables d'environnement.
Ces identificateurs sont disponibles sous forme d'attributs sur les ressources, tels que les suivants.
Exemple
- TypeScript
-
bucket.bucketName
lambdaFunc.functionArn
securityGroup.groupArn
- JavaScript
-
bucket.bucketName
lambdaFunc.functionArn
securityGroup.groupArn
- Python
-
bucket.bucket_name
lambda_func.function_arn
security_group_arn
- Java
-
La liaison Java AWS CDK utilise des méthodes getter pour les attributs.
bucket.getBucketName()
lambdaFunc.getFunctionArn()
securityGroup.getGroupArn()
- C#
-
bucket.BucketName
lambdaFunc.FunctionArn
securityGroup.GroupArn
- Go
-
bucket.BucketName()
fn.FunctionArn()
L'exemple suivant montre comment transmettre un nom de compartiment généré à une fonction AWS Lambda.
Exemple
- TypeScript
-
const bucket = new s3.Bucket(this, 'Bucket');
new lambda.Function(this, 'MyLambda', {
// ...
environment: {
BUCKET_NAME: bucket.bucketName,
},
});
- JavaScript
-
const bucket = new s3.Bucket(this, 'Bucket');
new lambda.Function(this, 'MyLambda', {
// ...
environment: {
BUCKET_NAME: bucket.bucketName
}
});
- Python
-
bucket = s3.Bucket(self, "Bucket")
lambda.Function(self, "MyLambda", environment=dict(BUCKET_NAME=bucket.bucket_name))
- Java
-
final Bucket bucket = new Bucket(this, "Bucket");
Function.Builder.create(this, "MyLambda")
.environment(java.util.Map.of( // Java 9 or later
"BUCKET_NAME", bucket.getBucketName()))
.build();
- C#
-
var bucket = new Bucket(this, "Bucket");
new Function(this, "MyLambda", new FunctionProps
{
Environment = new Dictionary<string, string>
{
["BUCKET_NAME"] = bucket.BucketName
}
});
- Go
-
bucket := s3.NewBucket(this, jsii.String("Bucket"), &s3.BucketProps{})
lambda.NewFunction(this, jsii.String("MyLambda"), &lambda.FunctionProps{
Environment: &map[string]*string{"BUCKET_NAME": bucket.BucketName()},
})
Octroi d'autorisations entre les ressources
Higher-level les constructions permettent d'obtenir les autorisations de moindre privilège en proposant des API simples et basées sur l'intention pour exprimer les exigences d'autorisation. Par exemple, de nombreuses structures proposent des méthodes d'autorisation que vous pouvez utiliser pour autoriser une entité (telle qu'un rôle IAM ou un utilisateur) à utiliser la ressource, sans avoir à créer manuellement des déclarations d'autorisation IAM.
Les méthodes d'octroi sont disponibles via les classes Grants (par exemple BucketGrants pour les compartiments Amazon S3). Ces classes fonctionnent à la fois avec les constructions L1 et L2. Les constructions L2 exposent une grants propriété pour plus de commodité, mais vous pouvez également créer une classe Grants directement à partir d'une construction L1. Vous pouvez combiner des classes Grants avec des Mixins pour L2-like faciliter les constructions L1.
L'exemple suivant crée les autorisations permettant au rôle d'exécution d'une fonction Lambda de lire et d'écrire des objets dans un compartiment Amazon S3 particulier. Si le compartiment Amazon S3 est chiffré à l'aide d'une clé AWS KMS, cette méthode autorise également le rôle d'exécution de la fonction Lambda à déchiffrer avec cette clé.
Exemple
- TypeScript
-
if (bucket.grants.readWrite(func).success) {
// ...
}
- JavaScript
-
if ( bucket.grants.readWrite(func).success) {
// ...
}
- Python
-
if bucket.grants.read_write(func).success:
# ...
- Java
-
if (bucket.getGrants().readWrite(func).getSuccess()) {
// ...
}
- C#
-
if (bucket.Grants.ReadWrite(func).Success)
{
// ...
}
- Go
-
if *bucket.Grants().ReadWrite(function, nil).Success() {
// ...
}
Les méthodes d'octroi renvoient un iam.Grant objet. Utilisez l'successattribut de l'Grantobjet pour déterminer si la subvention a été appliquée efficacement (par exemple, elle n'a peut-être pas été appliquée à des ressources externes). Vous pouvez également utiliser la méthode assertSuccess (Python :assert_success) de l'Grantobjet pour vérifier que l'autorisation a été correctement appliquée.
Si aucune méthode d'octroi spécifique n'est disponible pour un cas d'utilisation particulier, vous pouvez utiliser une méthode d'octroi générique pour définir une nouvelle autorisation avec une liste d'actions spécifiée.
L'exemple suivant montre comment autoriser une fonction Lambda à accéder à l'action Amazon DynamoDBCreateBackup.
Exemple
- TypeScript
-
table.grants.actions(func, 'dynamodb:CreateBackup');
- JavaScript
-
table.grants.actions(func, 'dynamodb:CreateBackup');
- Python
-
table.grants.actions(func, "dynamodb:CreateBackup")
- Java
-
table.getGrants().actions(func, "dynamodb:CreateBackup");
- C#
-
table.Grants.Actions(func, "dynamodb:CreateBackup");
- Go
-
table := dynamodb.NewTable(this, jsii.String("MyTable"), &dynamodb.TableProps{})
table.Grants().Actions(function, jsii.String("dynamodb:CreateBackup"))
De nombreuses ressources, telles que les fonctions Lambda, nécessitent qu'un rôle soit assumé lors de l'exécution du code. Une propriété de configuration vous permet de spécifier uniam.IRole. Si aucun rôle n'est spécifié, la fonction crée automatiquement un rôle spécifique à cet usage. Vous pouvez ensuite utiliser des méthodes d'octroi sur les ressources pour ajouter des déclarations au rôle.
Les méthodes d'octroi sont créées à l'aide d'API de niveau inférieur pour la gestion des politiques IAM. Les politiques sont modélisées sous forme d'PolicyDocumentobjets. Ajoutez des instructions directement aux rôles (ou au rôle attaché à une construction) à l'aide de la addToRolePolicy méthode (Python :add_to_role_policy), ou à la politique d'une ressource (telle qu'une Bucket politique) à l'aide de la méthode addToResourcePolicy (Python :add_to_resource_policy).
Indicateurs et alarmes relatifs aux ressources
De nombreuses ressources émettent CloudWatch des métriques qui peuvent être utilisées pour configurer des tableaux de bord de surveillance et des alarmes. Higher-level les constructions ont des méthodes métriques qui vous permettent d'accéder aux métriques sans rechercher le nom correct à utiliser.
L'exemple suivant montre comment définir une alarme lorsque la valeur d'une file ApproximateNumberOfMessagesNotVisible d'attente Amazon SQS dépasse 100.
Exemple
- TypeScript
-
import * as cw from '@aws-cdk/aws-cloudwatch';
import * as sqs from '@aws-cdk/aws-sqs';
import { Duration } from '@aws-cdk/core';
const queue = new sqs.Queue(this, 'MyQueue');
const metric = queue.metricApproximateNumberOfMessagesNotVisible({
label: 'Messages Visible (Approx)',
period: Duration.minutes(5),
// ...
});
metric.createAlarm(this, 'TooManyMessagesAlarm', {
comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
threshold: 100,
// ...
});
- JavaScript
-
const cw = require('@aws-cdk/aws-cloudwatch');
const sqs = require('@aws-cdk/aws-sqs');
const { Duration } = require('@aws-cdk/core');
const queue = new sqs.Queue(this, 'MyQueue');
const metric = queue.metricApproximateNumberOfMessagesNotVisible({
label: 'Messages Visible (Approx)',
period: Duration.minutes(5)
// ...
});
metric.createAlarm(this, 'TooManyMessagesAlarm', {
comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
threshold: 100
// ...
});
- Python
-
import aws_cdk.aws_cloudwatch as cw
import aws_cdk.aws_sqs as sqs
from aws_cdk.core import Duration
queue = sqs.Queue(self, "MyQueue")
metric = queue.metric_approximate_number_of_messages_not_visible(
label="Messages Visible (Approx)",
period=Duration.minutes(5),
# ...
)
metric.create_alarm(self, "TooManyMessagesAlarm",
comparison_operator=cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
threshold=100,
# ...
)
- Java
-
import software.amazon.awscdk.core.Duration;
import software.amazon.awscdk.services.sqs.Queue;
import software.amazon.awscdk.services.cloudwatch.Metric;
import software.amazon.awscdk.services.cloudwatch.MetricOptions;
import software.amazon.awscdk.services.cloudwatch.CreateAlarmOptions;
import software.amazon.awscdk.services.cloudwatch.ComparisonOperator;
Queue queue = new Queue(this, "MyQueue");
Metric metric = queue
.metricApproximateNumberOfMessagesNotVisible(MetricOptions.builder()
.label("Messages Visible (Approx)")
.period(Duration.minutes(5)).build());
metric.createAlarm(this, "TooManyMessagesAlarm", CreateAlarmOptions.builder()
.comparisonOperator(ComparisonOperator.GREATER_THAN_THRESHOLD)
.threshold(100)
// ...
.build());
- C#
-
using cdk = Amazon.CDK;
using cw = Amazon.CDK.AWS.CloudWatch;
using sqs = Amazon.CDK.AWS.SQS;
var queue = new sqs.Queue(this, "MyQueue");
var metric = queue.MetricApproximateNumberOfMessagesNotVisible(new cw.MetricOptions
{
Label = "Messages Visible (Approx)",
Period = cdk.Duration.Minutes(5),
// ...
});
metric.CreateAlarm(this, "TooManyMessagesAlarm", new cw.CreateAlarmOptions
{
ComparisonOperator = cw.ComparisonOperator.GREATER_THAN_THRESHOLD,
Threshold = 100,
// ..
});
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
cw "github.com/aws/aws-cdk-go/awscdk/v2/awscloudwatch"
sqs "github.com/aws/aws-cdk-go/awscdk/v2/awssqs"
)
queue := sqs.NewQueue(this, jsii.String("MyQueue"), &sqs.QueueProps{})
metric := queue.MetricApproximateNumberOfMessagesNotVisible(&cw.MetricOptions{
Label: jsii.String("Messages Visible (Approx)"),
Period: awscdk.Duration_Minutes(jsii.Number(5)),
})
metric.CreateAlarm(this, jsii.String("TooManyMessagesAlarm"), &cw.CreateAlarmOptions{
ComparisonOperator: cw.ComparisonOperator_GREATER_THAN_THRESHOLD,
Threshold: jsii.Number(100),
})
S'il n'existe aucune méthode pour une métrique particulière, vous pouvez utiliser la méthode métrique générale pour spécifier le nom de la métrique manuellement.
Des mesures peuvent également être ajoutées aux CloudWatch tableaux de bord. Consultez CloudWatch.
Trafic réseau
Dans de nombreux cas, vous devez activer des autorisations sur un réseau pour qu'une application fonctionne, par exemple lorsque l'infrastructure informatique doit accéder à la couche de persistance. Les ressources qui établissent ou écoutent des connexions exposent des méthodes qui activent les flux de trafic, notamment la définition de règles de groupe de sécurité ou d'ACL réseau.
Les ressources IConnectable possèdent une connections propriété qui constitue la passerelle vers la configuration des règles de trafic réseau.
Vous permettez aux données de circuler sur un chemin réseau donné à l'aide de allow méthodes. L'exemple suivant active les connexions HTTPS au Web et les connexions entrantes du groupe fleet2 Amazon EC2 Auto Scaling.
Exemple
- TypeScript
-
import * as asg from '@aws-cdk/aws-autoscaling';
import * as ec2 from '@aws-cdk/aws-ec2';
const fleet1: asg.AutoScalingGroup = asg.AutoScalingGroup(/*...*/);
// Allow surfing the (secure) web
fleet1.connections.allowTo(new ec2.Peer.anyIpv4(), new ec2.Port({ fromPort: 443, toPort: 443 }));
const fleet2: asg.AutoScalingGroup = asg.AutoScalingGroup(/*...*/);
fleet1.connections.allowFrom(fleet2, ec2.Port.AllTraffic());
- JavaScript
-
const asg = require('@aws-cdk/aws-autoscaling');
const ec2 = require('@aws-cdk/aws-ec2');
const fleet1 = asg.AutoScalingGroup();
// Allow surfing the (secure) web
fleet1.connections.allowTo(new ec2.Peer.anyIpv4(), new ec2.Port({ fromPort: 443, toPort: 443 }));
const fleet2 = asg.AutoScalingGroup();
fleet1.connections.allowFrom(fleet2, ec2.Port.AllTraffic());
- Python
-
import aws_cdk.aws_autoscaling as asg
import aws_cdk.aws_ec2 as ec2
fleet1 = asg.AutoScalingGroup( ... )
# Allow surfing the (secure) web
fleet1.connections.allow_to(ec2.Peer.any_ipv4(),
ec2.Port(PortProps(from_port=443, to_port=443)))
fleet2 = asg.AutoScalingGroup( ... )
fleet1.connections.allow_from(fleet2, ec2.Port.all_traffic())
- Java
-
import software.amazon.awscdk.services.autoscaling.AutoScalingGroup;
import software.amazon.awscdk.services.ec2.Peer;
import software.amazon.awscdk.services.ec2.Port;
AutoScalingGroup fleet1 = AutoScalingGroup.Builder.create(this, "MyFleet")
/* ... */.build();
// Allow surfing the (secure) Web
fleet1.getConnections().allowTo(Peer.anyIpv4(),
Port.Builder.create().fromPort(443).toPort(443).build());
AutoScalingGroup fleet2 = AutoScalingGroup.Builder.create(this, "MyFleet2")
/* ... */.build();
fleet1.getConnections().allowFrom(fleet2, Port.allTraffic());
- C#
-
using cdk = Amazon.CDK;
using asg = Amazon.CDK.AWS.AutoScaling;
using ec2 = Amazon.CDK.AWS.EC2;
// Allow surfing the (secure) Web
var fleet1 = new asg.AutoScalingGroup(this, "MyFleet", new asg.AutoScalingGroupProps { /* ... */ });
fleet1.Connections.AllowTo(ec2.Peer.AnyIpv4(), new ec2.Port(new ec2.PortProps
{ FromPort = 443, ToPort = 443 }));
var fleet2 = new asg.AutoScalingGroup(this, "MyFleet2", new asg.AutoScalingGroupProps { /* ... */ });
fleet1.Connections.AllowFrom(fleet2, ec2.Port.AllTraffic());
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
autoscaling "github.com/aws/aws-cdk-go/awscdk/v2/awsautoscaling"
ec2 "github.com/aws/aws-cdk-go/awscdk/v2/awsec2"
)
fleet1 := autoscaling.NewAutoScalingGroup(this, jsii.String("MyFleet1"), &autoscaling.AutoScalingGroupProps{})
fleet1.Connections().AllowTo(ec2.Peer_AnyIpv4(),ec2.NewPort(&ec2.PortProps{ FromPort: jsii.Number(443), ToPort: jsii.Number(443) }),jsii.String("secure web"))
fleet2 := autoscaling.NewAutoScalingGroup(this, jsii.String("MyFleet2"), &autoscaling.AutoScalingGroupProps{})
fleet1.Connections().AllowFrom(fleet2, ec2.Port_AllTraffic(),jsii.String("all traffic"))
Des ports par défaut sont associés à certaines ressources. Les exemples incluent l'écouteur d'un équilibreur de charge sur le port public et les ports sur lesquels le moteur de base de données accepte les connexions pour les instances d'une base de données Amazon RDS. Dans de tels cas, vous pouvez appliquer un contrôle strict du réseau sans avoir à spécifier manuellement le port. Pour ce faire, utilisez les allowToDefaultPort méthodes allowDefaultPortFrom and (Python :allow_default_port_from,allow_to_default_port).
L'exemple suivant montre comment activer des connexions depuis n'importe quelle adresse IPV4 et une connexion depuis un groupe Auto Scaling pour accéder à une base de données.
Exemple
- TypeScript
-
listener.connections.allowDefaultPortFromAnyIpv4('Allow public access');
fleet.connections.allowToDefaultPort(rdsDatabase, 'Fleet can access database');
- JavaScript
-
listener.connections.allowDefaultPortFromAnyIpv4('Allow public access');
fleet.connections.allowToDefaultPort(rdsDatabase, 'Fleet can access database');
- Python
-
listener.connections.allow_default_port_from_any_ipv4("Allow public access")
fleet.connections.allow_to_default_port(rds_database, "Fleet can access database")
- Java
-
listener.getConnections().allowDefaultPortFromAnyIpv4("Allow public access");
fleet.getConnections().AllowToDefaultPort(rdsDatabase, "Fleet can access database");
- C#
-
listener.Connections.AllowDefaultPortFromAnyIpv4("Allow public access");
fleet.Connections.AllowToDefaultPort(rdsDatabase, "Fleet can access database");
- Go
-
listener.Connections().AllowDefaultPortFromAnyIpv4(jsii.String("Allow public Access"))
fleet.Connections().AllowToDefaultPort(rdsDatabase, jsii.String("Fleet can access database"))
Gestion des événements
Certaines ressources peuvent servir de sources d'événements. Utilisez la addEventNotification méthode (Python :add_event_notification) pour enregistrer une cible d'événement pour un type d'événement particulier émis par la ressource. En outre, les addXxxNotification méthodes offrent un moyen simple d'enregistrer un gestionnaire pour les types d'événements courants.
L'exemple suivant montre comment déclencher une fonction Lambda lorsqu'un objet est ajouté à un compartiment Amazon S3.
Exemple
- TypeScript
-
import * as s3nots from '@aws-cdk/aws-s3-notifications';
const handler = new lambda.Function(this, 'Handler', { /*…*/ });
const bucket = new s3.Bucket(this, 'Bucket');
bucket.addObjectCreatedNotification(new s3nots.LambdaDestination(handler));
- JavaScript
-
const s3nots = require('@aws-cdk/aws-s3-notifications');
const handler = new lambda.Function(this, 'Handler', { /*…*/ });
const bucket = new s3.Bucket(this, 'Bucket');
bucket.addObjectCreatedNotification(new s3nots.LambdaDestination(handler));
- Python
-
import aws_cdk.aws_s3_notifications as s3_nots
handler = lambda_.Function(self, "Handler", ...)
bucket = s3.Bucket(self, "Bucket")
bucket.add_object_created_notification(s3_nots.LambdaDestination(handler))
- Java
-
import software.amazon.awscdk.services.s3.Bucket;
import software.amazon.awscdk.services.lambda.Function;
import software.amazon.awscdk.services.s3.notifications.LambdaDestination;
Function handler = Function.Builder.create(this, "Handler")/* ... */.build();
Bucket bucket = new Bucket(this, "Bucket");
bucket.addObjectCreatedNotification(new LambdaDestination(handler));
- C#
-
using lambda = Amazon.CDK.AWS.Lambda;
using s3 = Amazon.CDK.AWS.S3;
using s3Nots = Amazon.CDK.AWS.S3.Notifications;
var handler = new lambda.Function(this, "Handler", new lambda.FunctionProps { .. });
var bucket = new s3.Bucket(this, "Bucket");
bucket.AddObjectCreatedNotification(new s3Nots.LambdaDestination(handler));
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
s3 "github.com/aws/aws-cdk-go/awscdk/v2/awss3"
s3nots "github.com/aws/aws-cdk-go/awscdk/v2/awss3notifications"
)
handler := lambda.NewFunction(this, jsii.String("MyFunction"), &lambda.FunctionProps{})
bucket := s3.NewBucket(this, jsii.String("Bucket"), &s3.BucketProps{})
bucket.AddObjectCreatedNotification(s3nots.NewLambdaDestination(handler), nil)
Politiques de suppression
Les ressources qui gèrent des données persistantes, telles que les bases de données, les compartiments Amazon S3 et les registres Amazon ECR, sont soumises à une politique de suppression. La politique de suppression indique s'il faut supprimer les objets persistants lorsque la pile AWS CDK qui les contient est détruite. Les valeurs spécifiant la politique de suppression sont disponibles via l'RemovalPolicyénumération du module AWS CDK. core
Les ressources autres que celles qui stockent les données de manière persistante peuvent également être utilisées à des fins différentes. removalPolicy Par exemple, une version de fonction Lambda utilise un removalPolicy attribut pour déterminer si une version donnée est conservée lorsqu'une nouvelle version est déployée. Elles ont des significations et des valeurs par défaut différentes de celles de la politique de suppression d'un compartiment Amazon S3 ou d'une table DynamoDB.
| Value |
Signification |
|
RemovalPolicy.RETAIN
|
Conservez le contenu de la ressource lors de la destruction de la pile (par défaut). La ressource est orpheline de la pile et doit être supprimée manuellement. Si vous tentez de redéployer la pile alors que la ressource existe toujours, vous recevrez un message d'erreur en raison d'un conflit de noms.
|
|
RemovalPolicy.DESTROY
|
La ressource sera détruite en même temps que la pile.
|
AWS CloudFormation ne supprime pas les compartiments Amazon S3 qui contiennent des fichiers, même si leur politique de suppression est définie sur. DESTROY Tenter de le faire est une AWS CloudFormation erreur. Pour que le AWS CDK supprime tous les fichiers du bucket avant de le détruire, définissez la autoDeleteObjects propriété du bucket surtrue.
Voici un exemple de création d'un compartiment Amazon S3 avec RemovalPolicy of DESTROY et autoDeleteOjbects défini surtrue.
Exemple
- TypeScript
-
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
export class CdkTestStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const bucket = new s3.Bucket(this, 'Bucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
autoDeleteObjects: true
});
}
}
- JavaScript
-
const cdk = require('@aws-cdk/core');
const s3 = require('@aws-cdk/aws-s3');
class CdkTestStack extends cdk.Stack {
constructor(scope, id, props) {
super(scope, id, props);
const bucket = new s3.Bucket(this, 'Bucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
autoDeleteObjects: true
});
}
}
module.exports = { CdkTestStack }
- Python
-
import aws_cdk.core as cdk
import aws_cdk.aws_s3 as s3
class CdkTestStack(cdk.stack):
def __init__(self, scope: cdk.Construct, id: str, **kwargs):
super().__init__(scope, id, **kwargs)
bucket = s3.Bucket(self, "Bucket",
removal_policy=cdk.RemovalPolicy.DESTROY,
auto_delete_objects=True)
- Java
-
software.amazon.awscdk.core.*;
import software.amazon.awscdk.services.s3.*;
public class CdkTestStack extends Stack {
public CdkTestStack(final Construct scope, final String id) {
this(scope, id, null);
}
public CdkTestStack(final Construct scope, final String id, final StackProps props) {
super(scope, id, props);
Bucket.Builder.create(this, "Bucket")
.removalPolicy(RemovalPolicy.DESTROY)
.autoDeleteObjects(true).build();
}
}
- C#
-
using Amazon.CDK;
using Amazon.CDK.AWS.S3;
public CdkTestStack(Construct scope, string id, IStackProps props) : base(scope, id, props)
{
new Bucket(this, "Bucket", new BucketProps {
RemovalPolicy = RemovalPolicy.DESTROY,
AutoDeleteObjects = true
});
}
- Go
-
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/jsii-runtime-go"
s3 "github.com/aws/aws-cdk-go/awscdk/v2/awss3"
)
s3.NewBucket(this, jsii.String("Bucket"), &s3.BucketProps{
RemovalPolicy: awscdk.RemovalPolicy_DESTROY,
AutoDeleteObjects: jsii.Bool(true),
})
Vous pouvez également appliquer une politique de suppression directement à la AWS CloudFormation ressource sous-jacente via applyRemovalPolicy() cette méthode. Cette méthode est disponible pour certaines ressources avec état qui n'ont pas de removalPolicy propriété dans les accessoires de leur ressource L2. Voici quelques exemples :
-
AWS CloudFormation piles
-
Groupes d’utilisateurs Amazon Cognito
-
Instances de base de données Amazon DocumentDB
-
Volumes Amazon EC2
-
Domaines Amazon OpenSearch Service
-
Systèmes de fichiers Amazon FSx
-
Files d'attente Amazon SQS
Exemple
- TypeScript
-
const resource = bucket.node.findChild('Resource') as cdk.CfnResource;
resource.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
- JavaScript
-
const resource = bucket.node.findChild('Resource');
resource.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
- Python
-
resource = bucket.node.find_child('Resource')
resource.apply_removal_policy(cdk.RemovalPolicy.DESTROY);
- Java
-
CfnResource resource = (CfnResource)bucket.node.findChild("Resource");
resource.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
- C#
-
var resource = (CfnResource)bucket.node.findChild('Resource');
resource.ApplyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
Le AWS CDK's RemovalPolicy se traduit par « s » AWS CloudFormation. DeletionPolicy Cependant, la valeur par défaut dans AWS CDK est de conserver les données, ce qui est le contraire de la AWS CloudFormation valeur par défaut.