ทําให้ใช้งานได้และเรียกใช้คอนเทนเนอร์ด้วย Cloud Run บน Node.js

Cloud Run เป็นแพลตฟอร์มการประมวลผลที่มีการจัดการซึ่งทําให้คุณเรียกใช้คอนเทนเนอร์แบบไม่เก็บสถานะที่เรียกใช้ผ่านคําขอ HTTP ได้ Cloud Run เป็นแบบ Serverless ซึ่งจะช่วยให้คุณไม่จําเป็นต้องจัดการโครงสร้างพื้นฐาน เพื่อโฟกัสกับสิ่งที่สําคัญที่สุดคือการสร้างแอปที่ยอดเยี่ยม การดําเนินการนี้สร้างจาก Knative ซึ่งช่วยให้คุณเรียกใช้คอนเทนเนอร์ด้วย Cloud Run (มีการจัดการครบวงจร) หรือ Cloud Run สําหรับ Anthos ได้ เป้าหมายของ Codelab นี้คือเพื่อให้คุณสร้างอิมเมจคอนเทนเนอร์และทําให้ใช้งานได้กับ Cloud Run

ข้อกำหนดเบื้องต้น

ไม่มีข้อมูล

การตั้งค่าสภาพแวดล้อมด้วยตนเอง

หากยังไม่มีบัญชี Google (Gmail หรือ Google Apps) คุณต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud Platform (console.cloud.google.com) และสร้างโปรเจ็กต์ใหม่ ดังนี้

ภาพหน้าจอจาก 2016-02-10 12:45:26.png

โปรดทราบว่ารหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ํากันสําหรับโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อข้างต้นมีผู้อื่นนําไปใช้แล้ว ขออภัยในความไม่สะดวก) และจะเรียกใน Codelab นี้ว่า PROJECT_ID ในภายหลัง

จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากรของ Google Cloud

การเรียกใช้ Codelab นี้ไม่ควรมีค่าใช้จ่ายเกิน 2-3 ดอลลาร์ แต่อาจมากกว่านั้นหากคุณตัดสินใจใช้ทรัพยากรเพิ่มเติมหรือปล่อยให้ทรัพยากรทํางาน (ดู "cleanup" ในตอนท้ายของเอกสารนี้)

ผู้ใช้ใหม่ของ Google Cloud Platform มีสิทธิ์รับช่วงทดลองใช้ฟรี $300

Cloud Shell

แม้ว่า Google Cloud จะทํางานจากแล็ปท็อปได้จากระยะไกล แต่คุณใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคําสั่งที่ทํางานใน Google Cloud

เครื่องเสมือนบน Debian นี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหน้าแรกขนาด 5 GB ถาวรและทํางานอยู่ใน Google Cloud ซึ่งช่วยปรับปรุงประสิทธิภาพและการตรวจสอบสิทธิ์ของเครือข่ายได้อย่างมาก ซึ่งหมายความว่า เพียงแค่ใช้ Codelab นี้ คุณก็สามารถใช้เบราว์เซอร์ได้ (ใช่บนอุปกรณ์ Chromebook)

หากต้องการเปิดใช้งาน Google Cloud Shell เพียงคลิกปุ่มด้านขวาบนของคอนโซลของนักพัฒนาซอฟต์แวร์ (ใช้เวลาเพียงไม่กี่นาทีในการจัดสรรและเชื่อมต่อกับสภาพแวดล้อม) โดยทําดังนี้

เมื่อเปิดใช้งาน CloudShell

คลิกปุ่ม "เริ่ม Cloud Shell"

Screen Shot 2017-06-14 เวลา 22.13.43 น. (png)

เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ตรวจสอบว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว และมีการตั้งค่าโปรเจ็กต์เป็น PROJECT_ID แล้ว:

gcloud auth list

เอาต์พุตจากคําสั่ง

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

เอาต์พุตจากคําสั่ง

[core]
project = <PROJECT_ID>

นอกจากนี้ Cloud Shell จะตั้งค่าตัวแปรสภาพแวดล้อมโดยค่าเริ่มต้นด้วย ซึ่งอาจเป็นประโยชน์เมื่อเรียกใช้คําสั่งในอนาคต

echo $GOOGLE_CLOUD_PROJECT

เอาต์พุตจากคําสั่ง

<PROJECT_ID>

หากไม่ได้ตั้งค่าโปรเจ็กต์ไว้ด้วยเหตุผลบางประการ เพียงใช้คําสั่งต่อไปนี้

gcloud config set project <PROJECT_ID>

กําลังมองหา PROJECT_ID ของคุณอยู่ใช่ไหม โปรดดูรหัสที่คุณใช้ในขั้นตอนการตั้งค่าหรือค้นหาในแดชบอร์ดของคอนโซล

Project_ID.png

ข้อสําคัญ: สุดท้าย กําหนดโซนเริ่มต้นและการกําหนดค่าโปรเจ็กต์ดังนี้

gcloud config set compute/zone us-central1-f

คุณเลือกได้หลายโซน ดูข้อมูลเพิ่มเติมในเอกสารประกอบเกี่ยวกับภูมิภาคและภูมิภาค

เปิดใช้ Cloud Run API

เปิดใช้ Cloud Run API จาก Cloud Shell

gcloud services enable run.googleapis.com

ซึ่งน่าจะทําให้เกิดข้อความที่ประสบความสําเร็จคล้ายกับข้อความนี้:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

คุณจะสร้างแอป Node.js แบบด่วนที่ใช้ง่ายซึ่งตอบสนองต่อคําขอ HTTP ได้

หากต้องการสร้างแอป ให้ใช้ Cloud Shell เพื่อสร้างไดเรกทอรีใหม่ชื่อ helloworld-nodejs และเปลี่ยนไดเรกทอรีลงในไดเรกทอรี

mkdir helloworld-nodejs
cd helloworld-nodejs

สร้างไฟล์ package.json ที่มีเนื้อหาต่อไปนี้

{
  "name": "cloudrun-helloworld",
  "version": "1.0.0",
  "description": "Simple hello world sample in Node",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

สิ่งสําคัญที่สุดคือไฟล์ด้านบนมีคําสั่งสคริปต์เริ่มต้นและการพึ่งพาเฟรมเวิร์กเว็บแอป Express

จากนั้นให้สร้างไฟล์ index.js ในไดเรกทอรีเดียวกันและคัดลอกเนื้อหาต่อไปนี้ลงในไดเรกทอรี

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

โค้ดดังกล่าวจะสร้างเว็บเซิร์ฟเวอร์พื้นฐานที่ฟังในพอร์ตที่กําหนดโดยตัวแปรสภาพแวดล้อม PORT ตอนนี้แอปพร้อมให้คอนเทนเนอร์ ทดสอบ และอัปโหลดไปที่ Container Registry แล้ว

หากต้องการคอนเทนเนอร์แอปตัวอย่าง ให้สร้างไฟล์ใหม่ชื่อ Dockerfile ในไดเรกทอรีเดียวกับไฟล์แหล่งที่มา แล้วคัดลอกเนื้อหาต่อไปนี้ลงในไฟล์

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]

จากนั้นสร้างอิมเมจคอนเทนเนอร์โดยใช้ Cloud Build โดยเรียกใช้คําสั่งต่อไปนี้จากไดเรกทอรีที่มี Dockerfile

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

$GOOGLE_CLOUD_PROJECT คือตัวแปรสภาพแวดล้อมที่มีรหัสโปรเจ็กต์ Google Cloud ของคุณเมื่อเรียกใช้ใน Cloud Shell คุณสามารถรับได้โดยการเรียกใช้ gcloud config get-value project

เมื่อพุชไปยังรีจิสทรีแล้ว คุณจะเห็นข้อความ SUCCESS พร้อมชื่อรูปภาพ (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld) รูปภาพจะเก็บอยู่ในรีจิสทรีคอนเทนเนอร์และนํามาใช้ซ้ําได้ หากต้องการ

คุณแสดงรายการรูปภาพคอนเทนเนอร์ทั้งหมดที่เชื่อมโยงกับโปรเจ็กต์ปัจจุบันได้โดยใช้คําสั่งนี้

