Skip to content

Instantly share code, notes, and snippets.

@ejlp12
Last active March 28, 2021 01:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ejlp12/a84020b6e7a06be2ba2ff9fcd9c87587 to your computer and use it in GitHub Desktop.
Save ejlp12/a84020b6e7a06be2ba2ff9fcd9c87587 to your computer and use it in GitHub Desktop.
Memulai IaC menggunakan AWS CDK

Tautan ke halaman ini: https://bit.ly/39Wd55j

AWS CDK

Anda mungkin sudah mengetahui isitilah Infrastructure as Code (IaC). Dengan IaC, infrastruktur aplikasi atau sistem teknologi informasi seperti sumberdaya komputasi, jaringan (network), penyimpanan (storage), server dan sumberdaya lainnya dapat dideskripsikan dalam sebuah file konfigurasi atau kode script kemudian dapat disiapkan (provision) secara otomatis. Jika anda bekerja dengan komputasi awan AWS, AWS telah menyediakan beberapa alat kerja (tool) pendukung IaC yaitu CloudFormation. Selain itu, ada juga open source tool yang populer untuk mengotomasi penyedian infrastruktur di AWS Cloud yaitu Terraform. Kedua tool tersebut memberikan kemudahaan untuk membuat dan menyediakan infrastruktur dengan lebih terprediksi (resiko kesalahannya kecil) dan juga kemudahaan untuk dijalankan berulang (repeatable).

Dengan CloudFormation Anda dapat membuat template dalam format JSON atau YAML yang memodelkan keseluruhan infrastruktur dan sumberdaya aplikasi di cloud yang ingin Anda siapkan. Sebagai contoh, file ini adalah sebuah template CloudFormation yang dapat Anda gunakan untuk menyiapkan infrastruktur aplikasi LAMP (Linux, Apache HTTP Server, MySQL, PHP) yang handal (reliable) dengan menggunakan EC2 instance sebagai Linux server yang menjalankan HTTP Server dan PHP dengan Auto Scaling Group dan Load Balancer serta Amazon RDS database dengan konfigurasi multi-AZ. Di contoh template file tersebut tidak dipesifikasikan infrastruktur dari networtk seperti VPC, subnet, Internet Gateway, NAT Gateway dan lain-lain, Anda dapat bayangkan bagaimana kompleknya membuat file tersebut.

Tapi membuat file JSON/YAML template bukan satu-satunya cara, AWS memberikan kemudahan dengan menyediakan AWS Cloud Development Kit (AWS CDK). AWS CDK adalah sebuah framework open source untuk memodelkan serta menyiapkan infrastruktur atau sumberdaya aplikasi Anda di AWS dengan menggunakan bahasa pemrograman.

Perbedaan AWS CDK dan AWS SDK

Ini menarik, tapi buat Anda yang sudah tau tentang AWS Software Development Kit (SDK) mungkin bertanya-tanya apa bedanya AWS CDK dengan AWS SDK sebab dengan AWS SDK pun kita bisa membuat pemrograman untuk menyiapkan infrastruktur atau sumberdaya aplikasi. Berikut contoh program JavaScript sederhana yang menggunakan AWS SDK untuk menyiapkan sebuah EC2 instance.

const AWS = require("aws-sdk");

AWS.config.update({region: [exampleRegion]});

let params = {
  ImageId: "ami-abc12345",
  InstanceType: "t2.micro",
  KeyName: "key-pair-name",
  MaxCount: 1,
  MinCount: 1,
  SecurityGroups: ["my-security-group-name-XXXX",],
};

const ec2 = new AWS.EC2();
ec2.runInstances(params, function(err, data) {
  if (err) {
    console.log(err, err.stack); 
  } else {
    console.log(data); 
  }
});

Perbedaan utama AWS CDK dengan AWS SDK adalah AWS CDK menggunakan CloudFormation dibelakang layar. Anda tidak perlu punya pengetahuan tentang CloudFormation untuk menggunakan AWS CDK tetapi Anda akan mendapatkan keuntungan lebih dibandingkan model pemrograman AWS SDK, misalnya:

  • Abstraksi yang lebih tinggi dari sumberdaya AWS cloud, sehingga Anda dapat membuat sumberdaya tersebut tanpa perlu tau detil bagaimana sumberdaya tersebut dikonfigurasi. Komponen-komponen sumberdaya cloud yang dienkapsulasi disebut constructs. Anda akan lihat nanti di artikel ini bagaimana kita membuat sebuah EC2 instance dengan
  • Kemudahan untuk melakukan rollback jika terjadi kegagalan dalam menyiapkan sumberdaya, maupun kemudahaan untuk menghapus semua sumberdaya aplikasi jika sudah tidak diperlukan.
  • Kemudahan untuk mengubah kondisi (state) dari infrastruktur yang sudah dibuat, misalnya menambahkan sumberdaya baru atau menghapus sumberdaya yang sudah ada. Bahkan anda dapat melihat perbedaan kondisi sebelum perubahan benar-benar dilakukan.

