Buat CI/CD pipeline untuk memvalidasi konfigurasi Terraform dengan menggunakan AWS CodePipeline - AWS Prescriptive Guidance

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

Buat CI/CD pipeline untuk memvalidasi konfigurasi Terraform dengan menggunakan AWS CodePipeline

Aromal Raj Jayarajan dan Vijesh Vijayakumaran Nair, Amazon Web Services

Ringkasan

Pemberitahuan: AWS CodeCommit tidak lagi tersedia untuk pelanggan baru. Pelanggan yang sudah ada AWS CodeCommit dapat terus menggunakan layanan seperti biasa. Pelajari selengkapnya

Pola ini menunjukkan cara menguji konfigurasi HashiCorp Terraform dengan menggunakan pipeline integrasi berkelanjutan dan pengiriman berkelanjutan (CI/CD) yang digunakan oleh AWS. CodePipeline

Terraform adalah aplikasi antarmuka baris perintah yang membantu Anda menggunakan kode untuk menyediakan dan mengelola infrastruktur dan sumber daya cloud. Solusi yang disediakan dalam pola ini membuat CI/CD pipeline yang membantu Anda memvalidasi integritas konfigurasi Terraform Anda dengan menjalankan lima tahap: CodePipeline

  1. "checkout"menarik konfigurasi Terraform yang Anda uji dari repositori AWS. CodeCommit

  2. "validate"menjalankan infrastruktur sebagai alat validasi kode (IAc), termasuk tfsec,, dan checkov. TFLint Tahap ini juga menjalankan perintah validasi Terraform IAc berikut: dan. terraform validate terraform fmt

  3. "plan"menunjukkan perubahan apa yang akan diterapkan pada infrastruktur jika konfigurasi Terraform diterapkan.

  4. "apply"menggunakan rencana yang dihasilkan untuk menyediakan infrastruktur yang diperlukan di lingkungan pengujian.

  5. "destroy"menghapus infrastruktur pengujian yang dibuat selama "apply" tahap.

Prasyarat dan batasan

Prasyarat

Batasan

  • Pendekatan pola ini menerapkan AWS CodePipeline ke dalam satu akun AWS dan Wilayah AWS saja. Perubahan konfigurasi diperlukan untuk penerapan multi-akun dan Multi-wilayah.

  • Peran AWS Identity and Access Management (IAM) yang diberikan pola ini (codepipeline_iam_role) mengikuti prinsip hak istimewa terkecil. Izin peran IAM ini harus diperbarui berdasarkan sumber daya spesifik yang perlu dibuat pipeline Anda.

Versi produk

  • AWS CLI versi 2.9.15 atau yang lebih baru

  • Terraform versi 1.3.7 atau yang lebih baru

Arsitektur

Tumpukan teknologi target

  • AWS CodePipeline

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS IAM

  • Amazon Simple Storage Service (Amazon S3)

  • AWS Key Management Service (AWS KMS)

  • Terraform

Arsitektur target

Diagram berikut menunjukkan contoh alur kerja CI/CD pipeline untuk menguji konfigurasi Terraform di. CodePipeline

Arsitektur untuk menguji konfigurasi Terraform dengan menggunakan pipeline AWS. CI/CD

Diagram menunjukkan alur kerja berikut:

  1. Di CodePipeline, pengguna AWS memulai tindakan yang diusulkan dalam paket Terraform dengan menjalankan terraform apply perintah di AWS CLI.

  2. AWS CodePipeline mengasumsikan peran layanan IAM yang mencakup kebijakan yang diperlukan untuk mengakses CodeCommit, AWS KMS CodeBuild, dan Amazon S3.

  3. CodePipeline menjalankan tahap "checkout" pipeline untuk menarik konfigurasi Terraform dari CodeCommit repositori AWS untuk pengujian.

  4. CodePipeline menjalankan "validate" tahapan untuk menguji konfigurasi Terraform dengan menjalankan alat validasi IAc dan menjalankan perintah validasi Terraform IAc dalam sebuah proyek. CodeBuild

  5. CodePipeline menjalankan "plan" panggung untuk membuat rencana dalam CodeBuild proyek berdasarkan konfigurasi Terraform. Pengguna AWS dapat meninjau paket ini sebelum perubahan diterapkan ke lingkungan pengujian.

  6. Code Pipeline menjalankan "apply" tahapan untuk mengimplementasikan rencana dengan menggunakan CodeBuild proyek untuk menyediakan infrastruktur yang diperlukan di lingkungan pengujian.

  7. CodePipeline menjalankan "destroy" panggung, yang digunakan CodeBuild untuk menghapus infrastruktur pengujian yang dibuat selama "apply" tahap.

  8. Bucket Amazon S3 menyimpan artefak pipeline, yang dienkripsi dan didekripsi dengan menggunakan kunci yang dikelola pelanggan AWS KMS.

