Hi Gengz, kali ini kita akan coba coba untuk buat re-usable iac yuk, langsung gaskan aja.
Source
https://www.pulumi.com/docs/intro/concepts/resources/components/
Inisiasi
Mari kita inisiasi dulu pulumi nya ya gengz (saya menggunakan ap-southeast-1 sebagai region)

pulumi new aws-typescript
Kita akan melihat hasil code berikut
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";
// Create an AWS resource (S3 Bucket)
const bucket = new aws.s3.Bucket("my-bucket");
// Export the name of the bucket
export const bucketName = bucket.id;
Saya akan menghapus semua baris kecuali baris import
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";
Pembuatan Class Dasar
Mari kita buat dulu ya classnya
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";
import { ResourceOptions } from "@pulumi/pulumi";
class MyComponent extends pulumi.ComponentResource {
constructor(name: string, opts?: ResourceOptions) {
super("pkg:index:MyComponent", name, {}, opts);
}
}
Untuk contoh kali ini, saya akan menggunakan vpc ya, source codenya dari link berikut
https://www.pulumi.com/registry/packages/aws/api-docs/ec2/vpc/
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";
import { ResourceOptions } from "@pulumi/pulumi";
class MyComponent extends pulumi.ComponentResource {
constructor(name: string, opts?: ResourceOptions) {
super("pkg:index:MyComponent", name, {}, opts);
const main = new aws.ec2.Vpc("main", {
cidrBlock: "10.0.0.0/16",
});
}
}
const mycomponent = new MyComponent("learn-component-resource")
Sampai disini kita coba dulu test puluminya ya

pulumi preview
Parent
Mari kita define bahwa vpc yang kita buat adalah child dari MyComponent
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";
import { ResourceOptions } from "@pulumi/pulumi";
class MyComponent extends pulumi.ComponentResource {
constructor(name: string, opts?: ResourceOptions) {
super("pkg:index:MyComponent", name, {}, opts);
const main = new aws.ec2.Vpc("main", {
cidrBlock: "10.0.0.0/16",
}, { parent: this });
}
}
const mycomponent = new MyComponent("learn-component-resource")
Mari kita coba check dulu yuk, apa perbedaannya

pulumi preview
Secara struktur, kita bisa lihat bahwa VPC(main) saat ini ada didalam bagian MyComponent yang sudah kita buat. Penting untuk diperhatikan, bahwa saat kita merubah resource yang sebelumnya kita tidak define parent-nya, pulumi akan melakukan destroy pada saat update
Membuat Output
Sudah ok semua, yuk lanjut ngoding, kali ini kita akan coba export output ya gengz
Bila menggunakan VSCode, kita akan dipermudah untuk menentukan tipe data dari arn yang akan kita export

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";
import { ResourceOptions } from "@pulumi/pulumi";
class MyComponent extends pulumi.ComponentResource {
public vpcArn: pulumi.Output<string>
constructor(name: string, opts?: ResourceOptions) {
super("pkg:index:MyComponent", name, {}, opts);
const main = new aws.ec2.Vpc("main", {
cidrBlock: "10.0.0.0/16",
}, { parent: this });
this.vpcArn = main.arn
}
}
const mycomponent = new MyComponent("learn-component-resource")
export const vpcArn = mycomponent.vpcArn
Berdasarkan document di bawah ini kita harus menambahkan beberapa baris code
https://www.pulumi.com/docs/intro/concepts/resources/components/#registering-component-outputs
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";
import { ResourceOptions } from "@pulumi/pulumi";
class MyComponent extends pulumi.ComponentResource {
public vpcArn: pulumi.Output<string>
constructor(name: string, opts?: ResourceOptions) {
super("pkg:index:MyComponent", name, {}, opts);
const main = new aws.ec2.Vpc("main", {
cidrBlock: "10.0.0.0/16",
}, { parent: this });
this.vpcArn = main.arn
this.registerOutputs({
vpcArn: main.arn,
})
}
}
const mycomponent = new MyComponent("learn-component-resource")
export const vpcArn = mycomponent.vpcArn
Yuk kita check preview dulu

pulumi preview
Passing Value
Disini kita akan coba pass value, karena ini salah satu yang penting dan kita butuhkan
Saya akan mengeluarkan value cidrBlock yang ada di dalam class menjadi seperti berikut
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";
import { ResourceOptions } from "@pulumi/pulumi";
class MyComponent extends pulumi.ComponentResource {
public vpcArn: pulumi.Output<string>
constructor(name: string, customcidrBlock: string, opts?: ResourceOptions) {
super("pkg:index:MyComponent", name, {}, opts);
const main = new aws.ec2.Vpc("main", {
cidrBlock: customcidrBlock,
}, { parent: this });
this.vpcArn = main.arn
this.registerOutputs({
vpcArn: main.arn,
})
}
}
const mycomponent = new MyComponent("learn-component-resource", "10.0.0.0/16")
export const vpcArn = mycomponent.vpcArn
Yuk kita create infrastrukturnya

pulumi up --yes
Default Value
Mangstap, sudah bisa semua ya. Untuk tambahan tipis, kita akan menambahkan default value terhadap cidrBlock, asumsinya adalah kita akan membuat infrastruktur yang kita tidak perlu define cidrBlock nya
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";
import { ResourceOptions } from "@pulumi/pulumi";
class MyComponent extends pulumi.ComponentResource {
public vpcArn: pulumi.Output<string>
constructor(name: string, customcidrBlock: string = "10.0.0.0/16", opts?: ResourceOptions) {
super("pkg:index:MyComponent", name, {}, opts);
const main = new aws.ec2.Vpc("main", {
cidrBlock: customcidrBlock,
}, { parent: this });
this.vpcArn = main.arn
this.registerOutputs({
vpcArn: main.arn,
})
}
}
const mycomponent = new MyComponent("learn-component-resource")
export const vpcArn = mycomponent.vpcArn
Disini kita bisa lihat, customcidrBlock mempunyai default value, sehingga kita punya pilihan untuk membuat cidr block baru, atau merujuk pada default value
Mari kita coba update kembali infrastrukturnya yuk

pulumi up --yes
Bisa kita lihat bahwa tidak ada perubahaan ya, karena memang valuenya sama
Bersih Bersih
Mari kita hapus infrastruktur yang telah dibuat

pulumi destroy --yes
Hapus stack yang kita telah buat

pulumi stack rm dev
Semoga bermanfaat
Tinggalkan Balasan