Impor AWS CloudFormation template yang ada - AWS Cloud Development Kit (AWS CDK) v2

Ini adalah Panduan Pengembang AWS CDK v2. CDKV1 yang lebih lama memasuki pemeliharaan pada 1 Juni 2022 dan mengakhiri dukungan pada 1 Juni 2023.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Impor AWS CloudFormation template yang ada

Impor sumber daya dari AWS CloudFormation template ke AWS Cloud Development Kit (AWS CDK) aplikasi Anda dengan menggunakan cloudformation-include.CfnIncludekonstruksi untuk mengonversi sumber daya ke konstruksi L1.

Setelah mengimpor, Anda dapat bekerja dengan resource ini di aplikasi Anda dengan cara yang sama seperti jika mereka awalnya didefinisikan dalam AWS CDK kode. Anda juga dapat menggunakan konstruksi L1 ini dalam konstruksi tingkat yang lebih tinggi AWS CDK . Misalnya, ini memungkinkan Anda menggunakan metode pemberian izin L2 dengan sumber daya yang mereka definisikan.

cloudformation-include.CfnIncludeKonstruksi pada dasarnya menambahkan AWS CDK API pembungkus ke sumber daya apa pun di template Anda AWS CloudFormation . Gunakan kemampuan ini untuk mengimpor AWS CloudFormation templat AWS CDK yang ada ke bagian sekaligus. Dengan melakukan ini, Anda dapat mengelola sumber daya yang ada menggunakan AWS CDK konstruksi untuk memanfaatkan manfaat abstraksi tingkat yang lebih tinggi. Anda juga dapat menggunakan fitur ini untuk menjual AWS CloudFormation template Anda ke AWS CDK pengembang dengan menyediakan AWS CDK konstruksiAPI.

catatan

AWS CDK v1 juga disertakan aws-cdk-lib.CfnInclude, yang sebelumnya digunakan untuk tujuan umum yang sama. Namun, ia tidak memiliki banyak fungsi dari. cloudformation-include.CfnInclude

Impor AWS CloudFormation template

Berikut ini adalah contoh AWS CloudFormation template yang akan kita gunakan untuk memberikan contoh dalam topik ini. Salin dan simpan template my-template.json untuk diikuti. Setelah mengerjakan contoh-contoh ini, Anda dapat menjelajahi lebih jauh dengan menggunakan salah satu AWS CloudFormation templat yang sudah Anda gunakan. Anda bisa mendapatkannya dari AWS CloudFormation konsol.

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

Anda dapat bekerja dengan salah satu JSON atau YAML templat. Kami merekomendasikan JSON jika tersedia karena YAML parser dapat sedikit berbeda dalam apa yang mereka terima.

Berikut ini adalah contoh cara mengimpor template sampel ke AWS CDK aplikasi Anda menggunakancloudformation-include. Template diimpor dalam konteks CDK tumpukan.

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" }); } } }

Secara default, mengimpor sumber daya mempertahankan ID logis asli sumber daya dari template. Perilaku ini cocok untuk mengimpor AWS CloudFormation templat ke dalam AWS CDK, di mana logika IDs harus dipertahankan. AWS CloudFormation membutuhkan informasi ini untuk mengenali sumber daya yang diimpor ini sebagai sumber daya yang sama dari AWS CloudFormation template.

Jika Anda mengembangkan pembungkus AWS CDK konstruksi untuk template sehingga dapat digunakan oleh AWS CDK pengembang lain, dapatkan sumber daya IDs baru AWS CDK sebagai gantinya. Dengan melakukan ini, konstruksi dapat digunakan beberapa kali dalam tumpukan tanpa konflik nama. Untuk melakukan ini, setel preserveLogicalIds properti ke false saat mengimpor template. Berikut adalah contohnya:

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 });

Untuk menempatkan sumber daya yang diimpor di bawah kendali AWS CDK aplikasi Anda, tambahkan tumpukan keApp:

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"); } } }

Untuk memverifikasi bahwa tidak akan ada perubahan yang tidak diinginkan pada AWS sumber daya di tumpukan, Anda dapat melakukan diff. Gunakan AWS CDK CLI cdk diff perintah dan hilangkan metadata AWS CDK-spesifik apa pun. Berikut adalah contohnya:

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

Setelah Anda mengimpor AWS CloudFormation template, AWS CDK aplikasi harus menjadi sumber kebenaran untuk sumber daya impor Anda. Untuk membuat perubahan pada resource Anda, modifikasi di AWS CDK aplikasi Anda dan terapkan dengan AWS CDK CLI cdk deploy perintah.

