Tautan ke halaman ini: https://bit.ly/39Wd55j
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.
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.
Sekarang kita akan mulai mencoba menggunakan AWS CDK.
Pertama yang perlu anda siapakan adalah sebagai berikut:
- Memiliki akun AWS dan dapat login menggunakan IAM user yang memiliki role Administrator
- Instal AWS CLI
- Instal Visual Studio Code dan AWS Toolkit extension
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.
-
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
-
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
-
Kita akan menggunakan TypeScript sebagai bahasa pemrograman dalam tutorial ini, oleh karena itu kita instal TypeScript dengan perintah berikut:
npm install -g typescript
-
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)
-
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 peruntahcdk 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
-
Instal pustaka atau module dari CDK untuk bekerja dengan EC2 dengan perintah berikut:
npm install @aws-cdk/aws-ec2
-
Edit file
ec2-web-stack.ts
yang ada di direktoriec2-web/lib/
menjadi seperti iniimport * 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 direktoriec2-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
-
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 } });
-
Persiapkan environment variables
ACCOUNT_ID
dengan nilai AWS account ID yang Anda gunakan, danAWS_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
danaws_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.
-
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:
-
Sekarang kita lakukan deployment dengan perintah berikut:
cdk deploy
Keluaran perintah tersebut jika sukses akan seperti ini:
-
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
Anda juga bisa lihat di CloudFormation Console, sebuah Stack sudah dibuat:
-
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:
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.
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.