Eine bestehende AWS CloudFormation Vorlage importieren - AWS Cloud Development Kit (AWS CDK) v2

Dies ist der AWS CDK v2-Entwicklerhandbuch. Die ältere CDK Version 1 wurde am 1. Juni 2022 in die Wartung aufgenommen und der Support wurde am 1. Juni 2023 eingestellt.

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Eine bestehende AWS CloudFormation Vorlage importieren

Importieren Sie Ressourcen aus einer AWS CloudFormation Vorlage in Ihre AWS Cloud Development Kit (AWS CDK) Anwendungen, indem Sie das cloudformation-include.CfnIncludeKonstrukt verwenden, um Ressourcen in L1-Konstrukte zu konvertieren.

Nach dem Import können Sie mit diesen Ressourcen in Ihrer App genauso arbeiten, als ob sie ursprünglich im AWS CDK Code definiert wären. Sie können diese L1-Konstrukte auch in Konstrukten auf höherer AWS CDK Ebene verwenden. Auf diese Weise können Sie beispielsweise die L2-Methoden zur Erteilung von Berechtigungen mit den von ihnen definierten Ressourcen verwenden.

Das cloudformation-include.CfnInclude Konstrukt fügt im Wesentlichen jeder Ressource in Ihrer AWS CloudFormation Vorlage einen AWS CDK API Wrapper hinzu. Verwenden Sie diese Funktion, um Ihre vorhandenen AWS CloudFormation Vorlagen Stück für Stück in die AWS CDK Datei zu importieren. Auf diese Weise können Sie Ihre vorhandenen Ressourcen mithilfe von AWS CDK Konstrukten verwalten, um die Vorteile von Abstraktionen auf höherer Ebene zu nutzen. Sie können diese Funktion auch verwenden, um Ihre AWS CloudFormation Vorlagen an AWS CDK Entwickler zu verkaufen, indem Sie ein Konstrukt bereitstellen. AWS CDK API

Anmerkung

AWS CDK Version 1 ist ebenfalls enthalten aws-cdk-lib.CfnInclude, das zuvor für denselben allgemeinen Zweck verwendet wurde. Es fehlt jedoch ein Großteil der Funktionalität voncloudformation-include.CfnInclude.

Importieren Sie eine AWS CloudFormation Vorlage

Im Folgenden finden Sie eine AWS CloudFormation Beispielvorlage, anhand derer wir Beispiele für dieses Thema bereitstellen werden. Kopieren und speichern Sie die Vorlagemy-template.json, um den Anweisungen zu folgen. Nachdem Sie diese Beispiele durchgearbeitet haben, können Sie weitere Informationen verwenden, indem Sie eine Ihrer vorhandenen bereitgestellten AWS CloudFormation Vorlagen verwenden. Sie können sie über die AWS CloudFormation Konsole abrufen.

{ "Resources": { "MyBucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "MyBucket", } } } }

Sie können entweder mit YAML Vorlagen JSON oder mit Vorlagen arbeiten. Wir empfehlenJSON, falls verfügbar, da YAML Parser leicht davon abweichen können, was sie akzeptieren.

Im Folgenden finden Sie ein Beispiel dafür, wie Sie die Beispielvorlage mithilfe cloudformation-include von in Ihre AWS CDK App importieren können. Vorlagen werden im Kontext eines CDK Stacks importiert.

TypeScript
import * as cdk from 'aws-cdk-lib'; import * as cfninc from 'aws-cdk-lib/cloudformation-include'; import { Construct } from 'constructs'; export class MyStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const template = new cfninc.CfnInclude(this, 'Template', { templateFile: 'my-template.json', }); } }
JavaScript
const cdk = require('aws-cdk-lib'); const cfninc = require('aws-cdk-lib/cloudformation-include'); class MyStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); const template = new cfninc.CfnInclude(this, 'Template', { templateFile: 'my-template.json', }); } } module.exports = { MyStack }
Python
import aws_cdk as cdk from aws_cdk import cloudformation_include as cfn_inc from constructs import Construct class MyStack(cdk.Stack): def __init__(self, scope: Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) template = cfn_inc.CfnInclude(self, "Template", template_file="my-template.json")
Java
import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.cloudformation.include.CfnInclude; import software.constructs.Construct; public class MyStack extends Stack { public MyStack(final Construct scope, final String id) { this(scope, id, null); } public MyStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); CfnInclude template = CfnInclude.Builder.create(this, "Template") .templateFile("my-template.json") .build(); } }
C#
using Amazon.CDK; using Constructs; using cfnInc = Amazon.CDK.CloudFormation.Include; namespace MyApp { public class MyStack : Stack { internal MyStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var template = new cfnInc.CfnInclude(this, "Template", new cfnInc.CfnIncludeProps { TemplateFile = "my-template.json" }); } } }

