Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Buat atau perluas konstruksi
Apa itu konstruk
Konstruk adalah blok bangunan dasar dari suatu AWS CDK aplikasi. Konstruksi dapat mewakili satu AWS sumber daya, seperti bucket Amazon Simple Storage Service (Amazon S3), atau dapat berupa abstraksi tingkat tinggi yang terdiri dari beberapa sumber daya terkait. AWS Komponen konstruksi dapat mencakup antrian pekerja dengan kapasitas komputasi yang terkait, atau pekerjaan terjadwal dengan sumber daya pemantauan dan dasbor. AWS CDK
Termasuk koleksi konstruksi yang disebut AWS Construct Library. Perpustakaan berisi konstruksi untuk setiap Layanan AWS. Anda dapat menggunakan Construct Hub
Apa jenis konstruksi yang berbeda
Ada tiga jenis konstruksi untuk: AWS CDK
-
Konstruksi L1 - Layer 1, atau L1, konstruksi persis sumber daya yang ditentukan oleh CloudFormation —tidak lebih, tidak kurang. Anda harus menyediakan sumber daya yang diperlukan untuk konfigurasi sendiri. Konstruksi L1 ini sangat mendasar dan harus dikonfigurasi secara manual. Konstruksi L1 memiliki
Cfn
awalan dan sesuai langsung dengan spesifikasi. CloudFormation Baru Layanan AWS didukung AWS CDK segera setelah CloudFormation memiliki dukungan untuk layanan ini. CfnBucketadalah contoh yang baik dari konstruksi L1. Kelas ini mewakili bucket S3 di mana Anda harus secara eksplisit mengkonfigurasi semua properti. Kami menyarankan Anda hanya menggunakan konstruksi L1 jika Anda tidak dapat menemukan konstruksi L2 atau L3 untuknya. -
Konstruksi L2 — Konstruksi Layer 2, atau L2, memiliki kode boilerplate dan logika lem yang umum. Konstruksi ini datang dengan default yang nyaman dan mengurangi jumlah pengetahuan yang perlu Anda ketahui tentang mereka. Konstruksi L2 menggunakan berbasis niat APIs untuk membangun sumber daya Anda dan biasanya merangkum modul L1 yang sesuai. Contoh yang baik dari konstruksi L2 adalah Bucket. Kelas ini membuat bucket S3 dengan properti dan metode default seperti bucket. addLifeCycleRule (), yang menambahkan aturan siklus hidup ke bucket.
-
Konstruksi L3 — Konstruksi lapisan 3, atau L3, disebut pola. Konstruksi L3 dirancang untuk membantu Anda menyelesaikan tugas-tugas umum AWS, seringkali melibatkan berbagai jenis sumber daya. Ini bahkan lebih spesifik dan berpendirian daripada konstruksi L2 dan melayani kasus penggunaan tertentu. Misalnya, aws-ecs-patterns. ApplicationLoadBalancedFargateServiceconstruct merupakan arsitektur yang mencakup cluster AWS Fargate kontainer yang menggunakan Application Load Balancer. Contoh lain adalah aws-apigateway. LambdaRestApimembangun. Konstruksi ini mewakili API Amazon API Gateway yang didukung oleh fungsi Lambda.
Ketika tingkat konstruksi semakin tinggi, lebih banyak asumsi dibuat tentang bagaimana konstruksi ini akan digunakan. Ini memungkinkan Anda untuk menyediakan antarmuka dengan default yang lebih efektif untuk kasus penggunaan yang sangat spesifik.
Cara membuat konstruksi Anda sendiri
Untuk menentukan konstruksi Anda sendiri, Anda harus mengikuti pendekatan tertentu. Ini karena semua konstruksi memperluas Construct
kelas. Construct
Kelas adalah blok bangunan dari pohon konstruksi. Konstruksi diimplementasikan di kelas yang memperluas kelas Construct
dasar. Semua konstruksi mengambil tiga parameter saat diinisialisasi:
-
Scope — Induk atau pemilik konstruksi, baik tumpukan atau konstruksi lain, yang menentukan tempatnya di pohon konstruksi. Anda biasanya harus lulus
this
(atauself
dengan Python), yang mewakili objek saat ini, untuk ruang lingkup. -
id — Pengenal yang harus unik dalam lingkup ini. Identifier berfungsi sebagai namespace untuk semua yang didefinisikan dalam konstruksi saat ini dan digunakan untuk mengalokasikan identitas unik, seperti nama sumber daya dan logis. CloudFormation IDs
-
Props — Satu set properti yang menentukan konfigurasi awal konstruksi.
Contoh berikut menunjukkan bagaimana mendefinisikan konstruksi.
import { Construct } from 'constructs'; export interface CustomProps { // List all the properties Name: string; } export class MyConstruct extends Construct { constructor(scope: Construct, id: string, props: CustomProps) { super(scope, id); // TODO } }
Buat atau perluas konstruksi L2
Konstruksi L2 mewakili “komponen cloud” dan merangkum semua yang CloudFormation harus dimiliki untuk membuat komponen. Konstruksi L2 dapat berisi satu atau lebih AWS sumber daya, dan Anda bebas untuk menyesuaikan konstruksinya sendiri. Keuntungan membuat atau memperluas konstruksi L2 adalah Anda dapat menggunakan kembali komponen dalam CloudFormation tumpukan tanpa mendefinisikan ulang kode. Anda cukup mengimpor konstruksi sebagai kelas.
Ketika ada hubungan “is a” dengan konstruksi yang ada, Anda dapat memperluas konstruksi yang ada untuk menambahkan fitur default tambahan. Ini adalah praktik terbaik untuk menggunakan kembali properti konstruksi L2 yang ada. Anda dapat menimpa properti dengan memodifikasi properti secara langsung di konstruktor.
Contoh berikut menunjukkan bagaimana menyelaraskan dengan praktik terbaik dan memperluas konstruksi L2 yang ada yang disebut. s3.Bucket
Ekstensi menetapkan properti default, seperti,versioned
, publicReadAccess
blockPublicAccess
, untuk memastikan bahwa semua objek (dalam contoh ini, bucket S3) yang dibuat dari konstruksi baru ini akan selalu memiliki nilai default ini ditetapkan.
import * as s3 from 'aws-cdk-lib/aws-s3'; import { Construct } from 'constructs'; export class MySecureBucket extends s3.Bucket { constructor(scope: Construct, id: string, props?: s3.BucketProps) { super(scope, id, { ...props, versioned: true, publicReadAccess: false, blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL }); } }
Buat konstruksi L3
Komposisi adalah pilihan yang lebih baik ketika ada hubungan “memiliki” dengan komposisi konstruksi yang ada. Komposisi berarti Anda membangun konstruksi Anda sendiri di atas konstruksi lain yang ada. Anda dapat membuat pola Anda sendiri untuk merangkum semua sumber daya dan nilai defaultnya di dalam satu konstruksi L3 tingkat tinggi yang dapat dibagikan. Manfaat membuat konstruksi (pola) L3 Anda sendiri adalah Anda dapat menggunakan kembali komponen dalam tumpukan tanpa mendefinisikan ulang kode. Anda cukup mengimpor konstruksi sebagai kelas. Pola-pola ini dirancang untuk membantu konsumen menyediakan berbagai sumber daya berdasarkan pola umum dengan jumlah pengetahuan yang terbatas secara ringkas.
Contoh kode berikut menciptakan sebuah AWS CDK konstruksi yang disebutExampleConstruct
. Anda dapat menggunakan konstruksi ini sebagai template untuk menentukan komponen cloud Anda.
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; export interface ExampleConstructProps { //insert properties you wish to expose } export class ExampleConstruct extends Construct { constructor(scope: Construct, id: string, props: ExampleConstructProps) { super(scope, id); //Insert the AWS components you wish to integrate } }
Contoh berikut menunjukkan cara mengimpor konstruksi yang baru dibuat dalam AWS CDK aplikasi atau tumpukan Anda.
import { ExampleConstruct } from './lib/construct-name';
Contoh berikut menunjukkan bagaimana Anda dapat membuat instance dari konstruksi yang Anda perpanjang dari kelas dasar.
import { ExampleConstruct } from './lib/construct-name'; new ExampleConstruct(this, 'newConstruct', { //insert props which you exposed in the interface `ExampleConstructProps` });
Untuk informasi lebih lanjut, lihat AWS CDK
Lokakarya
Escape hatch
Anda dapat menggunakan pintu keluar AWS CDK untuk naik tingkat abstraksi sehingga Anda dapat mengakses tingkat konstruksi yang lebih rendah. Palka pelarian digunakan untuk memperluas konstruksi untuk fitur yang tidak diekspos dengan versi saat ini AWS tetapi tersedia di. CloudFormation
Kami menyarankan Anda menggunakan pintu keluar dalam skenario berikut:
-
Sebuah Layanan AWS fitur tersedia melalui CloudFormation, tetapi tidak ada
Construct
konstruksi untuk itu. -
Sebuah Layanan AWS fitur tersedia melalui CloudFormation dan ada
Construct
konstruksi untuk layanan, tetapi ini belum mengekspos fitur tersebut. KarenaConstruct
konstruksi dikembangkan “dengan tangan,” mereka terkadang tertinggal dari konstruksi CloudFormation sumber daya.
Kode contoh berikut menunjukkan kasus penggunaan umum untuk menggunakan pintu keluar. Dalam contoh ini, fungsionalitas yang belum diimplementasikan dalam konstruksi tingkat yang lebih tinggi adalah untuk ditambahkan httpPutResponseHopLimit
untuk penskalaan otomatis. LaunchConfiguration
const launchConfig = autoscaling.onDemandASG.node.findChild("LaunchConfig") as CfnLaunchConfiguration; launchConfig.metadataOptions = { httpPutResponseHopLimit: autoscalingConfig.httpPutResponseHopLimit|| 2 }
Contoh kode sebelumnya menunjukkan alur kerja berikut:
-
Anda mendefinisikan Anda
AutoScalingGroup
dengan menggunakan konstruksi L2. Konstruksi L2 tidak mendukung pembaruanhttpPutResponseHopLimit
, jadi Anda harus menggunakan pintu keluar. -
Anda mengakses
node.defaultChild
properti padaAutoScalingGroup
konstruksi L2 dan melemparkannya sebagai sumber daya.CfnLaunchConfiguration
-
Anda sekarang dapat mengatur
launchConfig.metadataOptions
properti pada L1CfnLaunchConfiguration
.
Sumber daya khusus
Anda dapat menggunakan sumber daya kustom untuk menulis logika penyediaan kustom dalam template yang CloudFormation berjalan setiap kali Anda membuat, memperbarui (jika Anda mengubah sumber daya kustom), atau menghapus tumpukan. Misalnya, Anda dapat menggunakan sumber daya khusus jika ingin menyertakan sumber daya yang tidak tersedia di file AWS CDK. Dengan begitu, Anda masih dapat mengelola semua sumber daya terkait Anda dalam satu tumpukan.
Membangun sumber daya khusus melibatkan penulisan fungsi Lambda yang merespons peristiwa siklus hidup CREATE, UPDATE, dan DELETE sumber daya. Jika sumber daya kustom Anda harus membuat hanya satu panggilan API, pertimbangkan untuk menggunakan AwsCustomResource
Untuk informasi selengkapnya tentang sumber daya kustom, lihat Sumber daya khusus dalam CloudFormation dokumentasi. Untuk contoh cara menggunakan sumber daya kustom, lihat repositori Sumber Daya Kustom
Contoh berikut menunjukkan cara membuat kelas sumber daya khusus untuk memulai fungsi Lambda dan CloudFormation mengirim sinyal sukses atau gagal.
import cdk = require('aws-cdk-lib'); import customResources = require('aws-cdk-lib/custom-resources'); import lambda = require('aws-cdk-lib/aws-lambda'); import { Construct } from 'constructs'; import fs = require('fs'); export interface MyCustomResourceProps { /** * Message to echo */ message: string; } export class MyCustomResource extends Construct { public readonly response: string; constructor(scope: Construct, id: string, props: MyCustomResourceProps) { super(scope, id); const fn = new lambda.SingletonFunction(this, 'Singleton', { uuid: 'f7d4f730-4ee1-11e8-9c2d-fa7ae01bbebc', code: new lambda.InlineCode(fs.readFileSync('custom-resource-handler.py', { encoding: 'utf-8' })), handler: 'index.main', timeout: cdk.Duration.seconds(300), runtime: lambda.Runtime.PYTHON_3_6, }); const provider = new customResources.Provider(this, 'Provider', { onEventHandler: fn, }); const resource = new cdk.CustomResource(this, 'Resource', { serviceToken: provider.serviceToken, properties: props, }); this.response = resource.getAtt('Response').toString(); } }
Contoh berikut menunjukkan logika utama dari sumber daya kustom.
def main(event, context): import logging as log import cfnresponse log.getLogger().setLevel(log.INFO) # This needs to change if there are to be multiple resources in the same stack physical_id = 'TheOnlyCustomResource' try: log.info('Input event: %s', event) # Check if this is a Create and we're failing Creates if event['RequestType'] == 'Create' and event['ResourceProperties'].get('FailCreate', False): raise RuntimeError('Create failure requested') # Do the thing message = event['ResourceProperties']['Message'] attributes = { 'Response': 'You said "%s"' % message } cfnresponse.send(event, context, cfnresponse.SUCCESS, attributes, physical_id) except Exception as e: log.exception(e) # cfnresponse's error message is always "see CloudWatch" cfnresponse.send(event, context, cfnresponse.FAILED, {}, physical_id)
Contoh berikut menunjukkan bagaimana AWS CDK tumpukan memanggil sumber daya kustom.
import cdk = require('aws-cdk-lib'); import { MyCustomResource } from './my-custom-resource'; /** * A stack that sets up MyCustomResource and shows how to get an attribute from it */ class MyStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); const resource = new MyCustomResource(this, 'DemoResource', { message: 'CustomResource says hello', }); // Publish the custom resource output new cdk.CfnOutput(this, 'ResponseMessage', { description: 'The message that came back from the Custom Resource', value: resource.response }); } } const app = new cdk.App(); new MyStack(app, 'CustomResourceDemoStack'); app.synth();