Buat atau perluas konstruksi - AWS Bimbingan Preskriptif

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 untuk menemukan konstruksi tambahan dari AWS, pihak ketiga, dan komunitas sumber terbuka AWS CDK .

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. ConstructKelas 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 (atau self 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, publicReadAccessblockPublicAccess, 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 di dokumentasi 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. Karena Construct 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:

  1. Anda mendefinisikan Anda AutoScalingGroup dengan menggunakan konstruksi L2. Konstruksi L2 tidak mendukung pembaruanhttpPutResponseHopLimit, jadi Anda harus menggunakan pintu keluar.

  2. Anda mengakses node.defaultChild properti pada AutoScalingGroup konstruksi L2 dan melemparkannya sebagai sumber daya. CfnLaunchConfiguration

  3. 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 AwsCustomResourcekonstruksinya. Hal ini memungkinkan untuk melakukan panggilan SDK arbitrer selama penerapan. CloudFormation Jika tidak, kami sarankan Anda menulis fungsi Lambda Anda sendiri untuk melakukan pekerjaan yang harus Anda selesaikan.

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 aktif. GitHub

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