全部产品
Search
文档中心

Terraform:Perjalanan Pony.ai Menuju 100% Otomatisasi Infrastruktur dengan Terraform

更新时间:Oct 15, 2025

Artikel ini, dirangkum oleh tim DevOps Pony.ai, menjelaskan strategi, pengambilan keputusan, dan proses implementasi dalam menggunakan Terraform untuk sepenuhnya mengotomatiskan infrastruktur cloud mereka.

Latar Belakang

Didirikan pada tahun 2016, Pony.ai adalah perusahaan teknologi kendaraan otonom global dengan pusat R&D di Silicon Valley, Guangzhou, Beijing, Shanghai, dan Shenzhen. Perusahaan ini telah memperoleh izin uji coba dan operasi mengemudi otonom di berbagai lokasi di AS dan Tiongkok serta bekerja sama dengan produsen mobil terkemuka seperti Toyota, Hyundai, FAW Group, dan GAC Group. Operasi Tiongkok Pony.ai sangat bergantung pada Alibaba Cloud untuk menampung layanan bisnis kritis, termasuk pelabelan data, platform Robotaxi, dan Robotruck. Layanan ini memanfaatkan berbagai produk cloud seperti Elastic Compute Service (ECS), ApsaraDB RDS (RDS), Server Load Balancer (SLB), Bastionhost, dan Security Center. Kompleksitas dalam mengelola komponen-komponen ini menjadi tantangan besar bagi tim DevOps. Untuk mengatasinya, tim menetapkan tiga tujuan inti:

  1. Penerapan yang dapat ditinjau: Memastikan setiap tahap aktivitas operasional—dari pengumpulan persyaratan dan desain arsitektur hingga pengkodean dan penerapan—tepat dan sesuai dengan standar perusahaan.

  2. Penerapan dengan kontrol versi: Mempertahankan sejarah lengkap yang dapat dilacak dari semua perubahan infrastruktur, memungkinkan rollback cepat ke versi tertentu dalam keadaan darurat untuk meminimalkan dampak bisnis.

  3. Penerapan multi-lingkungan yang konsisten: Menghilangkan ketidaksesuaian antara lingkungan yang berbeda (misalnya, pengembangan, staging, produksi) dan mencegah kegagalan yang disebabkan oleh ketidaksesuaian lingkungan.

Pemilihan teknologi

Tim mengevaluasi tiga pendekatan utama untuk mengelola sumber daya cloud publik:

  1. Konsol penyedia cloud: Manajemen langsung melalui GUI.

  2. Sistem manajemen kustom: Mengembangkan atau membeli sistem untuk berinteraksi dengan API penyedia cloud.

  3. Kerangka kerja Infrastructure as Code (IaC): Menggunakan kode untuk mendefinisikan dan mengelola infrastruktur.

3steps

IaC telah menjadi standar mapan untuk otomatisasi infrastruktur di komunitas teknologi global dan merupakan kerangka kerja yang paling banyak digunakan untuk manajemen multi-cloud. Berdasarkan pengalaman internasionalnya, Pony.ai mengenali keuntungan dari pendekatan IaC. Dipasangkan dengan Git untuk kontrol versi, IaC menawarkan solusi jelas untuk tujuan mereka dalam hal jejak audit dan pengendalian versi. Setiap penerapan dan perubahan dapat dikelola sebagai kode, dan rollback dapat dilakukan hanya dengan kembali ke cabang Git sebelumnya.

Dalam ekosistem IaC, Terraform menonjol sebagai alat open-source terkemuka dengan rekam jejak terbukti di lingkungan produksi perusahaan. Dengan mengadopsi Terraform, tim DevOps dapat fokus pada penulisan logika bisnis untuk infrastruktur mereka daripada membangun alat orkestrasi kustom dari awal.

Pendekatan ini terbukti lebih sederhana dan lebih gesit dibandingkan dengan mengembangkan solusi khusus di atas berbagai API cloud.

Akhirnya, dengan mempertimbangkan strategi multi-cloud dan arsitektur hybrid cloud Pony.ai, tim memilih Terraform karena standardisasi, kemudahan penggunaan, dan dukungan komunitas yang dinamis.

Arsitektur dan implementasi

Tim Pony.ai mengimplementasikan solusi IaC berbasis Terraform dengan alur kerja berpusat pada Git, seperti yang ditunjukkan pada gambar berikut:

arch

Untuk file konfigurasi, tim memilih JSON daripada HashiCorp Configuration Language (HCL) untuk menjaga konsistensi dengan aplikasi berbasis JSON yang ada dan menyederhanakan proses tinjauan kode.

Kode diorganisasikan berdasarkan layanan bisnis. Misalnya, jika suatu layanan memerlukan SLB, sertifikat, dan instance ECS, semua sumber daya ini didefinisikan dalam satu file Terraform untuk layanan tersebut. Berikut adalah contoh sederhana dari file semacam itu:

{
    "output": {
        "ecs_instance_1-private-ip": {
            "value": "${alicloud_instance.ecs_instance_1.private_ip}"
        }, 
        "ecs_instance_2-private-ip": {
            "value": "${alicloud_instance.ecs_instance_2.private_ip}"
        }, 
        "ponyai_business_1-slb-address": {
            "value": "${alicloud_slb.ponyai_business_1-slb.address}"
        }
    }, 
    "provider": {
        "alicloud": {
            "region": "alicloud_region"
        }
    }, 
    "resource": {
        "alicloud_instance": {
            "ecs_instance_1": {
                "availability_zone": "availability_zone_1", 
                "data_disks": [
                    {
                        "category": "cloud_essd", 
                        "name": "data_volume", 
                        "size": "xx"
                    }
                ], 
                "host_name": "ecs_instance_1", 
                "image_id": "image_id_1", 
                "instance_name": "ecs_instance_1", 
                "instance_type": "ecs_instance_type", 
                "internet_charge_type": "PayByTraffic", 
                "internet_max_bandwidth_out": 10, 
                "key_name": "key_name_1", 
                "security_groups": [
                    "security_groups_1"
                ], 
                "system_disk_category": "cloud_essd", 
                "system_disk_size": "xx", 
                "tags": {
                    "host_name": "ecs_instance_1"
                }, 
                "vswitch_id": "vswitch_id_1"
            }, 
            "ecs_instance_2": {
                "availability_zone": "availability_zone_2", 
                "data_disks": [
                    {
                        "category": "cloud_essd", 
                        "name": "data_volume", 
                        "size": "xx"
                    }
                ], 
                "host_name": "availability_zone_2", 
                "image_id": "image_id_1", 
                "instance_name": "availability_zone_2", 
                "instance_type": "ecs_instance_type", 
                "internet_charge_type": "PayByTraffic", 
                "internet_max_bandwidth_out": 10, 
                "key_name": "key_name_1", 
                "security_groups": [
                    "security_groups_1"
                ], 
                "system_disk_category": "cloud_essd", 
                "system_disk_size": "xx", 
                "tags": {
                    "host_name": "availability_zone_2"
                }, 
                "vswitch_id": "vswitch_id_2"
            }
        }, 
        "alicloud_slb": {
            "slb-1": {
                "address_type": "internet", 
                "internet_charge_type": "PayByTraffic", 
                "name": "slb_name", 
                "specification": "slb_specification"
            }
        }, 
        "alicloud_slb_listener": {
            "slb-listener-1": {
                "backend_port": "xx", 
                "bandwidth": -1, 
                "frontend_port": "xx", 
                "health_check": "on", 
                "health_check_connect_port": "xx", 
                "health_check_domain": "domain_name", 
                "health_check_type": "check_type", 
                "health_check_uri": "uri_1", 
                "load_balancer_id": "${alicloud_slb.slb-1.id}", 
                "protocol": "protocol_1", 
                "scheduler": "scheduler_1", 
                "server_certificate_id": "${alicloud_slb_server_certificate.slb-certificate-1.id}", 
                "server_group_id": "${alicloud_slb_server_group.slb-server-group-1.id}"
            }
        }, 
        "alicloud_slb_server_certificate": {
            "slb-certificate-1": {
                "alicloud_certificate_id": "xx", 
                "alicloud_certificate_name": "xx", 
                "name": "certificate_1"
            }
        }, 
        "alicloud_slb_server_group": {
            "slb-server-group-1": {
                "load_balancer_id": "${alicloud_slb.slb-1.id}", 
                "name": "slb-server-group", 
                "servers": {
                    "port": "xx", 
                    "server_ids": [
                        "${alicloud_instance.ecs_instance_1.id}", 
                        "${alicloud_instance.ecs_instance_2.id}"
                    ]
                }
            }
        }
    }, 
    "terraform": {
        "backend": {
            "s3": {
                "bucket": "bucket_name", 
                "dynamodb_table": "table", 
                "key": "key_1", 
                "profile": "profile_1", 
                "region": "region_1"
            }
        }, 
        "required_providers": {
            "alicloud": {
                "source": "aliyun/alicloud", 
                "version": "xx"
            }
        }
    }
}

Tantangan bisnis

Saat tim menulis lebih banyak kode Terraform, mereka menghadapi tantangan terkait penggunaan kembali kode dan keterbacaannya. Masalah utama meliputi:

  • Untuk sumber daya tertentu seperti instance ECS, tim terutama tertarik pada subset parameter, seperti instance_type, instance_name, dan availability_zone.

  • Menerapkan layanan yang sama di berbagai lingkungan sering kali melibatkan konfigurasi identik dengan hanya sedikit perubahan parameter (misalnya, menggunakan instance SLB slb.s2.medium di produksi versus slb.s1.small di pengujian). Menulis ulang kode untuk setiap lingkungan menghasilkan keterbacaan dan kemampuan pemeliharaan yang buruk.

Solusi

Untuk menyelesaikan masalah ini, tim memperkenalkan Jsonnet, bahasa templating data open-source, untuk menghasilkan file JSON Terraform. Ini memungkinkan mereka untuk mengabstraksi boilerplate berulang dan membuat modul yang dapat digunakan kembali dengan membangun perpustakaan fungsi utilitas. Sebagai contoh, mereka menciptakan fungsi generateEcs:

generateEcs(instance_name,
            availability_zone,
            vswitch_id,
            security_groups,
            instance_type,
            host_name,
            data_volume_size=null,
            system_disk_size=null,
            internet_charge_type="PayByTraffic",
            image_id="ubuntu_18_04_x64_20G_alibase_20200914.vhd",
            key_name="bootstrap-bot",
            system_disk_category="cloud_essd",
            internet_max_bandwidth_out=10,
            data_disk_category="cloud_essd"): {
  instance_name: instance_name,
  availability_zone: availability_zone,
  vswitch_id: vswitch_id,
  security_groups: security_groups,
  instance_type: instance_type,
  internet_charge_type: internet_charge_type,
  image_id: image_id,
  system_disk_category: system_disk_category,
  [if system_disk_size != null then "system_disk_size"]:
    system_disk_size,
    key_name: key_name,
    internet_max_bandwidth_out: internet_max_bandwidth_out,
    host_name: host_name,
    data_disks: if data_volume_size != null then [
      {
        name: "data_volume",
        size: data_volume_size,
        category: data_disk_category,
      },
    ] else [],
      tags: {
        host_name: host_name,
      },
}

Abstraksi ini memungkinkan insinyur untuk cukup memanggil fungsi untuk menghasilkan konfigurasi yang diperlukan, secara dramatis menyederhanakan kode yang diperlukan untuk menyediakan beberapa instance:

alicloud_instance: {
  [host_config.host_name]:
    ecsUtils.generateEcs(
      instance_name=host_config.host_name,
      availability_zone=host_config.az,
      security_groups=$.ecs_security_groups,
      host_name=host_config.host_name,
      instance_type=$.ecs_instance_type,
      vswitch_id=vpc_output["vswitch-public-" + host_config.az].value,
      data_volume_size=$.ecs_data_volume_size,
      system_disk_size=$.ecs_system_disk_size
    )
  for host_config in host_configs
},

Setiap penyesuaian dapat dilakukan langsung di fungsi utilitas yang sesuai, menghindari kebutuhan untuk memodifikasi setiap komponen infrastruktur secara individual.

Untuk menangani lingkungan yang berbeda (misalnya, produksi, staging, pengujian) di mana hanya beberapa parameter komponen yang berbeda, tim mendefinisikan template dasar. Konfigurasi setiap lingkungan kemudian mengimpor template dasar ini dan cukup menimpa parameter yang diperlukan.

Pendekatan ini memungkinkan Pony.ai untuk menerapkan layanan di berbagai lingkungan menggunakan struktur direktori berikut:

Catatan

"generated/main.tf.json", file yang dieksekusi Terraform, adalah file JSON yang dihasilkan oleh alat Jsonnet dari "main.tf.json.jsonnet." File "main.tf.json.jsonnet.output" berisi keluaran yang dihasilkan setelah Terraform menerapkan konfigurasi.

├── alicloud-region
│   ├── dev
│   │   ├── generated
│   │   │   └── main.tf.json
│   │   ├── main.tf.json.jsonnet
│   │   └── main.tf.json.jsonnet.output
│   ├── prod
│   │   ├── generated
│   │   │   └── main.tf.json
│   │   ├── main.tf.json.jsonnet
│   │   └── main.tf.json.jsonnet.output
│   └── staging
│       ├── generated
│       │   └── main.tf.json
│       ├── main.tf.json.jsonnet
│       └── main.tf.json.jsonnet.output
└── ponyai_business_1_base.libsonnet

Menggunakan spesifikasi SLB sebagai contoh, lingkungan produksi dan pengujian cukup mengimpor template dasar dan memberikan nilai yang berbeda. Untuk lingkungan produksi:

local base = import "../../ponyai_business_1_base.libsonnet";
base {
  name: "ponyai_business_1_prod",
  environment: "prod",
  region: "alicloud_region",
  slb_specification: "slb.s2.medium"
}

Untuk lingkungan pengujian, hanya spesifikasi dan bidang terkait nama yang berubah:

local base = import "../../ponyai_business_1_base.libsonnet";
base {
  name: "ponyai_business_1_dev",
  environment: "dev",
  region: "alicloud_region",
  slb_specification: "slb.s1.small"
}

Metode ini secara signifikan meningkatkan keterbacaan dan kemampuan penggunaan kembali kode. Selain itu, Jsonnet juga secara elegan menyelesaikan masalah dependensi antara komponen infrastruktur. Misalnya, membuat instance ECS di Alibaba Cloud memerlukan ID Virtual Private Cloud (VPC), tetapi VPC sering kali didefinisikan dan dikelola dalam file Terraform terpisah. Konfigurasi ECS harus merujuk ID VPC yang dihasilkan oleh file VPC. Di Pony.ai, file "main.tf.json" membuat VPC, dan ID-nya ditulis ke file keluaran ("main.tf.json.jsonnet.output") di direktorinya sendiri:

├── ali-cloud-region
│   ├── dev
│   │   ├── generated
│   │   │   └── main.tf.json
│   │   ├── main.tf.json.jsonnet
│   │   └── main.tf.json.jsonnet.output
│   └── prod
│       ├── generated
│       │   └── main.tf.json
│       ├── main.tf.json.jsonnet
│       └── main.tf.json.jsonnet.output

File "main.tf.json.jsonnet.output" yang dihasilkan terlihat seperti ini:

{
  "vpc_id": {
    "sensitive": false,
    "type": "string",
    "value": "vpc_id_for_ponyai"
  },
"vswitch-id": {
    "sensitive": false,
    "type": "string",
    "value": "vswitch_public_id_for_ponyai"
  }
}

Layanan lain yang memerlukan nilai-nilai ini kemudian dapat dengan mudah merujuknya menggunakan pernyataan impor sederhana, yang menghindari pengkodean langsung nilai yang dihasilkan ke dalam basis kode:

{
"ali-cloud-region": {
  prod: import "./ali-cloud-region/prod/main.tf.json.jsonnet.output",
  }
}

Melalui abstraksi teknis bertingkat ini, tim DevOps Pony.ai memanfaatkan kekuatan ekosistem Terraform sambil menyelesaikan kompleksitas pemanggilan layanan, yang mengarah pada peningkatan efisiensi operasional secara keseluruhan.

Hasil bisnis

Mengadopsi metodologi IaC dengan Terraform dan Git telah menghasilkan manfaat substansial. Semua parameter infrastruktur sekarang didefinisikan secara eksplisit dalam kode. Ketika suatu layanan memerlukan dua instance ECS dengan ukuran tertentu dan konfigurasi disk yang ditentukan, semuanya tertangkap dalam sebuah file.

Pendekatan berbasis kode ini membuat setiap perubahan dapat ditinjau melalui proses pull request (PR) Git standar, memungkinkan diskusi dan verifikasi menyeluruh sebelum penerapan apa pun.

Proses ini memastikan bahwa penerapan akhir sempurna sesuai dengan desain awal. Setiap penyimpangan terdeteksi selama fase pengkodean, mendorong penyesuaian tepat waktu. Pengujian mandiri wajib sebelum pengajuan PR lebih lanjut mengurangi siklus tinjauan.

gitcommit

Manfaat bisnis utama dari transformasi ini dapat dirangkum dalam empat area:

  • Lebih cepat: Penyediaan infrastruktur bukan lagi serangkaian operasi manual berulang di konsol. Siklus produksi yang dipersingkat secara signifikan memungkinkan perusahaan merespons lebih cepat terhadap keputusan bisnis dan peluang pasar.

  • Lebih terkendali: Dengan infrastruktur didefinisikan sebagai kode, setiap perubahan memiliki versi dan dapat diaudit. Ini meningkatkan organisasi dari operasi manual konsol ke sistem manajemen yang lebih canggih, tepercaya, dan dapat dilacak.

  • Lebih efisien: Kolaborasi lintas tim, termasuk tim internasional, telah meningkat secara dramatis, mengurangi penundaan yang disebabkan oleh perbedaan zona waktu dan gaya kerja yang bervariasi.

  • Lebih aman: Risiko kecelakaan produksi karena kesalahan manusia sangat berkurang. Dengan menggabungkan proses otomatis berbasis kode dengan alur kerja persetujuan spesifik lingkungan, Pony.ai telah menciptakan sistem yang kuat yang melindungi operasi bisnisnya.

Kesimpulan

  • Peningkatan Model Manajemen

Filosofi IaC sekarang menjadi landasan semua pengembangan infrastruktur di Pony.ai. Perusahaan telah berhasil mengabstraksi banyak komponen Alibaba Cloud—including ECS, VPC, Object Storage Service (OSS), Public DNS, Resource Access Management (RAM), Simple Log Service, dan pengguna—menjadi fungsi internal.

  • Peningkatan Model Bisnis

Ketika tim memerlukan sumber daya cloud, mereka cukup menggunakan fungsi pra-dibuat dan diverifikasi ini. Ini memungkinkan tim DevOps untuk fokus pada pemeliharaan dan peningkatan pustaka internal ini, mendorong peningkatan besar dalam efisiensi operasional.

  • Peningkatan Model Operasi

Hari ini, lebih dari 20 unit bisnis di Pony.ai diterapkan dan dikelola 100% melalui alur kerja IaC ini. Ini memberikan sejarah versi yang jelas dari setiap komponen, memfasilitasi tinjauan ketat, dan memberdayakan tim untuk menolak penerapan yang tidak tepat. Hasilnya adalah lingkungan online yang bersih, andal, dan skalabel.

Tentang penulis

Tim DevOps Pony.ai

Artikel ini disumbangkan oleh penulis eksternal, dan semua hak cipta milik mereka. Alibaba Cloud tidak bertanggung jawab atas kontennya.