Coding Gun

รู้จักกับ AWS SDK

AWS SDK(Software Development Kit) คือ เครื่องมือที่ช่วยให้ Developer สามารถสร้าง Application หรือ Library เพื่อควบคุมการทำงานของ AWS ได้ด้วยภาษาต่างๆเหล่านี้

จะเห็นได้ว่า AWS มีทางเลือกให้กับนักพัฒนาทุกๆค่าย ทำให้ Developer สามารถเขียน Application ขึ้นมาเพื่อควบคุมการทำงานของ AWS ได้โดยไม่ต้องเรียนรู้ภาษาใหม่ และในบทความนี้เราจะใช้ตัวอย่าง AWS SDK ด้วย JavaScript

AWS SDK Version 3

ในปัจจุบัน AWS SDK พัฒนามาถึง Version 3 ซึ่งจะมีสิ่งที่แตกต่างไปจาก Version 2 ดังนี้

Modularize Package

ทำการแยก package ออกไปตาม Services ต่างๆของ AWS ซึ่งใน Version 2 จะเป็นการ import เข้ามาทั้งก้อนแบบนี้

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

แต่ใน Version 3 เราจะ import เข้ามาเป็น module แบบนี้่

import { DynamoDB } from "@aws-sdk/client-dynamodb";

นอกจากจะ import เข้ามาทั้ง module เราสามารถเลือกทีละ function หรือ method แบบนี้ก็ได้

import {
  DynamoDBClient,
  ListTablesCommand
} from "@aws-sdk/client-dynamodb";

DynamoDBClient และ ListTableCommand จะอยู่ใน submodule ชื่อ client-dynamodb

New Middleware Stack

ใน Version 2 เราจะต้องจัดการกับ stage ต่างๆของการส่งและรับ request เองซึ่งจะทำให้ debug ได้ยาก

แต่ใน Version 3 เราจะสามารถใช้ Middleware ในการแบ่ง Stage ของ Request Lifecycle แบบนี้

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
dbclient.middlewareStack.add(
  (next, context) => args => {
    args.request.headers["Custom-Header"] = "value";
    return next(args);
  },
  {
    step: "build"
  }
);  

dbclient.send(new PutObjectCommand(params));

ในตัวอย่างนี้จะเป็นการเพิ่ม Custom Header เข้าไปในบรรทัดที่ 3 โดยจะใช้การเพิ่ม middleware เข้าไปด้วยึคำสั่ง dbclient.middlewareStack.add ในบรรทัดที่ 1

AWS SDK for JavaScript

การใช้งาน AWS SDK ด้วย JavaScript จะสามารถสร้าง Automation Script ได้ทั้ง Server-side และ Client-side

AWS SDK version 3
Amazon SDK สำหรับ JavaScript
เราจึงสาามารถนำ Script ไป run ได้ทั้ง

  1. Run script ด้วย NodeJS บน Server
  2. Run script ผ่าน Front-end framework บน browser(วิธีนี้ต้องระวังเรื่องการจัดเก็บ AWS Secret Key เพราะ Browser จะเก็บความลับไม่ได้)
  3. Run script ผ่าน React Native สำหรับนำไปสร้างเป็น Mobile Application

ซึ่งจะเห็นว่าการใช้ Javascript นั้นสามารถใช้ภาษาเดียวแต่ตอบโจทย์ได้ทั้ง API, Server-side, Client-side และ Mobile Application

ในบทความนี้เราจะยกตัวอย่างการใช้งานผ่าน NodeJS

ขั้นตอนการใข้งาน AWS SDK บน Node JS

ในตัวอย่างนี้เราจะใช้ JavaScript ดึงรายชื่อ Buckets ที่อยู่ใน S3 โดยจะมีขั้นตอนต่างๆ ดังนี้

ขั้นตอนที่ 1 ติดต้ัง AWS SDK

อย่างแรกเราต้อง install npm package เข้ามาก่อน โดยใช้คำสั่ง

$ npm i @aws-sdk/client-s3

ขั้นตอนที่ 2 ทำการ Import

