Re-Usable IAC Menggunakan Pulumi Component Resource

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

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s

Situs yang Didukung WordPress.com.

Atas ↑

%d blogger menyukai ini: