

Ini adalah Panduan Pengembang AWS CDK v2. CDK v1 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.

# Memecahkan masalah CDK yang umum AWS
<a name="troubleshooting"></a>

Topik ini menjelaskan cara memecahkan masalah berikut dengan CDK. AWS 
+  [Setelah memperbarui CDK, AWSAWS CDK Toolkit (CLI) melaporkan ketidakcocokan dengan Construct Library AWS](#troubleshooting-toolkit) 
+  [Saat menerapkan tumpukan AWS CDK saya, saya menerima kesalahan NoSuchBucket ](#troubleshooting-nobucket) 
+  [Saat menerapkan tumpukan AWS CDK saya, saya menerima pesan terlarang: null](#troubleshooting-forbidden-null) 
+  [Saat mensintesis tumpukan AWS CDK, saya mendapatkan pesan --app diperlukan baik di baris perintah di cdk.json atau di \~/.cdk.json](#troubleshooting-app-required) 
+  [Saat mensintesis tumpukan AWS CDK saya menerima kesalahan karena AWS CloudFormation template berisi terlalu banyak sumber daya](#troubleshooting-resource-count) 
+  [Saya menentukan tiga (atau lebih) Availability Zone untuk grup Auto Scaling atau VPC saya tetapi hanya diterapkan dalam dua](#troubleshooting-availability-zones) 
+  [Tabel DynamoDB bucket S3 saya atau sumber daya lain tidak dihapus saat saya mengeluarkan cdk destroy](#troubleshooting-resource-not-deleted) 

## Setelah memperbarui AWS CDK, AWS CDK Toolkit (CLI) melaporkan ketidakcocokan dengan Construct Library AWS
<a name="troubleshooting-toolkit"></a>

Versi AWS CDK Toolkit (yang menyediakan `cdk` perintah) harus setidaknya sama dengan versi modul AWS Construct Library utama,. `aws-cdk-lib` Toolkit dimaksudkan agar kompatibel ke belakang. Versi 2.x terbaru dari toolkit dapat digunakan dengan rilis pustaka 1.x atau 2.x apa pun. Untuk alasan ini, kami sarankan Anda menginstal komponen ini secara global dan tetap up to date.

```
npm update -g aws-cdk
```

Jika Anda perlu bekerja dengan beberapa versi AWS CDK Toolkit, instal versi toolkit tertentu secara lokal di folder proyek Anda.

Jika Anda menggunakan TypeScript atau JavaScript, direktori proyek Anda sudah berisi salinan lokal berversi CDK Toolkit.

Jika Anda menggunakan bahasa lain, gunakan `npm` untuk menginstal AWS CDK Toolkit, menghilangkan `-g` bendera dan menentukan versi yang diinginkan. Misalnya:

```
npm install aws-cdk@2.0
```

Untuk menjalankan AWS CDK Toolkit yang diinstal secara lokal, gunakan perintah `npx aws-cdk` bukan hanya. `cdk` Misalnya:

```
npx aws-cdk deploy MyStack
```

 `npx aws-cdk`menjalankan versi lokal AWS CDK Toolkit jika ada. Ini kembali ke versi global ketika sebuah proyek tidak memiliki instalasi lokal. Anda mungkin merasa nyaman untuk mengatur alias shell untuk memastikan selalu `cdk` dipanggil dengan cara ini.

**Example**  

```
alias cdk="npx aws-cdk"
```

```
doskey cdk=npx aws-cdk $*
```

## Saat menerapkan tumpukan AWS CDK saya, saya menerima kesalahan `NoSuchBucket`
<a name="troubleshooting-nobucket"></a>

 AWS Lingkungan Anda belum di-bootstrap, sehingga tidak memiliki bucket Amazon S3 untuk menyimpan sumber daya selama penerapan. Anda dapat membuat bucket pementasan dan sumber daya lain yang diperlukan dengan perintah berikut:

```
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
```

Untuk menghindari menghasilkan AWS muatan yang tidak terduga, AWS CDK tidak secara otomatis mem-bootstrap lingkungan apa pun. Anda harus secara eksplisit mem-bootstrap setiap lingkungan yang akan Anda gunakan.

Secara default, sumber daya bootstrap dibuat di Wilayah atau Wilayah yang digunakan oleh tumpukan dalam aplikasi AWS CDK saat ini. Atau, mereka dibuat di Wilayah yang ditentukan dalam AWS profil lokal Anda (ditetapkan oleh`aws configure`), menggunakan akun profil itu. Anda dapat menentukan akun dan Wilayah yang berbeda pada baris perintah sebagai berikut. (Anda harus menentukan akun dan Wilayah jika Anda tidak berada di direktori aplikasi.)

```
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
```

Untuk informasi selengkapnya, lihat [AWS Bootstrapping CDK](bootstrapping.md).

## Saat menerapkan tumpukan AWS CDK saya, saya menerima pesan `forbidden: null`
<a name="troubleshooting-forbidden-null"></a>

Anda menerapkan tumpukan yang membutuhkan sumber daya bootstrap, tetapi menggunakan peran IAM atau akun yang tidak memiliki izin untuk menulis ke sana. (Bucket staging digunakan saat menerapkan tumpukan yang berisi aset atau yang mensintesis AWS CloudFormation templat yang lebih besar dari 50K.) Gunakan akun atau peran yang memiliki izin untuk melakukan tindakan `s3:*` terhadap bucket yang disebutkan dalam pesan kesalahan.

## Saat mensintesis tumpukan AWS CDK, saya mendapatkan pesannya `--app is required either in command-line, in cdk.json or in ~/.cdk.json`
<a name="troubleshooting-app-required"></a>

Pesan ini biasanya berarti bahwa Anda tidak berada di direktori utama proyek AWS CDK Anda saat Anda mengeluarkan`cdk synth`. File `cdk.json` dalam direktori ini, dibuat oleh `cdk init` perintah, berisi baris perintah yang diperlukan untuk menjalankan (dan dengan demikian mensintesis) aplikasi AWS CDK Anda. Untuk TypeScript aplikasi, misalnya, `cdk.json` defaultnya terlihat seperti ini:

```
{
  "app": "npx ts-node bin/my-cdk-app.ts"
}
```

Sebaiknya Anda mengeluarkan `cdk` perintah hanya di direktori utama project Anda, sehingga toolkit AWS CDK dapat menemukannya di `cdk.json` sana dan berhasil menjalankan aplikasi Anda.

Jika ini tidak praktis karena alasan tertentu, AWS CDK Toolkit mencari baris perintah aplikasi di dua lokasi lain:
+ `cdk.json`Di direktori home Anda
+ Pada `cdk synth` perintah itu sendiri menggunakan `-a` opsi

Misalnya, Anda mungkin mensintesis tumpukan dari TypeScript aplikasi sebagai berikut.

```
cdk synth --app "npx ts-node my-cdk-app.ts" MyStack
```

## Saat mensintesis tumpukan AWS CDK, saya menerima kesalahan karena AWS CloudFormation template berisi terlalu banyak sumber daya
<a name="troubleshooting-resource-count"></a>

 AWS CDK menghasilkan dan menyebarkan template AWS CloudFormation . AWS CloudFormation memiliki batas keras pada jumlah sumber daya yang dapat dikandung oleh tumpukan. Dengan AWS CDK, Anda dapat berlari melawan batas ini lebih cepat dari yang Anda harapkan.

**catatan**  
Batas AWS CloudFormation sumber daya adalah 500 pada tulisan ini. Lihat [AWS CloudFormation kuota](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html) untuk batas sumber daya saat ini.

 AWS Konstruksi berbasis niat tingkat tinggi Perpustakaan Konstruksi secara otomatis menyediakan sumber daya tambahan apa pun yang diperlukan untuk pencatatan, manajemen kunci, otorisasi, dan tujuan lainnya. Misalnya, memberikan satu akses sumber daya ke sumber daya lain menghasilkan objek IAM apa pun yang diperlukan untuk layanan yang relevan untuk berkomunikasi.

Dalam pengalaman kami, penggunaan konstruksi berbasis niat di dunia nyata menghasilkan 1-5 AWS CloudFormation sumber daya per konstruksi, meskipun ini dapat bervariasi. Untuk aplikasi tanpa server, 5—8 AWS sumber daya per titik akhir API adalah tipikal.

Pola, yang mewakili tingkat abstraksi yang lebih tinggi, memungkinkan Anda mendefinisikan lebih banyak AWS sumber daya dengan kode yang lebih sedikit. Kode AWS CDK dalam [Contoh: Buat layanan AWS Fargate menggunakan AWS](ecs-example.md) CDK, misalnya, menghasilkan lebih dari AWS CloudFormation 50 sumber daya sambil mendefinisikan hanya tiga konstruksi\!

Melebihi batas AWS CloudFormation sumber daya adalah kesalahan selama AWS CloudFormation sintesis. AWS CDK mengeluarkan peringatan jika tumpukan Anda melebihi 80% dari batas. Anda dapat menggunakan batas yang berbeda dengan menyetel `maxResources` properti di tumpukan Anda, atau menonaktifkan validasi dengan menyetel `maxResources` ke 0.

**Tip**  
Anda bisa mendapatkan jumlah yang tepat dari sumber daya dalam output yang disintesis menggunakan skrip utilitas berikut. (Karena setiap pengembang AWS CDK membutuhkan Node.js, skrip ditulis dalam JavaScript.)  

```
// rescount.js - count the resources defined in a stack
// invoke with: node rescount.js <path-to-stack-json>
// e.g. node rescount.js cdk.out/MyStack.template.json

import * as fs from 'fs';
const path = process.argv[2];

if (path) fs.readFile(path, 'utf8', function(err, contents) {
  console.log(err ? `${err}` :
  `${Object.keys(JSON.parse(contents).Resources).length} resources defined in ${path}`);
}); else console.log("Please specify the path to the stack's output .json file");
```

Saat jumlah sumber daya tumpukan Anda mendekati batas, pertimbangkan untuk merancang ulang untuk mengurangi jumlah sumber daya yang terkandung dalam tumpukan Anda: misalnya, dengan menggabungkan beberapa fungsi Lambda, atau dengan memecah tumpukan Anda menjadi beberapa tumpukan. CDK mendukung [referensi antar tumpukan](resources.md#resource-stack), sehingga Anda dapat memisahkan fungsionalitas aplikasi menjadi tumpukan yang berbeda dengan cara apa pun yang paling masuk akal bagi Anda.

**catatan**  
 AWS CloudFormation para ahli sering menyarankan penggunaan tumpukan bersarang sebagai solusi untuk batas sumber daya. AWS CDK mendukung pendekatan ini melalui [NestedStack](stacks.md#stack-nesting)konstruksi.

## Saya menentukan tiga (atau lebih) Availability Zone untuk grup Auto Scaling atau VPC saya, tetapi hanya diterapkan dalam dua
<a name="troubleshooting-availability-zones"></a>

Untuk mendapatkan jumlah Availability Zone yang Anda minta, tentukan akun dan Region di `env` properti stack. Jika Anda tidak menentukan keduanya, AWS CDK, secara default, mensintesis tumpukan sebagai agnostik lingkungan. Anda kemudian dapat menerapkan tumpukan ke Wilayah tertentu menggunakan AWS CloudFormation. Karena beberapa Wilayah hanya memiliki dua Availability Zone, template agnostik lingkungan tidak menggunakan lebih dari dua.

**catatan**  
Di masa lalu, Wilayah sesekali diluncurkan dengan hanya satu Availability Zone. Tumpukan AWS CDK agnostik lingkungan tidak dapat digunakan ke Wilayah tersebut. Namun, pada tulisan ini, semua AWS Wilayah memiliki setidaknya dua AZs.

Anda dapat mengubah perilaku ini dengan mengganti properti [availabilityZones (Python`availability_zones`:) stack Anda untuk secara eksplisit menentukan zona](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.Stack.html#availabilityzones) yang ingin Anda gunakan.

Untuk informasi selengkapnya tentang menentukan akun dan wilayah tumpukan pada waktu sintesis, sambil mempertahankan fleksibilitas untuk menerapkan ke wilayah mana pun, lihat [Lingkungan untuk](environments.md) CDK. AWS 

## Bucket S3 saya, tabel DynamoDB, atau sumber daya lainnya tidak dihapus saat saya mengeluarkan `cdk destroy`
<a name="troubleshooting-resource-not-deleted"></a>

Secara default, sumber daya yang dapat berisi data pengguna memiliki properti `removalPolicy` (Python:`removal_policy`)`RETAIN`, dan sumber daya tidak dihapus ketika tumpukan dihancurkan. Sebaliknya, sumber daya menjadi yatim piatu dari tumpukan. Anda kemudian harus menghapus sumber daya secara manual setelah tumpukan dihancurkan. Sampai Anda melakukannya, penempatan kembali tumpukan gagal. Ini karena nama sumber daya baru yang dibuat selama penyebaran bertentangan dengan nama sumber daya yatim piatu.

Jika Anda menyetel kebijakan penghapusan sumber daya ke`DESTROY`, sumber daya tersebut akan dihapus saat tumpukan dihancurkan.

**Example**  

```
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

export class CdkTestStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const bucket = new s3.Bucket(this, 'Bucket', {
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });
  }
}
```

```
const cdk = require('aws-cdk-lib');
const s3 = require('aws-cdk-lib/aws-s3');

class CdkTestStack extends cdk.Stack {
  constructor(scope, id, props) {
    super(scope, id, props);

    const bucket = new s3.Bucket(this, 'Bucket', {
      removalPolicy: cdk.RemovalPolicy.DESTROY
    });
  }
}

module.exports = { CdkTestStack }
```

```
import aws_cdk as cdk
from constructs import Construct
import aws_cdk.aws_s3 as s3

class CdkTestStack(cdk.stack):
    def __init__(self, scope: Construct, id: str, **kwargs):
        super().__init__(scope, id, **kwargs)

        bucket = s3.Bucket(self, "Bucket",
            removal_policy=cdk.RemovalPolicy.DESTROY)
```

```
software.amazon.awscdk.*;
import software.amazon.awscdk.services.s3.*;
import software.constructs;

public class CdkTestStack extends Stack {
    public CdkTestStack(final Construct scope, final String id) {
        this(scope, id, null);
    }

    public CdkTestStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);

        Bucket.Builder.create(this, "Bucket")
                .removalPolicy(RemovalPolicy.DESTROY).build();
    }
}
```

```
using Amazon.CDK;
using Amazon.CDK.AWS.S3;

public CdkTestStack(Construct scope, string id, IStackProps props) : base(scope, id, props)
{
    new Bucket(this, "Bucket", new BucketProps {
        RemovalPolicy = RemovalPolicy.DESTROY
    });
}
```

**catatan**  
 AWS CloudFormation tidak dapat menghapus bucket Amazon S3 yang tidak kosong. Jika Anda menyetel kebijakan penghapusan bucket Amazon S3 ke`DESTROY`, dan berisi data, upaya menghancurkan tumpukan akan gagal karena bucket tidak dapat dihapus. Anda dapat meminta AWS CDK menghapus objek di ember sebelum mencoba menghancurkannya dengan menyetel `autoDeleteObjects` prop bucket ke. `true`