Alat

Alat

Layanan AWS

  • AWS CodePipeline membantu Anda memodelkan dan mengonfigurasi berbagai tahapan rilis perangkat lunak dengan cepat dan mengotomatiskan langkah-langkah yang diperlukan untuk merilis perubahan perangkat lunak secara terus menerus.

  • AWS CodeBuild adalah layanan build terkelola penuh yang membantu Anda mengkompilasi kode sumber, menjalankan pengujian unit, dan menghasilkan artefak yang siap digunakan.

  • AWS CodeCommit adalah layanan kontrol versi yang membantu Anda menyimpan dan mengelola repositori Git secara pribadi, tanpa perlu mengelola sistem kontrol sumber Anda sendiri.

  • AWS Identity and Access Management (IAM) membantu Anda mengelola akses ke sumber daya AWS dengan aman dengan mengontrol siapa yang diautentikasi dan diberi wewenang untuk menggunakannya.

  • AWS Key Management Service (AWS KMS) membantu Anda membuat dan mengontrol kunci kriptografi untuk membantu melindungi data Anda.

  • Amazon Simple Storage Service (Amazon S3) adalah layanan penyimpanan objek berbasis cloud yang membantu Anda menyimpan, melindungi, dan mengambil sejumlah data.

Layanan lainnya

  • HashiCorp Terraform adalah aplikasi antarmuka baris perintah yang membantu Anda menggunakan kode untuk menyediakan dan mengelola infrastruktur dan sumber daya cloud.

Kode

Kode untuk pola ini tersedia di GitHub aws-codepipeline-terraform-cicdsamplesrepositori. Repositori berisi konfigurasi Terraform yang diperlukan untuk membuat arsitektur target yang diuraikan dalam pola ini.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Kloning GitHub repositori.

Kloning GitHub aws-codepipeline-terraform-cicdsamplesrepositori dengan menjalankan perintah berikut di jendela terminal:

git clone https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples.git

Untuk informasi selengkapnya, lihat Mengkloning repositori dalam dokumentasi. GitHub

DevOps insinyur

Buat file definisi variabel Terraform.

Buat terraform.tfvars file berdasarkan persyaratan kasus penggunaan Anda. Anda dapat memperbarui variabel dalam examples/terraform.tfvars file yang ada di repositori kloning.

Untuk informasi selengkapnya, lihat Menetapkan nilai ke variabel modul root dalam dokumentasi Terraform.

catatan

Readme.mdFile repositori mencakup informasi lebih lanjut tentang variabel yang diperlukan.

DevOps insinyur

Konfigurasikan AWS sebagai penyedia Terraform.

  1. Dalam editor kode, buka file repositori kloning. main.tf

  2. Tambahkan konfigurasi yang diperlukan untuk membangun konektivitas ke akun AWS target.

Untuk informasi selengkapnya, lihat penyedia AWS di dokumentasi Terraform.

DevOps insinyur

Perbarui konfigurasi penyedia Terraform untuk membuat bucket replikasi Amazon S3.

  1. Buka S3 direktori repositori dengan menjalankan perintah berikut:

    cd ./modules/s3
  2. Perbarui konfigurasi penyedia Terraform untuk membuat bucket replikasi Amazon S3 dengan memperbarui nilai region dalam file. tf Pastikan Anda memasukkan Wilayah yang Anda inginkan Amazon S3 untuk mereplikasi objek.

  3. (Opsional) Secara default, Terraform menggunakan file status lokal untuk manajemen negara. Jika Anda ingin menambahkan Amazon S3 sebagai backend jarak jauh, Anda harus memperbarui konfigurasi Terraform. Untuk informasi selengkapnya, lihat Konfigurasi backend di dokumentasi Terraform.

