

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

# Buat atau perluas konstruksi
<a name="constructs-best-practices"></a>

## Apa itu konstruk
<a name="construct-definition"></a>

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](https://constructs.dev/search?q=&cdk=aws-cdk&cdkver=2&sort=downloadsDesc&offset=0) untuk menemukan konstruksi tambahan dari AWS, pihak ketiga, dan komunitas sumber terbuka AWS CDK .

## Apa jenis konstruksi yang berbeda
<a name="construct-types"></a>

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. [CfnBucket](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-s3.CfnBucket.html)adalah 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.](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html) Kelas ini membuat bucket S3 dengan properti dan metode default seperti [bucket. addLifeCycleRule ()](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-s3.Bucket.html#add-wbr-lifecycle-wbr-rulerule), 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. ApplicationLoadBalancedFargateService](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs_patterns.ApplicationLoadBalancedFargateService.html)construct merupakan arsitektur yang mencakup cluster AWS Fargate kontainer yang menggunakan Application Load Balancer. Contoh lain adalah [aws-apigateway. LambdaRestApi](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway.LambdaRestApi.html)membangun. 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
<a name="create-construct"></a>

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` (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
<a name="create-l2-construct"></a>

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
<a name="create-l3-construct"></a>

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 disebut`ExampleConstruct`. 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](https://cdkworkshop.com/) di dokumentasi AWS CDK Lokakarya.

## Escape hatch
<a name="escape-hatch"></a>

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 pembaruan`httpPutResponseHopLimit`, jadi Anda harus menggunakan pintu keluar.

1. Anda menggunakan `node.findChild()` metode untuk menemukan `LaunchConfig` anak spesifik dari `AutoScalingGroup` konstruksi L2 dan melemparkannya sebagai sumber daya. `CfnLaunchConfiguration`

1. Anda sekarang dapat mengatur `launchConfig.metadataOptions` properti pada L1`CfnLaunchConfiguration`.

## Sumber daya khusus
<a name="custom-resource"></a>

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](https://github.com/awslabs/aws-cdk/tree/master/packages/%40aws-cdk/custom-resources)konstruksinya. 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](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html) dalam CloudFormation dokumentasi. Untuk contoh cara menggunakan sumber daya kustom, lihat repositori [Sumber Daya Kustom](https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript/custom-resource/) 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();
```