gcloud container images list

หากคุณต้องการเรียกใช้และทดสอบแอปในเครื่องจาก Cloud Shell คุณสามารถเริ่มทดสอบได้โดยใช้คําสั่ง docker มาตรฐานดังนี้

docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

ใน Cloud Shell ให้คลิกแสดงตัวอย่างเว็บ แล้วเลือกแสดงตัวอย่างบนพอร์ต 8080

ที่เปิดหน้าต่างเบราว์เซอร์ที่ระบุว่าสวัสดีโลก

หรือจะใช้ curl localhost:8080 ก็ได้เช่นกัน

การทําให้แอปที่มีคอนเทนเนอร์ใช้งานได้บน Cloud Run ทําได้โดยใช้คําสั่งต่อไปนี้ (อย่าลืมปรับเป็นชื่อรูปภาพที่ถูกต้องสําหรับแอปที่คุณสร้างหรือใช้รูปภาพที่สร้างไว้ล่วงหน้าของ gcr.io/cloudrun/hello)

gcloud run deploy helloworld \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

ตัวเลือกการทําให้ --allow-unauthenticated ใช้งานได้จะช่วยให้คุณเข้าถึงแอปได้โดยไม่ต้องตรวจสอบสิทธิ์ ตัวเลือกการทําให้ --platform managed \ ใช้งานได้หมายความว่าคุณกําลังขอสภาพแวดล้อมที่มีการจัดการครบวงจร (ไม่ใช่โครงสร้างพื้นฐาน Kubernetes ผ่าน Anthos)

รอสักครู่จนกว่าการติดตั้งใช้งานจะเสร็จสมบูรณ์ เมื่อเสร็จแล้ว บรรทัดคําสั่งจะแสดง URL ของบริการ

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

ตอนนี้คุณไปยังคอนเทนเนอร์ที่ทําให้ใช้งานได้แล้วได้โดยเปิด URL ของบริการในเว็บเบราว์เซอร์

Cloud Run จะปรับขนาดอิมเมจคอนเทนเนอร์โดยอัตโนมัติเพื่อรองรับแนวนอนเมื่อได้รับคําขอ จากนั้นจึงปรับขนาดลงเมื่อความต้องการลดลง คุณจะชําระเงินเฉพาะ CPU, หน่วยความจํา และเครือข่ายที่ใช้ระหว่างการจัดการคําขอเท่านั้น

แม้ว่า Cloud Run จะไม่ชาร์จเมื่อไม่ได้ใช้งานบริการ แต่ระบบอาจยังเรียกเก็บเงินจากการจัดเก็บรูปภาพคอนเทนเนอร์ที่สร้างขึ้น

คุณลบโปรเจ็กต์ Google Cloud เพื่อหลีกเลี่ยงการเรียกเก็บเงินซึ่งจะเป็นการหยุดการเรียกเก็บเงินสําหรับทรัพยากรทั้งหมดที่ใช้สําหรับโปรเจ็กต์นั้น หรือเพียงแค่ลบรูปภาพ Helloworld โดยใช้คําสั่งนี้

gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

หากต้องการลบบริการ Cloud Run ให้ใช้คําสั่งนี้

gcloud run services delete helloworld \
  --platform managed \
  --region us-central1

ยินดีด้วย คุณทําให้แอปที่อยู่ในแพ็กเกจคอนเทนเนอร์ใช้งานได้กับ Cloud Run แล้ว

ดูข้อมูลเพิ่มเติม

ขั้นตอนถัดไปที่ดีคือการอัปเดต Quickstart: Deploy to Cloud Run for Anthos ใน Google Cloud

ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างคอนเทนเนอร์ HTTP แบบไม่เก็บสถานะซึ่งเหมาะสําหรับ Cloud Run จากแหล่งที่มาโค้ด แล้วพุชไปยัง Container Registry ได้ในแหล่งข้อมูลต่อไปนี้

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Knative ซึ่งเป็นโปรเจ็กต์โอเพนซอร์สแบบโอเพนซอร์สได้ที่Knative