Standardmäßig wird beim Importieren einer Ressource die ursprüngliche logische ID der Ressource aus der Vorlage beibehalten. Dieses Verhalten eignet sich für den Import einer AWS CloudFormation Vorlage in die AWS CDK, wobei logische Daten beibehalten werden IDs müssen. AWS CloudFormation benötigt diese Informationen, um diese importierten Ressourcen als dieselben Ressourcen aus der AWS CloudFormation Vorlage zu erkennen.

Wenn Sie einen AWS CDK Konstrukt-Wrapper für die Vorlage entwickeln, sodass er von anderen AWS CDK Entwicklern verwendet werden kann, lassen Sie IDs stattdessen die neue Ressource AWS CDK generieren. Auf diese Weise kann das Konstrukt ohne Namenskonflikte mehrfach in einem Stapel verwendet werden. Setzen Sie dazu false beim Import der Vorlage die preserveLogicalIds Eigenschaft auf. Im Folgenden wird ein Beispiel gezeigt:

TypeScript
const template = new cfninc.CfnInclude(this, 'MyConstruct', { templateFile: 'my-template.json', preserveLogicalIds: false });
JavaScript
const template = new cfninc.CfnInclude(this, 'MyConstruct', { templateFile: 'my-template.json', preserveLogicalIds: false });
Python
template = cfn_inc.CfnInclude(self, "Template", template_file="my-template.json", preserve_logical_ids=False)
Java
CfnInclude template = CfnInclude.Builder.create(this, "Template") .templateFile("my-template.json") .preserveLogicalIds(false) .build();
C#
var template = new cfnInc.CfnInclude(this, "Template", new cfn_inc.CfnIncludeProps { TemplateFile = "my-template.json", PreserveLogicalIds = false });

Um importierte Ressourcen unter die Kontrolle Ihrer AWS CDK App zu stellen, fügen Sie den Stack zuApp:

TypeScript
import * as cdk from 'aws-cdk-lib'; import { MyStack } from '../lib/my-stack'; const app = new cdk.App(); new MyStack(app, 'MyStack');
JavaScript
const cdk = require('aws-cdk-lib'); const { MyStack } = require('../lib/my-stack'); const app = new cdk.App(); new MyStack(app, 'MyStack');
Python
import aws_cdk as cdk from mystack.my_stack import MyStack app = cdk.App() MyStack(app, "MyStack")
Java
import software.amazon.awscdk.App; public class MyApp { public static void main(final String[] args) { App app = new App(); new MyStack(app, "MyStack"); } }
C#
using Amazon.CDK; namespace CdkApp { sealed class Program { public static void Main(string[] args) { var app = new App(); new MyStack(app, "MyStack"); } } }

Um sicherzustellen, dass keine unbeabsichtigten Änderungen an den AWS Ressourcen im Stack vorgenommen werden, können Sie einen Vergleich durchführen. Verwenden Sie den AWS CDK CLI cdk diff Befehl und lassen Sie alle AWS CDK-spezifischen Metadaten weg. Im Folgenden wird ein Beispiel gezeigt:

cdk diff --no-version-reporting --no-path-metadata --no-asset-metadata

Nachdem Sie eine AWS CloudFormation Vorlage importiert haben, sollte die AWS CDK App zur Informationsquelle für Ihre importierten Ressourcen werden. Um Änderungen an Ihren Ressourcen vorzunehmen, ändern Sie sie in Ihrer AWS CDK App und stellen Sie sie mit dem AWS CDK CLI cdk deploy Befehl bereit.

Greife auf importierte Ressourcen zu

Der Name template im Beispielcode steht für die importierte AWS CloudFormation Vorlage. Verwenden Sie die getResource()Methode des Objekts, um von dort aus auf eine Ressource zuzugreifen. Um auf die zurückgegebene Ressource als eine bestimmte Art von Ressource zuzugreifen, wandeln Sie das Ergebnis in den gewünschten Typ um. Dies ist in Python oder nicht erforderlich JavaScript. Im Folgenden wird ein Beispiel gezeigt:

TypeScript
const cfnBucket = template.getResource('MyBucket') as s3.CfnBucket;
JavaScript
const cfnBucket = template.getResource('MyBucket');
Python
cfn_bucket = template.get_resource("MyBucket")
Java
CfnBucket cfnBucket = (CfnBucket)template.getResource("MyBucket");
C#
var cfnBucket = (CfnBucket)template.GetResource("MyBucket");

Aus diesem Beispiel cfnBucket geht es jetzt um eine Instanz der aws-s3.CfnBucketKlasse. Dies ist ein L1-Konstrukt, das die entsprechende AWS CloudFormation Ressource darstellt. Sie können es wie jede andere Ressource dieses Typs behandeln. Sie können ihren ARN Wert beispielsweise mit der bucket.attrArn Eigenschaft ermitteln.