ในขั้นตอนนี้เราต้อง import submodule หรือ command เข้ามาใช้งาน โดยจะเริ่มจาก

ขั้นตอนที่ 3 สร้าง Main Function

ในขั้นตอนนี้เราจะสร้าง main function ขึ้นมาแล้วก็ connect กับ Amazon S3 ด้วย s3client

1
2
3
4
5
6
7
8
9
export async function main() {
    const s3Client = new S3Client({});
}

// จะเรียกใช้ main() ถ้าเรา run ผ่าน command ในขั้นตอนที่ 5
import { fileURLToPath } from "url";
if (process.argv[1] === fileURLToPath(import.meta.url)) {
  main();
}

ถ้าเราไม่ได้ใส่ credentials หรือ config ให้กับ s3Client ตัว SDK จะไปอ่าน configuration ที่อยู่ใน configuration folder

ลองอ่านเรื่องการจัดการ AWS CLI ต่อได้ที่นี่

แต่ถ้าเราต้องการใส่เข้าไปใน Code โดยตรงเราสามารถเขียนแบบนี้ก็ได้

1
const s3Client = new S3.S3Client({region: 'us-west-2'});

ขั้นตอนที่ 4 List รายชื่อ Bucket ใน S3

ในขั้นตอนนี้เราสามารถสั่ง List รายชื่อ S3 Bucket ออกมาด้วยคำสั่ง

1
2
3
4
5
6
7
8
9
export async function main() {
    const s3Client = new S3Client({});
    const command = new ListBucketsCommand({});

    const { Buckets } = await client.send(command);
    console.log("Buckets: ");
    console.log(Buckets.map((bucket) => bucket.Name).join("\n"));
    return Buckets;
}

Extract Method ListBuckets

ในตอนนำไปใช้งานจริง เราอาจต้องแยก method ListBuckets ออกมา เพราะเราจะมีคำสั่ง อื่นๆอีกเยอะมาก ตัวอย่างของการแยก method ListBuckets ออกมาจะเป็นแบบนี้

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
export const listBucket = async () => {
  const command = new ListBucketsCommand({});

  const { Buckets } = await client.send(command);
  console.log("Buckets: ");
  console.log(Buckets.map((bucket) => bucket.Name).join("\n"));
  return Buckets;
};

// จะเรียกใช้ listbuckets() ถ้าเรา run ผ่าน command ในขั้นตอนที่ 5
if (process.argv[1] === fileURLToPath(import.meta.url)) {
  listBucket();
}

ตัวอย่างถ้าเราต้องการสร้าง Buckets ก่อนแล้วค่อย ListBuckets ออกมาเราจะเขียนแบบนี้

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import {
        S3Client,
        ListBucketsCommand,
        CreateBucketCommand
} from "@aws-sdk/client-s3";

export async function main() {
    const s3Client = new S3Client({});

    await createBucket();
    await listBucket();
}
export async createBucket = async () => {
  const bucketName = `sdk-demo-bucket-${Date.now()}`;
  await s3Client.send(
    new CreateBucketCommand({
        Bucket: bucketName,
    })
  );
};

export const listBucket = async () => {
  const command = new ListBucketsCommand({});
  
  const { Buckets } = await client.send(command);
  console.log("Buckets: ");
  console.log(Buckets.map((bucket) => bucket.Name).join("\n"));
  return Buckets;
};

if (process.argv[1] === fileURLToPath(import.meta.url)) {
  main();
}

เข้าไปดูตัวอย่างแบบเต็มๆ ได้ที่นี่

ขั้นตอนที่ 5 Run Javascript

หลังจากได้ไฟล์ JavaScript ที่เราต้องการแล้ว ก็ให้นำไป run ด้วยคำสั่ง

$ node index.js

หลังจากนั้นเราจะได้รายชื่อ S3 Buckets แสดงใน console

คำเตือน หลังจาก run ตัวอย่างนี้อย่าลืมลบ S3 Bucket ที่สร้างขึ้นมาออกด้วยนะครับ

อ่านคู่มือการใช้งาน AWS SDK ต่อได้ที่นี่

Phanupong Permpimol
Follow me