Penjelasan

Dari keenam berkas yang ditambahkan, berkas yang perlu diperhatikan adalah app.ts, berkas ini berisi kode Typescript yang mendeklarasikan infrastruktur yang kita butuhkan.

(Dukungan PHP untuk CDK masih belum ada, jika ingin melihat CDK dengan kode PHP, silakan kirimkan vote Anda di Github Issue ini)

Dengan kode sesederhana di atas, kita akan mendapatkan aplikasi dengan arsitektur yang mirip seperti di bawah.

Sumber Task Networking in AWS Fargate

Kode Typescript CDK di atas akan menghasil templat untuk CloudFormation yang panjangnya bisa 700 baris seperti ini.

Construct

Sekarang kita coba telaah bagian-bagian dari kode di atas.

        const ecsCluster = new ecs.Cluster(this, 'ecsCluster');

Kita mulai pada kode yang paling sederhana di atas. Di atas kita mendefinisikan sebuah ECS cluster yang kita beri nama ecsCluster. Kode ecs.Cluster adalah apa yang kita sebut dengan Construct. Construct yakni blok bangunan yang merepresentasikan satu atau kumpulan komponen. Construct berguna untuk mengenkapsulasikan berbagai resource di Cloud agar bisa digunakan kembali sebagai sebuah kesatuan. Kita bisa membangun Construct di atas satu atau lebih Construct yang lain.

Stack

export class WebStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    //....
  }
  //....
}

Di bagian ini, kita mendefinisikan apa yang disebut sebagai Stack. Stack adalah satuan untuk mendefinisikan resource yang akan kita buat. Sebuah Stack pada CDK akan membuat sebuah CloudFormation stack.

Kita bisa lihat di konsol CloudFormation terdapat stack bernama WebStack yang kita buat.

App

const app = new cdk.App();
new WebStack(app, 'WebStack');

app.synth();

Di bagian ini, kita membuat apa yang disebut App. App adalah respresentasi dari satu aplikasi CDK di mana kita mendefinisikan scope dari Stack yang kita buat. Sebuah app dapat memiliki beberapa Stack. Misalnya di kode di bawah kita telah mendefinisikan dua buah Stack dan kita instansiasi dengan nama masing-masing MyStack1 dan MyStack2.

const app = new cdk.App();
new Stack1(app, 'MyStack1');
new Stack2(app, 'MyStack2');
app.synth();

Jika kita mengeksekusi cdk ls, kita akan melihat kedua Stack tersebut ditampilkan. Kita dapat melakukan deployment untuk kedua stack di atas secara terpisah.

$cdk deploy MyStack1
$cdk deploy MyStack2

Lebih Lanjut Tentang Construct

Pada contoh kode utama app.ts, kelas ApplicationLoadBalancedFargateService juga adalah sebuah Construct. Di dalam Construct terdapat beberapa Construct lainnya yang merepresentasikan resource AWS seperti VPC, Subnet, Internet Gateway, NAT Gateway, ENI, Load Balancer, dan Fargate. Kita hanya menggunakan Construct ApplicationLoadBalancedFargateService tanpa harus terlalu memikirkan bagaimana mengorkestrasi resource di dalamnya. Kita cukup menginstansiasi kelas tersebut dan memberikan beberapa parameter.

        const ecsCluster = new ecs.Cluster(this, 'ecsCluster');
        new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'Service', {
            cluster: ecsCluster,
            taskDefinition: {
                cpu: 512,
                memoryLimitMiB: 1024
            },
            taskImageOptions: {
                image: ecs.ContainerImage.fromAsset('.')
            },
        });

Pada contoh di atas, kita memberikan parameter definisi task untuk Fargate yakni kita butuh CPU sebesar 512 unit dengan batas memori 1024 MB atau 1 GB.

Selain ApplicationLoadBalancedFargateService, terdapat beberapa pola-pola yang disediakan untuk ECS oleh library ecs-pattern yang dapat kita pilih. Contohnya ApplicationLoadBalancedEc2Service jika kita ingin menggunakan EC2 sebagai mesin komputasi untuk ECS kita. Atau kita bisa menggunakan NetworkLoadBalancedFargateService jika kita ingin menggunakan Network Load Balancer ketimbang Application Load Balancer karena kita ingin membuat aplikasi menggunakan UDP.

Dalam perkembangan ke depannya kita akan terus menambahkan definisi resource ke dalam kode CDK. Penggunaan Construct akan sangat membantu kita untuk mendekomposisi kode CDK kita agar tetap sederhana dan mudah dibaca. Dekomposisi ini juga dapat digunakan sebagai library yang dapat kita gunakan kembali atau bagikan ke tim yang lain.

Sebagai contoh, kode pembuatan ECS cluster dan Fargate di atas dapat kita refactor menjadi Construct baru WebECSCluster misalnya. Construct ini dapat kita pindahkan ke berkas lain agar menjadi berkas aplikasinya tidak terlalu besar.

class WebECSCluster extends cdk.Construct {
    constructor(scope: cdk.Construct) {
        super(scope, "WebECSCluster");

        const ecsCluster = new ecs.Cluster(this, 'ecsCluster');
        new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'Service', {
            cluster: ecsCluster,
            taskImageOptions: {
                image: ecs.ContainerImage.fromAsset('.')
            },
        });
    }
}


class WebStack extends cdk.Stack {
    constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
        new WebECSCluster(this);
    }
}

Sekian penjelasan saya tentang bagian pertama dari tutorial Membangun Aplikasi Yii2 Modern dengan AWS. Jika ada penjelasan yang masih kurang dapat dimengerti oleh rekan-rekan, mohon ditanyakan pada bagian komentar. Saya juga menerima usulan topik dari rekan-rekan sekalian jika sekiranya ada rekan-rekan yang tertarik pada topik-topik tertentu. Silakan ditulis juga di bagian komentar.

Referensi

Leave a comment

Leave a Reply

%d bloggers like this: