amazon web services - CDK membuat sumber daya jika belum ada - typescript


Membuat tabel DynamoDB di proyek CDK saya. Ini baik, tabel ini digunakan oleh Lambda yang dibuat di proyek. Kami perlu menghapus stack yang juga baik karena kami memiliki pengaturan retain resource diatur ke true pada tabel.

Sekarang ketika saya mencoba deploy baru, kami mendapatkan error 'tabel sudah ada' dan stack kembali. Saya membutuhkan kode yang akan membuat tabel hanya jika tabel tersebut belum ada.

Berikut adalah pembuatan dasar dari sebuah tabel, saya tidak dapat menemukan dokumentasi apapun tentang masalah ini atau bahkan sebuah pengecualian yang dapat ditangkap atau di mana saya dapat melihat jenis pengecualian yang dilempar untuk ditangkap karena kami hanya melihat log di konsol CloudFormation pada konsol AWS.

 const dynamoTable = new Table(this, "my-table", {
      tableName: StackConfiguration.tableName,
      partitionKey: { name: "id", type: AttributeType.STRING },
    });

Jawaban #1

Sayangnya Anda tidak bisa melakukan itu di CDK, karena CDK menghasilkan template CloudFormation pada waktu kompilasi, bukan pada waktu runtime. Saya melihat beberapa opsi di sini:

  1. Gunakan Impor Sumber Daya CloudFormation untuk mengimpor tabel yang ada ke dalam stack Anda
  2. Gunakan lambda sumber daya kustom untuk melakukan panggilan API AWS untuk memeriksa apakah tabel ada. Gunakan output sumber daya kustom dalam Fn.conditionEquals di kode CDK untuk membuat tabel secara kondisional

Saya akan merekomendasikan memilih opsi pertama jika ini adalah hal yang perlu Anda lakukan sekali saja, dan opsi kedua jika Anda memperkirakan ini akan terjadi secara teratur.

Jawaban #2

Per September 2023, CDK memungkinkan Anda untuk mengimpor sumber daya yang sudah ada. Saya berhasil mengikuti langkah-langkah ini untuk menggunakan CDK untuk mengimpor DynamoDB saya yang sudah ada. Namun, ketika saya menjalankan perintah cdk import, muncul keluhan bahwa fungsi Lambda saya telah berubah, meskipun perintah cdk diff melaporkan tidak ada perubahan. Saya harus menambahkan opsi --force pada perintah import tersebut.

Catatan: Ini tidak memungkinkan saya melakukan apa yang awalnya ingin dilakukan oleh @AnonymousAlias, yaitu membuat sumber daya jika diperlukan, dan melewatinya jika tidak. Saya pikir untuk melakukan itu, Anda harus mengikuti saran @Tofig Hasanov, dan memeriksa apakah sumber daya itu ada terlebih dahulu, dan membuatnya hanya jika tidak ada.

Dari https://docs.aws.amazon.com/cdk/v2/guide/cli.html#cli-import:

Mengimpor sumber daya yang sudah ada ke dalam tumpukan

Anda dapat menggunakan perintah cdk import untuk membawa sumber daya di bawah manajemen CloudFormation untuk stack AWS CDK tertentu. Ini berguna jika Anda sedang bermigrasi ke AWS CDK, atau memindahkan sumber daya antar stack atau mengubah id logis mereka. cdk import menggunakan impor sumber daya CloudFormation. Lihat daftar sumber daya yang dapat diimpor di sini.

Untuk mengimpor sumber daya yang sudah ada ke dalam stack AWS CDK, ikuti langkah-langkah berikut:

  • Pastikan sumber daya tersebut saat ini tidak sedang dikelola oleh stack CloudFormation lain. Jika iya, pertama atur kebijakan penghapusan ke RemovalPolicy.RETAIN di stack tempat sumber daya tersebut berada saat ini dan lakukan penerapan. Kemudian, hapus sumber daya dari stack dan lakukan penerapan lain. Proses ini akan memastikan bahwa sumber daya tidak lagi dikelola oleh CloudFormation tetapi tidak menghapusnya.

  • Jalankan cdk diff untuk memastikan tidak ada perubahan yang tertunda pada tumpukan AWS CDK yang ingin Anda impor sumber dayanya. Satu-satunya perubahan yang diizinkan dalam operasi "impor" adalah penambahan sumber daya baru yang ingin Anda impor.

  • Tambahkan konstruk untuk sumber daya yang ingin Anda impor ke stack Anda. Misalnya, jika Anda ingin mengimpor bucket Amazon S3, tambahkan sesuatu seperti new s3.Bucket(this, 'ImportedS3Bucket', {});. Jangan melakukan modifikasi pada sumber daya lain.

    Anda juga harus memastikan untuk secara tepat memodelkan keadaan yang saat ini dimiliki sumber daya ke dalam definisi. Untuk contoh bucket, pastikan untuk menyertakan kunci AWS KMS, kebijakan siklus hidup, dan hal lain yang relevan tentang bucket. Jika tidak, operasi pembaruan berikutnya mungkin tidak akan melakukan apa yang Anda harapkan.

    Anda dapat memilih apakah akan menyertakan nama bucket fisik atau tidak. Kami biasanya menyarankan untuk tidak menyertakan nama sumber daya ke dalam definisi sumber daya AWS CDK Anda agar menjadi lebih mudah untuk menyebarkan sumber daya Anda berkali-kali.

  • Jalankan cdk import STACKNAME.

  • Jika nama sumber daya tidak ada dalam model Anda, CLI akan meminta Anda untuk memasukkan nama sebenarnya dari sumber daya yang sedang Anda impor. Setelah ini, proses impor dimulai.

  • Ketika impor CDK melaporkan keberhasilan, sumber daya sekarang dikelola oleh AWS CDK dan CloudFormation. Setiap perubahan berikutnya yang Anda buat pada properti sumber daya di aplikasi AWS CDK Anda, konfigurasi konstruksi akan diterapkan pada penyebaran berikutnya.

  • Untuk memastikan bahwa definisi sumber daya di aplikasi AWS CDK Anda sesuai dengan kondisi saat ini dari sumber daya tersebut, Anda dapat memulai operasi deteksi drift CloudFormation.

Fitur ini saat ini tidak mendukung impor sumber daya ke dalam tumpukan bersarang.

Artikel terkait