Um die CfnBucket L1-Ressource stattdessen in eine aws-s3.BucketL2-Instanz zu packen, verwenden Sie die statischen Methoden fromBucketArn(), fromBucketAttributes(), oder. fromBucketName() In der Regel ist die fromBucketName() Methode am praktischsten. Im Folgenden wird ein Beispiel gezeigt:

TypeScript
const bucket = s3.Bucket.fromBucketName(this, 'Bucket', cfnBucket.ref);
JavaScript
const bucket = s3.Bucket.fromBucketName(this, 'Bucket', cfnBucket.ref);
Python
bucket = s3.Bucket.from_bucket_name(self, "Bucket", cfn_bucket.ref)
Java
Bucket bucket = (Bucket)Bucket.fromBucketName(this, "Bucket", cfnBucket.getRef());
C#
var bucket = (Bucket)Bucket.FromBucketName(this, "Bucket", cfnBucket.Ref);

Andere L2-Konstrukte verwenden ähnliche Methoden, um das Konstrukt aus einer vorhandenen Ressource zu erstellen.

Wenn Sie ein L1-Konstrukt in ein L2-Konstrukt einbinden, wird dadurch keine neue Ressource erstellt. In unserem Beispiel erstellen wir keinen zweiten S3; -Bucket. Stattdessen kapselt die neue Bucket Instanz die bestehende. CfnBucket

Aus dem Beispiel geht hervor, dass bucket es sich nun um ein Bucket L2-Konstrukt handelt, das sich wie jedes andere L2-Konstrukt verhält. Beispielsweise können Sie einer AWS Lambda Funktion Schreibzugriff auf den Bucket gewähren, indem Sie die praktische Methode des Buckets verwenden. grantWrite() Sie müssen die erforderliche Richtlinie AWS Identity and Access Management (IAM) nicht manuell definieren. Im Folgenden wird ein Beispiel gezeigt:

TypeScript
bucket.grantWrite(lambdaFunc);
JavaScript
bucket.grantWrite(lambdaFunc);
Python
bucket.grant_write(lambda_func)
Java
bucket.grantWrite(lambdaFunc);
C#
bucket.GrantWrite(lambdaFunc);

Parameter ersetzen

Wenn Ihre AWS CloudFormation Vorlage Parameter enthält, können Sie diese beim Import mithilfe der parameters Eigenschaft durch Werte für die Erstellungszeit ersetzen. Im folgenden Beispiel ersetzen wir den UploadBucket Parameter durch den eines Buckets, ARN der an anderer Stelle in unserem AWS CDK Code definiert ist.