catatan

Replikasi mengaktifkan penyalinan objek otomatis dan asinkron di seluruh bucket Amazon S3.

DevOps insinyur

Inisialisasi konfigurasi Terraform.

Untuk menginisialisasi direktori kerja Anda yang berisi file konfigurasi Terraform, jalankan perintah berikut di folder root repositori kloning:

terraform init
DevOps insinyur

Buat paket Terraform.

Untuk membuat paket Terraform, jalankan perintah berikut di folder root repositori kloning:

terraform plan --var-file=terraform.tfvars -out=tfplan
catatan

Terraform mengevaluasi file konfigurasi untuk menentukan status target untuk sumber daya yang dideklarasikan. Kemudian membandingkan status target dengan keadaan saat ini dan membuat rencana.

DevOps insinyur

Verifikasi paket Terraform.

Tinjau paket Terraform dan konfirmasikan bahwa paket tersebut mengonfigurasi arsitektur yang diperlukan di akun AWS target Anda.

DevOps insinyur

Menyebarkan solusinya.

  1. Untuk menerapkan paket Terraform, jalankan perintah berikut di folder root repositori kloning:

    terraform apply "tfplan"
  2. Masukkan ya untuk mengonfirmasi bahwa Anda ingin menyebarkan sumber daya.

catatan

Terraform membuat, memperbarui, atau menghancurkan infrastruktur untuk mencapai status target yang dinyatakan dalam file konfigurasi.

DevOps insinyur
TugasDeskripsiKeterampilan yang dibutuhkan

Siapkan repositori kode sumber.

  1. Dari keluaran Terraform, dapatkan detail repositori sumber untuk repositori yang berisi konfigurasi Terraform yang ingin Anda validasi.

  2. Masuk ke AWS Management Console. Kemudian, buka CodeCommit konsol.

  3. Buat cabang baru di repositori sumber bernama. main Untuk petunjuk, lihat Membuat cabang di AWS CodeCommit dalam CodeCommit dokumentasi.

  4. mainKloning cabang repositori sumber ke workstation lokal Anda. Untuk petunjuknya, lihat Langkah penyiapan untuk koneksi HTTPS ke CodeCommit repositori AWS di Windows dengan pembantu kredensyal AWS CLI dalam dokumentasi. CodeCommit

  5. Salin templatesfolder dari GitHub aws-codepipeline-terraform-cicdsamplesrepositori dengan menjalankan perintah berikut:

    cp -r templates $YOUR_CODECOMMIT_REPO_ROOT
    catatan

    templatesFolder berisi file spesifikasi build dan skrip validasi untuk direktori root repositori sumber.

  6. Tambahkan konfigurasi Terraform IAc yang diperlukan ke folder root repositori sumber.

  7. Tambahkan detail untuk backend jarak jauh dalam konfigurasi Terraform proyek Anda. Untuk informasi lebih lanjut, lihat S3 di dokumentasi Terraform.

  8. (Opsional) Perbarui variabel dalam templates folder untuk mengaktifkan atau menonaktifkan pemindaian yang telah dikonfigurasi sebelumnya, versi perubahan alat, dan untuk menentukan direktori Anda dalam file skrip khusus. Untuk informasi selengkapnya, lihat bagian Informasi tambahan dari pola ini.

  9. Dorong perubahan ke main cabang repositori sumber.

DevOps insinyur

Validasi tahapan pipa.

  1. Masuk ke AWS Management Console dan buka CodePipeline konsol.

  2. Pada output yang dihasilkan dari terraform apply "tfplan" perintah di bagian Epic sebelumnya, temukan nama yang dihasilkan CodePipeline.

  3. Buka pipeline di CodePipeline konsol dan pilih Rilis perubahan.

  4. Tinjau setiap tahap pipa dan konfirmasikan itu berfungsi seperti yang diharapkan.

Untuk informasi selengkapnya, lihat Melihat detail pipeline dan histori (konsol) di Panduan CodePipeline Pengguna AWS.

penting

Ketika perubahan dilakukan ke cabang utama repositori sumber, pipa uji diaktifkan secara otomatis.