Akses sumber daya yang diimpor

Nama template dalam kode contoh mewakili AWS CloudFormation template yang diimpor. Untuk mengakses sumber daya darinya, gunakan getResource()metode objek. Untuk mengakses sumber daya yang dikembalikan sebagai jenis sumber daya tertentu, lemparkan hasilnya ke jenis yang diinginkan. Ini tidak diperlukan dalam Python atau. JavaScript Berikut adalah contohnya:

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");

Dari contoh ini, sekarang cfnBucket merupakan contoh dari aws-s3.CfnBucketkelas. Ini adalah konstruksi L1 yang mewakili sumber daya yang sesuai AWS CloudFormation . Anda dapat memperlakukannya seperti sumber daya lain dari jenisnya. Misalnya, Anda bisa mendapatkan ARN nilainya dengan bucket.attrArn properti.

Untuk membungkus CfnBucket sumber daya L1 dalam aws-s3.Bucketinstance L2 sebagai gantinya, gunakan metode statis fromBucketArn(), fromBucketAttributes(), atau. fromBucketName() Biasanya, fromBucketName() metode ini paling nyaman. Berikut adalah contohnya:

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);

Konstruksi L2 lainnya memiliki metode serupa untuk membuat konstruksi dari sumber daya yang ada.

Saat Anda membungkus konstruksi L1 dalam konstruksi L2, itu tidak membuat sumber daya baru. Dari contoh kami, kami tidak membuat ember S3; kedua. Sebaliknya, Bucket instance baru merangkum yang sudah ada. CfnBucket

Dari contoh, sekarang bucket merupakan konstruksi L2 yang berperilaku seperti Bucket konstruksi L2 lainnya. Misalnya, Anda dapat memberikan akses tulis AWS Lambda fungsi ke bucket dengan menggunakan grantWrite()metode praktis bucket. Anda tidak perlu menentukan kebijakan AWS Identity and Access Management (IAM) yang diperlukan secara manual. Berikut adalah contohnya:

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

Ganti parameter

Jika AWS CloudFormation template berisi parameter, Anda dapat menggantinya dengan nilai waktu pembuatan saat diimpor menggunakan parameters properti. Dalam contoh berikut, kita mengganti UploadBucket parameter dengan bucket didefinisikan di tempat lain dalam AWS CDK kode kita. ARN

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 } } });

Impor elemen template lainnya

Anda dapat mengimpor elemen AWS CloudFormation template apa pun, bukan hanya sumber daya. Elemen yang diimpor menjadi bagian dari AWS CDK tumpukan. Untuk mengimpor elemen-elemen ini, gunakan metode CfnInclude objek berikut:

Masing-masing metode ini mengembalikan sebuah instance dari kelas yang mewakili jenis tertentu dari AWS CloudFormation elemen. Benda-benda ini bisa berubah. Perubahan yang Anda buat pada mereka akan muncul di template yang dihasilkan dari AWS CDK tumpukan. Berikut ini adalah contoh yang mengimpor parameter dari template dan memodifikasi nilai defaultnya:

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";

Impor tumpukan bersarang

Anda dapat mengimpor tumpukan bersarang dengan menentukan mereka baik ketika Anda mengimpor template utama mereka, atau di beberapa titik kemudian. Template bersarang harus disimpan dalam file lokal, tetapi direferensikan sebagai NestedStack sumber daya di template utama. Juga, nama sumber daya yang digunakan dalam AWS CDK kode harus cocok dengan nama yang digunakan untuk tumpukan bersarang di template utama.

Mengingat definisi sumber daya ini di template utama, kode berikut menunjukkan cara mengimpor tumpukan bersarang yang direferensikan dengan dua arah.

"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' });

Anda dapat mengimpor beberapa tumpukan bersarang dengan salah satu metode. Saat mengimpor template utama, Anda memberikan pemetaan antara nama sumber daya setiap tumpukan bersarang dan file templatnya. Pemetaan ini dapat berisi sejumlah entri. Untuk melakukannya setelah impor awal, panggil loadNestedStack() sekali untuk setiap tumpukan bersarang.

Setelah mengimpor tumpukan bersarang, Anda dapat mengaksesnya menggunakan metode template utama. 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;

getNestedStack()Metode mengembalikan sebuah IncludedNestedStackinstance. Dari contoh ini, Anda dapat mengakses AWS CDK NestedStackinstance melalui stack properti, seperti yang ditunjukkan pada contoh. Anda juga dapat mengakses objek AWS CloudFormation template asli melaluiincludedTemplate, dari mana Anda dapat memuat sumber daya dan AWS CloudFormation elemen lainnya.