TypeScript
const template = new cfninc.CfnInclude(this, 'Template', { templateFile: 'my-template.json', parameters: { 'UploadBucket': bucket.bucketArn, }, });
JavaScript
const template = new cfninc.CfnInclude(this, 'Template', { templateFile: 'my-template.json', parameters: { 'UploadBucket': bucket.bucketArn, }, });
Python
template = cfn_inc.CfnInclude(self, "Template", template_file="my-template.json", parameters=dict(UploadBucket=bucket.bucket_arn) )
Java
CfnInclude template = CfnInclude.Builder.create(this, "Template") .templateFile("my-template.json") .parameters(java.util.Map.of( // Map.of requires Java 9+ "UploadBucket", bucket.getBucketArn())) .build();
C#
var template = new cfnInc.CfnInclude(this, "Template", new cfnInc.CfnIncludeProps { TemplateFile = "my-template.json", Parameters = new Dictionary<string, string> { { "UploadBucket", bucket.BucketArn } } });

Importieren Sie andere Vorlagenelemente

Sie können jedes AWS CloudFormation Vorlagenelement importieren, nicht nur Ressourcen. Die importierten Elemente werden Teil des AWS CDK Stapels. Verwenden Sie die folgenden Methoden des CfnInclude Objekts, um diese Elemente zu importieren:

Jede dieser Methoden gibt eine Instanz einer Klasse zurück, die den spezifischen AWS CloudFormation Elementtyp repräsentiert. Diese Objekte sind veränderbar. Änderungen, die Sie an ihnen vornehmen, werden in der Vorlage angezeigt, die aus dem AWS CDK Stapel generiert wird. Das folgende Beispiel importiert einen Parameter aus der Vorlage und ändert seinen Standardwert:

TypeScript
const param = template.getParameter('MyParameter'); param.default = "AWS CDK"
JavaScript
const param = template.getParameter('MyParameter'); param.default = "AWS CDK"
Python
param = template.get_parameter("MyParameter") param.default = "AWS CDK"
Java
CfnParameter param = template.getParameter("MyParameter"); param.setDefaultValue("AWS CDK")
C#
var cfnBucket = (CfnBucket)template.GetResource("MyBucket"); var param = template.GetParameter("MyParameter"); param.Default = "AWS CDK";

Verschachtelte Stapel importieren

Sie können verschachtelte Stapel importieren, indem Sie sie entweder beim Import ihrer Hauptvorlage oder zu einem späteren Zeitpunkt angeben. Die verschachtelte Vorlage muss in einer lokalen Datei gespeichert werden, in der Hauptvorlage jedoch als NestedStack Ressource referenziert werden. Außerdem muss der im AWS CDK Code verwendete Ressourcenname mit dem Namen übereinstimmen, der für den verschachtelten Stapel in der Hauptvorlage verwendet wird.

Angesichts dieser Ressourcendefinition in der Hauptvorlage zeigt der folgende Code, wie der referenzierte verschachtelte Stapel in beide Richtungen importiert wird.

"NestedStack": { "Type": "AWS::CloudFormation::Stack", "Properties": { "TemplateURL": "https://my-s3-template-source.s3.amazonaws.com/nested-stack.json" }
TypeScript
// include nested stack when importing main stack const mainTemplate = new cfninc.CfnInclude(this, 'MainStack', { templateFile: 'main-template.json', loadNestedStacks: { 'NestedStack': { templateFile: 'nested-template.json', }, }, }); // or add it some time after importing the main stack const nestedTemplate = mainTemplate.loadNestedStack('NestedTemplate', { templateFile: 'nested-template.json', });
JavaScript
// include nested stack when importing main stack const mainTemplate = new cfninc.CfnInclude(this, 'MainStack', { templateFile: 'main-template.json', loadNestedStacks: { 'NestedStack': { templateFile: 'nested-template.json', }, }, }); // or add it some time after importing the main stack const nestedTemplate = mainTemplate.loadNestedStack('NestedStack', { templateFile: 'my-nested-template.json', });
Python
# include nested stack when importing main stack main_template = cfn_inc.CfnInclude(self, "MainStack", template_file="main-template.json", load_nested_stacks=dict(NestedStack= cfn_inc.CfnIncludeProps(template_file="nested-template.json"))) # or add it some time after importing the main stack nested_template = main_template.load_nested_stack("NestedStack", template_file="nested-template.json")
Java
CfnInclude mainTemplate = CfnInclude.Builder.create(this, "MainStack") .templateFile("main-template.json") .loadNestedStacks(java.util.Map.of( // Map.of requires Java 9+ "NestedStack", CfnIncludeProps.builder() .templateFile("nested-template.json").build())) .build(); // or add it some time after importing the main stack IncludedNestedStack nestedTemplate = mainTemplate.loadNestedStack("NestedTemplate", CfnIncludeProps.builder() .templateFile("nested-template.json") .build());
C#
// include nested stack when importing main stack var mainTemplate = new cfnInc.CfnInclude(this, "MainStack", new cfnInc.CfnIncludeProps { TemplateFile = "main-template.json", LoadNestedStacks = new Dictionary<string, cfnInc.ICfnIncludeProps> { { "NestedStack", new cfnInc.CfnIncludeProps { TemplateFile = "nested-template.json" } } } }); // or add it some time after importing the main stack var nestedTemplate = mainTemplate.LoadNestedStack("NestedTemplate", new cfnInc.CfnIncludeProps { TemplateFile = 'nested-template.json' });

Sie können mehrere verschachtelte Stapel mit beiden Methoden importieren. Wenn Sie die Hauptvorlage importieren, stellen Sie eine Zuordnung zwischen dem Ressourcennamen jedes verschachtelten Stapels und seiner Vorlagendatei bereit. Diese Zuordnung kann eine beliebige Anzahl von Einträgen enthalten. Rufen Sie dies nach dem ersten Import für jeden verschachtelten Stapel loadNestedStack() einmal auf.

Nach dem Import eines verschachtelten Stacks können Sie mit der Methode der Hauptvorlage darauf zugreifen. getNestedStack()

TypeScript
const nestedStack = mainTemplate.getNestedStack('NestedStack').stack;
JavaScript
const nestedStack = mainTemplate.getNestedStack('NestedStack').stack;
Python
nested_stack = main_template.get_nested_stack("NestedStack").stack
Java
NestedStack nestedStack = mainTemplate.getNestedStack("NestedStack").getStack();
C#
var nestedStack = mainTemplate.GetNestedStack("NestedStack").Stack;

Die getNestedStack() Methode gibt eine IncludedNestedStackInstanz zurück. Von dieser Instanz aus können Sie über die stack Eigenschaft auf die AWS CDK NestedStackInstanz zugreifen, wie im Beispiel gezeigt. Sie können auch über auf das ursprüngliche AWS CloudFormation Vorlagenobjekt zugreifenincludedTemplate, aus dem Sie Ressourcen und andere AWS CloudFormation Elemente laden können.