DevOps insinyur

Verifikasi keluaran laporan.

  1. Di CodePipeline konsol, di panel navigasi kiri, pilih Build. Kemudian, pilih Laporkan riwayat.

  2. Tinjau laporan pemindaian tfsec dan checkov yang dihasilkan oleh pipeline. Laporan ini dapat membantu Anda mengidentifikasi masalah melalui visualisasi dan representasi grafis.

catatan

<project_name>-validate CodeBuild Proyek ini menghasilkan laporan kerentanan untuk kode Anda selama "validate" tahap.

DevOps insinyur
TugasDeskripsiKeterampilan yang dibutuhkan

Bersihkan pipa dan sumber daya terkait.

Untuk menghapus sumber daya pengujian dari akun AWS Anda, jalankan perintah berikut di folder root repositori kloning:

terraform destroy --var-file=terraform.tfvars
DevOps insinyur

Pemecahan Masalah

IsuSolusi

Anda menerima AccessDenied kesalahan selama "apply" tahap.

  1. Tinjau log eksekusi CodeBuild proyek yang terkait dengan "apply" tahapan untuk mengidentifikasi izin IAM yang hilang. Untuk informasi selengkapnya, lihat Melihat detail build di AWS CodeBuild di Panduan CodeBuild Pengguna AWS.

  2. Dalam editor kode, buka folder repositori kloning. modules Kemudian, navigasikan ke iam-role folder dan buka main.tf file yang ada di folder itu.

  3. Dalam codepipeline_policy pernyataan tersebut, tambahkan kebijakan IAM yang diperlukan untuk menyediakan sumber daya di akun AWS Anda.

Sumber daya terkait

Informasi tambahan

Modul Terraform kustom

Berikut ini adalah daftar modul Terraform kustom yang digunakan dalam pola ini:

  • codebuild_terraformmenciptakan CodeBuild proyek yang membentuk setiap tahap pipa.

  • codecommit_infrastructure_source_repomenangkap dan membuat CodeCommit repositori sumber.

  • codepipeline_iam_rolemembuat peran IAM yang diperlukan untuk pipa.

  • codepipeline_kmsmembuat kunci AWS KMS yang diperlukan untuk enkripsi dan dekripsi objek Amazon S3.

  • codepipeline_terraformmembuat pipa uji untuk CodeCommit repositori sumber.

  • s3_artifacts_bucketmembuat bucket Amazon S3 untuk mengelola artefak pipeline.

Membangun file spesifikasi

Berikut ini adalah daftar file spesifikasi build (buildspec) yang digunakan pola ini untuk menjalankan setiap tahap pipeline:

  • buildspec_validate.ymlmenjalankan "validate" panggung.

  • buildspec_plan.ymlmenjalankan "plan" panggung.

  • buildspec_apply.ymlmenjalankan "apply" panggung.

  • buildspec_destroy.ymlmenjalankan "destroy" panggung.

Membangun variabel file spesifikasi

Setiap file buildspec menggunakan variabel berikut untuk mengaktifkan pengaturan khusus build yang berbeda:

Variabel

Nilai default

Deskripsi

CODE_SRC_DIR

"."

Mendefinisikan direktori sumber CodeCommit

TF_VERSION

“1.3.7"

Mendefinisikan versi Terraform untuk lingkungan build

buildspec_validate.ymlFile ini juga mendukung variabel berikut untuk mengaktifkan pengaturan khusus build yang berbeda:

Variabel

Nilai default

Deskripsi

SCRIPT_DIR

“. /template/skrip”

Mendefinisikan direktori skrip

ENVIRONMENT

“pengembang”

Mendefinisikan nama lingkungan

SKIPVALIDATIONFAILURE

“Y”

Melewatkan validasi pada kegagalan

ENABLE_TFVALIDATE

“Y”

Mengaktifkan validasi Terraform 

ENABLE_TFFORMAT

“Y”

Mengaktifkan format Terraform

ENABLE_TFCHECKOV

“Y”

Mengaktifkan pemindaian checkov

ENABLE_TFSEC

“Y”

Mengaktifkan pemindaian tfsec

TFSEC_VERSION

“v1.28.1"

Mendefinisikan versi tfsec