Memulai menggunakan AWS CDK.

Sekarang kita akan mulai mencoba menggunakan AWS CDK.

Pertama yang perlu anda siapakan adalah sebagai berikut:

Untuk mulai menginstal AWS CDK kita membutuhkan NodeJS. Anda akan install NodeJS dengan menggukan NodeJS version management tool untuk mempermudah pekerjaan Anda, terutama jika di komputer Anda sudah terdapat NodeJS dengan versi yang berbeda yang dibutuhkan AWS CDK.

Jika anda sudah memiliki NodeJS versi ≥ 10.12.0, anda bisa lewati langkah pertama dan kedua.

  1. Instal NodeJS version management tool. Anda dapat menggunakan nvm atau n. Di tutorial ini saya akan menggunakan n.

    curl -L https://raw.githubusercontent.com/tj/n/master/bin/n -o n
    mv n /usr/local/bin
  2. Instal NodeJS versi Long Term Support (LTS) terkini.

    bash n lts
    

    Kemudian cek versi NodeJS dengan perintah berikut dan pastikan outputnya adalah versi yang sama atau lebih baru dari 10.12.0

    node --version
    
  3. Kita akan menggunakan TypeScript sebagai bahasa pemrograman dalam tutorial ini, oleh karena itu kita instal TypeScript dengan perintah berikut:

    npm install -g typescript
    
  4. Instal AWS CDK dengan perintah berikut

    npm install -g aws-cdk
    

    AWS CDK akan memberikan command line interface (CLI) dan juga library untuk membangun kode. Kita bisa coba cek CDK CLI dengan perintah berikut

    cdk --version
    

    Keluaran perintah itu adalah versi CDK CLI. Versi yang saya dapatkan saat membuat artikel ini adalah 1.32.1 (build d0dfe79)

  5. Sekarang CDK sudah terinstall dan Anda bisa memulai membuat aplikasi CDK. Kita akan mulai dengan proyek kecil yang sangat mudah yaitu membuat sebuah EC2 instance yang menjalankan sebuah aplikasi Web Server menggunakan Nginx. Pertama buatlah direktori dengan nama ec2-web untuk meyimpan kode Anda, kemudian kita akan inisiasi dengan peruntah cdk init:

    mkdir ec2-web
    cd ec2-web
    cdk init --language typescript

    Hasil dari perintah tersebut akan mendapatkan struktur direktori seperti berikut:

    ec2-web
    ├── README.md
    ├── bin
    │   └── ec2-web.ts
    ├── cdk.json
    ├── jest.config.js
    ├── lib
    │   └── ec2-web-stack.ts
    ├── node_modules
    │   ├── @aws-cdk
    │   ├── .....
    ├── package-lock.json
    ├── package.json
    ├── test
    │   └── ec2-web.test.ts
    └── tsconfig.json   
    
  6. Instal pustaka atau module dari CDK untuk bekerja dengan EC2 dengan perintah berikut:

    npm install @aws-cdk/aws-ec2
    
  7. Edit file ec2-web-stack.ts yang ada di direktori ec2-web/lib/ menjadi seperti ini

    import * as ec2 from "@aws-cdk/aws-ec2";
    import * as cdk from '@aws-cdk/core';
    import fs = require('fs');
    import { UserData } from "@aws-cdk/aws-ec2";
    
    export class Ec2WebStack extends cdk.Stack {
      constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
    
        // Kita akan menggunakan default VPC
        const vpc = ec2.Vpc.fromLookup(this, 'VPC', { isDefault : true } );
    
        // Membuat SecurtyGroup untuk membuka akses port SSH dan HTTP
        const mySecurityGroup = new ec2.SecurityGroup(this, 'SecurityGroup', {
          vpc,
          securityGroupName: "my-webserver-sg",
          description: 'Allow ssh access to ec2 instances from anywhere',
          allowAllOutbound: true 
        });
        mySecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(22), 'allow public ssh access')
        mySecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(80), 'allow public http access')
    
        // Kita akan gunakan Amazon Linux 2 AMI untuk web server 
        const awsAMI = new ec2.AmazonLinuxImage({ generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2 });
    
        // Menyiapkan skrip untuk instalasi Nginx saat pertama kali server dibuat
        const userData = ec2.UserData.forLinux({ shebang: "#!/bin/bash" });
        var array: string[] = fs.readFileSync('userdata/install_nginx.sh', 'utf8').toString().split('\n');
        userData.addCommands(...array)
    
        // Membuat EC2 instance untuk web server 
        const ec2Instance = new ec2.Instance(this, 'Instance', {
          vpc,
          instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.SMALL),
          machineImage: awsAMI,
          securityGroup: mySecurityGroup,
          vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC },
          userData: userData
        });
        
        // Keluaran nama hostname dari EC2 instance yang akan diakses
        new cdk.CfnOutput(this, 'WebServerDNSName', { value: ec2Instance.instancePublicDnsName });       
      }
    }

    Kode tersebut membutuhkan file lain yaitu install_nginx.sh yang perlu disimpan di direktori ec2-web/userdata/. File tersebut adalah file EC2 userdata yaitu script yang akan dijalankan ketika EC2 instan mulai dihidupkan. Buatlah direktori dan file tersebut dengan perintah berikut:

    mkdir -p userdata
    
    cat <<EOF >userdata/install_nginx.sh
    sudo yum update -y
    sudo amazon-linux-extras install docker
    sudo service docker start
    sudo usermod -a -G docker ec2-user
    mkdir -p /var/www
    echo "<h1>Welcome to my website!<h1>" > /var/www/index.html
    docker run --name mynginx -v /var/www:/usr/share/nginx/html:ro -p 80:80 -d nginx
    EOF
  8. Lalu edit file ec2-web/bin/ec2-web.ts seperti berikut:

    #!/usr/bin/env node
    import 'source-map-support/register';
    import * as cdk from '@aws-cdk/core';
    import { Ec2WebStack } from '../lib/ec2-web-stack';
    
    const app = new cdk.App();
    new Ec2WebStack(app, 'Ec2WebStack',{
        env: {
            region: process.env.AWS_REGION,
            account: process.env.ACCOUNT_ID
        }
    
    });   
  9. Persiapkan environment variables ACCOUNT_ID dengan nilai AWS account ID yang Anda gunakan, dan AWS_REGION dengan nilai kode AWS region dimana sumberdaya aplikasi akan disiapkan:

    export ACCOUNT_ID="XXXXXXXXXXXX" 
    export AWS_REGION="us-east-1"

    Catatan: Sebelum lanjut ke langkah berikutnya, uji coba AWS CLI untuk memastikan Anda sudah menyiapkan konfigurasi credential dengan memasang aws_access_key_id dan aws_secret_access_key. Anda bisa cek dengan perintah berikut:

    aws ec2 describe-instances  
    # Atau..
    aws cloudformation list-stacks
    

    Jika Anda tidak mendapatkan pesan kesalahan, berarti Anda siap lanjut ke langkah berikutnya.

  10. Sebelum Anda melakukan deployment dari infrastruktur yang telah dituliskan dalam kode TypeScript diatas, Anda dapat mencoba melihat apa yang akan dilakukan oleh CDK dengan perintah cdk diff. Perintah ini biasanya digunakan untuk membandingkan stack yang dibuat di kode dengan stack yang sudah di-deploy.

    cdk diff
    

    Keluaran perintah tersebut akan seperti ini:

    image

  11. Sekarang kita lakukan deployment dengan perintah berikut:

    cdk deploy
    

    Keluaran perintah tersebut jika sukses akan seperti ini:

    image

  12. Selamat, Anda sudah menyipkan sebuah Nginx web server dengan AWS CDK. Sekarang Anda dapat mengakses web server tersebut menggunakan browser ke URL yang tertera pada Outputs "Ec2WebStack.WebServerDNSName", dalam contoh keluaran saya di gambar diatas yaitu http://ec2-54-160-20-80.compute-1.amazonaws.com

    image

    Anda juga bisa lihat di CloudFormation Console, sebuah Stack sudah dibuat:

    image

  13. Jika Anda ingin memghapus semua infrastruktur yang sudah dibuat tadi, Anda dapat dengan mudah menjalankan perintah berikut:

    cdk destroy
    

    Keluaran perintah tersebut jika sukses adalah seperti berikut:

    image

Sejauh ini saya harapkan Anda sudah mendapatkan gambaran tentang AWS CDK. Jika anda tertarik mengeksplorasi lebih lanjut, saya sarankan untuk mengikuti tutorial di cdkworkshop.com.

Catatan

Tidak ada biaya untuk penggunaan AWS CDK ataupun CloudFormation, tetapi sumberdaya AWS yang dibuat menggunakan kedua alat tersebut mungkin akan memerlukan biaya, dalam contoh diatas EC2 instance yang dibuat dari skrip CDK akan menimbulkan biaya karena melewati batas free tier. Jika hanya untuk mencoba, jangan lupa untuk menghapus resources yang sudah anda gunakan untuk menghindari biaya yang tidak diinginkan.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment