Blog AWS Indonesia

Membangun Developer Portal dengan Backstage dan Amazon EKS Blueprints

Kompleksitas dari proses pengembangan software pada beberapa tahun terakhir, telah melahirkan dan mengadopsi apa yang disebut Internal Developer Platform (IDP). Tujuan penggunaan IDP adalah untuk mengurangi beban dari software developer, dimana mereka harus menggunakan banyak tools dan produk untuk menyelesaikan pekerjaan. Fragmentasi tersebut menyebabkan developer baru menghabiskan banyak waktu untuk mempelajari sistem yang ada. IDP menyelesaikan masalah tersebut dengan menyediakan front-end yang terpusat, dimana tools dan produk yang berbeda-beda disatukan dan disediakan kepada developer dalam sebuah katalog.

Backstage adalah sebuah Developer Portal (DP), diciptakan di Spotify dan dirilis sebagai open-source pada Maret 2020. DP digunakan sebagai antar-muka untuk menjelajahi dan mengakses fitur-fitur IDP. Sebagai DP, Backstage memusatkan berbagai entitas pada perusahaan Anda, seperti: API, resource, user, tim, dokumentasi, dll. Backstage juga menyediakan fitur untuk mengembangkan arsitektur dengan komponen tambahan pihak ketiga yang dapat dipasang dan digunakan, sebagai contoh plugin AWS Proton. Amazon EKS Bluprints for CDK (berikutnya akan disebut Amazon EKS Blueprints) adalah sebuah modul Infrastructure as Code (IaC) yang membantu Anda untuk membuat sebuah cluster Amazon Kubernetes Service (Amazon EKS) secara lengkap, diberbagai akun dan region, secara cepat dengan code yang minimal. Awalnya dikembangkan di AWS, Amazon EKS dirilis sebagai open source pada April 2022. Add-ons adalah Amazon EKS Blueprints construct, yang membantu Anda mengelola add-ons Kubernetes, yang berjalan disebuah cluster.

Posting ini akan menunjukkan bagaimana menginstall dan mengkonfigurasi add-on Backstage untuk Amazon EKS Blueprints, dengan menggunakan Amazon EKS Blueprints Patterns. Add-on ini akan membantu Anda untuk menginstall aplikasi Backstage pada Amazon EKS cluster yang baru dideploy. Anda dapat mengakses Backstage dari sebuah Amazon Elastic Load Balancer (Amazon ELB). Posting ini tidak membahas integrasi lanjutan antara Amazon EKS Blueprints dan Backstage, contohnya: untuk menampilkan dan mengontrol environment, status dari pipeline, team onboarding, dll yang mana adalah subjek untuk pengembangan selanjutnya.

Gambaran umum solusi

Diagram berikut menunjukkan solusi keseluruhan yang akan saya tunjukkan pada posting ini:

Anda memerlukan Docker image dari Backstage, yang telah dikonfigurasi sesuai kebutuhan, contoh: dengan beberapa plugin pilihan Anda. Detil bagaimana melakukan hal tersebut akan dibahas pada bagian selanjutnya “Deploy Backstage” pada posting ini.

Pattern dari Backstage:

  • Deploy image ke Amazon EKS cluster baru
  • Membuat Amazon Relational Database Service (Amazon RDS) for PostgreSQL instans pada VPC cluster Amazon EKS
  • Menyimpan credential dari database sebagai secret di AWS Secrets Manager
  • Membuat External Secret yang merefleksikan credential database
  • Membuat sebuah Kubernetes Secret dari External Secret yang akan dimasukkan ke Backstage sebagai environment variable $POSTGRES_USER dan $POSTGRES_PASSWORD
  • Menginstall add-on AWS Load Balancer Controller, yang akan mendeploy sebuah Application Load Balancer (ALB) yang mengimplementasikan rules yang ada di Backstage Helm chart Ingress
  • Membuat certificate untuk ALB

Prasyarat

Anda memerlukan hal-hal berikut untuk menyelesaikan langkah-langkah pada post ini:

Anda juga memerlukan sebuah nama domain, yang ada di salah satu public hosted zone Amazon Route 53 Anda, mirip seperti apa yang ditampilkan pada AWS Management Console berikut:

Clone Amazon EKS Blueprints Patterns

Buka command-line interface (CLI) dan clone EKS Blueprints Patterns di GitHub:

$ git clone https://github.com/aws-samples/cdk-eks-blueprints-patterns.git

Deploy Backstage

Ikuti instruksi dari file Backstage didalam folder docs pada EKS Blueprints Patterns repositori. Ini adalah ringkasan langkah yang perlu dilakukan:

  1. Buat Backstage application dan build Docker image
  2. Buat Amazon Elastic Container Registry (Amazon ECR) dan repository
  3. Upload Docker image pada repository yang baru dibuat
  4. Konfigurasi akun dan region sebagai bagian dari AWS CLI profile dan masukkan parameter yang diperlukan pada CDK context:
Parameter Description
backstage.namespace.name Kubernetes namespace untuk deploy Backstage, contoh: “backstage”
backstage.image.registry.name Image Registry, contoh: Amazon Elastic Container Registry (ECR): “{account}.dkr.ecr.{region}.amazonaws.com”
backstage.image.repository.name Repository pada registry diatas: “backstage”
backstage.image.tag.name Tag untuk Backstage image, contoh: “latest”
backstage.parent.domain.name Domain name, dan certificate yang akan dibuat, contoh “example.com”
backstage.subdomain.label Label yang akan digunakan untuk membuat subdomain yang akan digunakan Backstage, contoh: “backstage”; subdomain akhir harusnya menjadi: “backstage.example.com”
backstage.hosted.zone.id 20-chars string yang merepresentasikan Hosted zone di Route 53
backstage.certificate.resource.name Nama certificate resource, contoh: “backstage-certificate”
backstage.database.resource.name Nama untuk database resource, contoh: “backstage-database”
backstage.database.instance.port Port untuk Backstage database, contoh: 5432
backstage.database.secret.resource.name Nama untuk Secret resource (akan digunakan pada CDK), contoh: “backstage-database-credentials”
backstage.database.username Username dari database, contoh: “postgres”
backstage.database.secret.target.name Nama Secret yang digunakan pada Kubernetes manifest, contoh: “backstage-database-secret”

1. Deploy seperti yang dijelaskan dalam dokumentasi Amazon EKS Blueprints Patterns.

$ make deps 
$ npm i
$ make build
$ make pattern backstage deploy

Pada web browser, buka alamat {"parent.domain.name"}.{"subdomain.label"}. Anda akan melihat tampilan yang mirip seperti berikut, tergantung dari konfigurasi aplikasi Backstage Anda:

Code analysis

Penting untuk dicatat bahwa add-on Backstage dihosting pada repository Amazon EKS Blueprints, sedangkan Backstage pattern yang mendemonstrasikan bagaimana melakukan konfigurasi add-on dan deploy resource yang diperlukan, dihosting pada repository Amazon EKS Blueprints Patterns.

Add-on bergantung pada Backstage Helm chart, yang ada di GitHub, Anda dapat menemukan penjelasan detail nilai-nilai dari chart.

Kita perlu melakukan konfigurasi Helm chart seperti berikut:

  • Tentukan nilai parameter Ingress
  • Tentukan lokasi Docker image dari Backstage
  • Masukkan ke aplikasi Backstage:
    • Subdomain yang Anda inginkan
    • Database endpoint dan environment variable, yang akan digunakan untuk credentials database
    • Secret name, yang menyimpan database credential

Konfigurasi pada Ingress yang paling dapat dilihat adalah Certificate Amazon Resource Name (ARN).

Kita menggunakan PostgreSQL, sebagai ganti dari default in-memory SQLite database, untuk mendapatkan skalabilitas, concurency, sentralisasi dan kontrol lebih baik (lihat panduan Backstage untuk lebih detil). Credential akan dimasukkan pada pod aplikasi Backstage melalui environment variable, diambil dari Secret. Chart mengambil informasi nama Secret dari nilai backstage.extraEnvVarsSecrets, dan memasukkan nilainya ke envFrom yang ada di manifest Kubernetes Deployment.

kind: Deployment
…
containers:
…
          envFrom:
            {{- range .Values.backstage.extraEnvVarsSecrets }}
…

Parameter yang harus dimasukkan ke add-on adalah:

subdomain: string,
certificateResourceName: string,
imageRegistry: string,
imageRepository: string,
imageTag?: string,
databaseResourceName: string,
databaseSecretTargetName: string

Pattern tersebut menyediakan ketergantungan untuk add-on.

Sebuah Resource Provider (DatabaseInstanceCredentialsProvider) dibuat dan menyimpan credential database di AWS Secrets Manager (ASM).

Resource Provider kedua (DatabaseInstanceProvider) membuat sebuah database Amazon RDS for PostgreSQL instans pada cluster VPC, mengambil secret name dari ASM dan mengirimkannya ke database, ketika proses pembuatan.

Add-on (BackstageSecretAddOn), yang menggunakan External Secrets Add-On, membuat object ClusterSecretStore, yang merujuk ke ASM dan ExternalSecret, yang mengambil credential dari ASM dan memasukkannya ke Kubernetes Secret baru, dengan dua key yaitu: POSTGRES_USER dan POSTGRES_PASSWORD:

…
data: [
    {
        secretKey: "POSTGRES_PASSWORD",
        remoteRef: {
            key: databaseInstanceCredentialsSecretName,
            property:  "password"
        }
    },
    {
        secretKey: "POSTGRES_USER",
        remoteRef: {
            key: databaseInstanceCredentialsSecretName,
            property:  "username"
        }
    },
],
…

Seperti yang telah kami jelaskan sebelumnya, credential disimpan pada Secret dan dikirimkan ke pod sebagai environment variable $POSTGRES_USER dan $POSTGRES_PASSWORD.

Resource Provider ketiga (CreateCertificateProvider) membuat subdomain di Amazon Route 53 Hosted Zone dan membuat certificate di AWS Certificate Manager (ACM):

blueprints.EksBlueprint.builder()

…

.resourceProvider(blueprints.GlobalResources.HostedZone, new blueprints.ImportHostedZoneProvider(props.hostedZoneId, props.parentDomain))

.resourceProvider(props.certificateResourceName, new blueprints.CreateCertificateProvider("elb-certificate", subdomain, blueprints.GlobalResources.HostedZone))

Backstage add-on akan mengambil dari konteks untuk mengekstrak ARN dari certificate:

const annotations = {
    …
    "alb.ingress.kubernetes.io/certificate-arn": clusterInfo.getResource<ICertificate>(helmOptions.certificateResourceName)?.certificateArn
};

Untuk kemudian digunakan pada Ingress:

setPath(values, "ingress.annotations", annotations);

Pada halaman Route 53 di AWS Management Console, akan muncul record baru yang mirip dengan screenshot berikut:

Certificate akan muncul di halaman AWS Certificate Manager:

Apa selanjutnya?

Backstage menyediakan antarmuka terpusat untuk melihat semua resource di organisasi Anda, terlepas dari lokasinya dimana, Backstage juga menyediakan cara yang mudah untuk memulai penggunaan development tool. Backstage juga memberikan kemudahan untuk membuat aplikasi backend dan frontend dari portal yang disediakan.

Sekarang Anda memiliki Developer Platform, Anda dapat mulai mendapatkan manfaat dengan membuat sebuah Software Catalog. Software Catalog membantu Anda untuk melakukan tracking kepemilikan dan metadata dari semua software di lingkungan Anda (service, website, pustaka, pipeline, dll) di satu tempat yang terpusat. Catalog tersebut dibuat dari metadata YAML yang disimpan di source control, yang dihubungkan ke Backstage melalui berbagai cara dan ditampilkan secara komprehensif kepada developer.

Fitur lain yang mungkin ingin Anda jelajahi adalah Software Templates, yang memudahkan tim Engineering untuk membuat komponen, ia membantu membuat project dengan cepat sesuai dengan best practice dari tim. Ini membantu tim untuk menghindari sesuatu yang berulang, menjadikan keputusan yang perlu diambil menjadi sedikit, dan membuat mereka hanya perlu fokus ke aktivitas utama saja. Software Templates merupakan hal fundamental untuk konsep Golden Paths, yang mana adalah cara yang sudah disiapkan (opiniated) untuk membangun layanan (contoh, backend service, aplikasi web, atau CI/CD pipeline). Daripada membuat konvensi dan standard, dengan Golden Paths, Anda dapat mempermudah tim Anda untuk membuat project baru dengan cara yang benar.

Contoh selanjutnya apa yang bisa Anda lakukan adalah dengan membuat dokumentasi melalui TechDocs. Ini membuat Anda dapat menulis file Markdown di satu lokasi yang sama dengan file-file kode. File-file ini dengan jelas dapat ditampilkan secara tepat pada Backstage.

Mohon merujuk pada website Backstage untuk dokumentasi lengkap dan contoh-contoh dari fitur dan studi kasusnya.

Pembersihan

Untuk menghindari adanya biaya kedepan, jalankan perintah berikut:

make pattern backstage destroy

Kesimpulan

Pada posting ini, saya telah menunjukkan kepada Anda bagaimana menggunakan add-on Backstage dari Amazon EKS Blueprints dan Backstage pattern dari Amazon EKS Blueprints Patterns, untuk mendeploy aplikasi Backstage yang telah siap dan telah dikonfigurasi. Saya menjelaskan konfigurasi parameter untuk pattern, dan bagaimana pattern tersebut saling menghubungkan resource provider dan add-on yang lain untuk menjalankan aplikasi Backstage dan dependensinya.

Artikel ini diterjemahkan dari artikel asli dengan judul “Building Developer Portals with Backstage and Amazon EKS Blueprints” yang ditulis oleh Riccardo Freschi, AWS.

Rio Astamal

Rio Astamal

Rio Astamal is a Developer Advocate at AWS and a passionate web developer since 2003. In his spare time he loves writing small open source projects to solve problem in his daily activity.