ดูวิธีเรียกใช้ Cloud Functions ที่ตรวจสอบสิทธิ์แล้ว

1. บทนำ

ภาพรวม

Cloud Functions เป็นโซลูชันการประมวลผลที่ใช้งานง่ายสำหรับนักพัฒนาซอฟต์แวร์ในการสร้างฟังก์ชันแบบสแตนด์อโลนที่มีวัตถุประสงค์เดียว ซึ่งสามารถทริกเกอร์โดยใช้ HTTPS หรือตอบสนองต่อ CloudEvents โดยไม่จำเป็นต้องจัดการเซิร์ฟเวอร์หรือสภาพแวดล้อมรันไทม์

การควบคุมการเรียกใช้ Cloud Functions ทำได้ 2 วิธีหลักๆ ได้แก่ การรักษาความปลอดภัยในการเข้าถึงตามข้อมูลประจำตัว และการรักษาความปลอดภัยในการเข้าถึงโดยใช้การควบคุมการเข้าถึงตามเครือข่าย Codelab นี้มุ่งเน้นที่แนวทางแรกและแนะนำ 3 สถานการณ์ในการรักษาความปลอดภัยในการเข้าถึงตามข้อมูลประจำตัวเพื่อเรียกใช้ฟังก์ชัน

  1. ใช้โทเค็นข้อมูลประจำตัว gcloud เพื่อเรียกใช้ฟังก์ชันเพื่อวัตถุประสงค์ในการพัฒนาและการทดสอบในเครื่อง
  2. แอบอ้างเป็นบัญชีบริการเมื่อพัฒนาและทดสอบในเครื่องเพื่อใช้ข้อมูลเข้าสู่ระบบเดียวกันกับในเวอร์ชันที่ใช้งานจริง
  3. ใช้ไลบรารีของไคลเอ็นต์ Google เพื่อจัดการการตรวจสอบสิทธิ์ไปยัง Google Cloud APIs เช่น เมื่อบริการต้องเรียกใช้ฟังก์ชัน

สิ่งที่คุณจะได้เรียนรู้

  • วิธีกำหนดค่าการตรวจสอบสิทธิ์ใน Cloud Functions และยืนยันว่าได้กำหนดค่าการตรวจสอบสิทธิ์อย่างถูกต้อง
  • เรียกใช้ฟังก์ชันที่ได้รับการตรวจสอบสิทธิ์จากสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ในเครื่องโดยระบุโทเค็นสำหรับข้อมูลประจำตัว gcloud
  • วิธีสร้างบัญชีบริการและมอบบทบาทที่เหมาะสมเพื่อเรียกใช้ฟังก์ชัน
  • วิธีแอบอ้างเป็นบริการจากสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ในเครื่องที่มีบทบาทที่เหมาะสมสำหรับการเรียกใช้ฟังก์ชัน

2. การตั้งค่าและข้อกำหนด

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

  • คุณเข้าสู่ระบบ Cloud Console แล้ว
  • คุณได้ทําการติดตั้งใช้งาน Cloud Function รุ่นที่ 2 ที่ทริกเกอร์ HTTP ไว้ก่อนหน้านี้
  • (ไม่บังคับ) สำหรับสถานการณ์ที่ 3 Codelab นี้ใช้ Node.js และ npm เป็นตัวอย่าง แต่คุณสามารถใช้รันไทม์ใดก็ได้ที่ไลบรารีของไคลเอ็นต์ Google Auth รองรับ

เปิดใช้งาน Cloud Shell

  1. จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell 853e55310c205094.png

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน

9f0e51b578fecce5.png

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

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

  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list

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

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project

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

[core]
project = <PROJECT_ID>

หากไม่ได้ตั้งค่าไว้ คุณสามารถตั้งค่าได้ด้วยคำสั่งนี้

gcloud config set project <PROJECT_ID>

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

Updated property [core/project].

3. สร้างและทดสอบ Cloud Function ที่ตรวจสอบสิทธิ์แล้ว

Codelab นี้ทำตามวิธีการเดียวกันกับคู่มือเริ่มใช้งานฉบับย่อของ Console สำหรับ Cloud Functions โดยมีข้อยกเว้นที่สำคัญอย่างหนึ่งคือฟังก์ชันของคุณจะต้องมีการตรวจสอบสิทธิ์

การกำหนดให้มีการตรวจสอบสิทธิ์หมายความว่าหลักการที่เรียกใช้ฟังก์ชันต้องมีบทบาทผู้เรียกใช้ Cloud Functions (และผู้เรียกใช้ Cloud Run สำหรับรุ่นที่ 2) มิฉะนั้นฟังก์ชันจะแสดงข้อผิดพลาด 403 Forbidden Codelab นี้จะแสดงวิธีให้บทบาทผู้เรียกใช้ที่เหมาะสมแก่หลักการ

สร้างฟังก์ชันที่ได้รับการตรวจสอบสิทธิ์

ขั้นตอนการใช้ Cloud Console มีดังนี้

  1. ไปที่หน้าภาพรวมของ Cloud Functions แล้วคลิกสร้างฟังก์ชัน
  2. ในตัวเลือกสภาพแวดล้อม ให้เลือกรุ่นที่ 2
  3. ตั้งชื่อฟังก์ชันเป็น my-authenticated-function
  4. ในช่องการตรวจสอบสิทธิ์ ให้ใช้ค่าเริ่มต้นเป็นต้องมีการตรวจสอบสิทธิ์

936eee0d5930d12b.png

  1. คลิกถัดไป
  2. คุณเลือกภาษาใดก็ได้สำหรับ Codelab นี้
  3. จากนั้นกดทำให้ใช้งานได้

การติดตั้งใช้งานฟังก์ชันจะใช้เวลาประมาณ 1 นาที

ตั้งค่าตัวแปรสภาพแวดล้อมในเครื่องเพื่อให้คำสั่ง gcloud ง่ายขึ้น

ก่อนอื่น คุณจะสร้างตัวแปรสภาพแวดล้อม 2-3 ตัวเพื่อปรับปรุงความสามารถในการอ่านของคำสั่ง gcloud ที่ใช้ใน Codelab นี้

คุณจะต้องระบุภูมิภาคสำหรับฟังก์ชัน ตัวอย่างนี้ใช้ us-central1

REGION="us-central1"

จากนั้นคุณจะบันทึก URL ของฟังก์ชันเป็นตัวแปรสภาพแวดล้อมเพื่อใช้ในภายหลังได้

PROJECT_ID=$(gcloud config get-value project)
FUNCTION_URL="$(gcloud functions describe my-authenticated-function --gen2 --region us-central1 --format='get(serviceConfig.uri)')"

ยืนยันว่าฟังก์ชันต้องมีการตรวจสอบสิทธิ์โดยพยายามเรียกใช้ในฐานะผู้เรียกที่ไม่ระบุตัวตน

คุณจะเรียกใช้ฟังก์ชันโดยไม่ต้องมีการตรวจสอบสิทธิ์เพื่อยืนยันว่าคุณได้รับข้อผิดพลาด 403 ตามที่คาดไว้

จากบรรทัดคำสั่ง ให้เรียกใช้คำสั่ง curl ต่อไปนี้

curl $FUNCTION_URL

คุณจะเห็นผลลัพธ์ต่อไปนี้

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>403 Forbidden</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Forbidden</h1>
<h2>Your client does not have permission to get URL <code>/</code> from this server.</h2>
<h2></h2>
</body></html>

ตอนนี้คุณพร้อมที่จะดู 3 สถานการณ์ที่คุณเรียกใช้ฟังก์ชันได้โดยการให้การตรวจสอบสิทธิ์แล้ว

4. สถานการณ์ที่ 1: ใช้โทเค็นข้อมูลประจำตัว gcloud

ในฐานะนักพัฒนาซอฟต์แวร์ คุณคงต้องการวิธีทดสอบฟังก์ชันขณะพัฒนาในเครื่อง ในส่วนนี้ คุณจะทำการทดสอบอย่างรวดเร็วเพื่อยืนยันว่าฟังก์ชันได้รับการตรวจสอบสิทธิ์อย่างถูกต้องโดยใช้ข้อมูลประจำตัวของคุณเอง

ตรวจสอบว่าคุณได้รับการตรวจสอบสิทธิ์โดยใช้ gcloud โดยเรียกใช้คำสั่งต่อไปนี้

gcloud auth list

คุณจะเห็นเครื่องหมายดอกจันข้างข้อมูลประจำตัวที่ใช้งานอยู่ เช่น

Credentialed Accounts
ACTIVE  ACCOUNT

*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

เมื่อยืนยันว่าคุณใช้ข้อมูลประจำตัวที่ถูกต้องแล้ว ให้บันทึกอีเมลของบัญชีลงในตัวแปรสภาพแวดล้อม

ACCOUNT_EMAIL=$(gcloud auth list --filter=status:ACTIVE --format="value(account)")

ดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่า gcloud init และ gcloud auth login ได้ในเอกสารประกอบ

จากนั้นเรียกใช้ฟังก์ชันและส่งโทเค็นข้อมูลประจำตัว

curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token)"

ตอนนี้คุณจะเห็นผลลัพธ์ดังนี้

Hello World!

การแก้ปัญหา

หากได้รับข้อผิดพลาด 403 Forbidden โปรดตรวจสอบว่าข้อมูลประจำตัวของคุณมีบทบาทผู้เรียกใช้ Cloud Functions หรือบทบาทผู้เรียกใช้ Cloud Run สำหรับฟังก์ชันรุ่นที่ 2 คุณใช้คอนโซล IAM เพื่อยืนยันบทบาทที่มอบให้แก่ผู้ใช้หลักได้

แม้ว่าการใช้โทเค็นประจำตัวของคุณเองจะเป็นวิธีที่รวดเร็วในการทดสอบฟังก์ชันระหว่างการพัฒนาซอฟต์แวร์ แต่ผู้เรียกใช้ฟังก์ชันที่ได้รับการตรวจสอบสิทธิ์จะต้องมีบทบาทที่เหมาะสม มิฉะนั้นผู้เรียกใช้จะได้รับข้อผิดพลาด 403 Forbidden

คุณควรปฏิบัติตามหลักการให้สิทธิ์ขั้นต่ำที่สุดโดยจำกัดจำนวนข้อมูลประจำตัวและบัญชีบริการที่มีบทบาทในการเรียกใช้ฟังก์ชัน

สร้างบัญชีบริการใหม่และให้บทบาทที่จำเป็นแก่บัญชีดังกล่าว

5. สถานการณ์ที่ 2: แอบอ้างบัญชีบริการ

ในสถานการณ์นี้ คุณจะแอบอ้างเป็น (เช่น สมมติว่ามีสิทธิ์ของ) บัญชีบริการเพื่อเรียกใช้ฟังก์ชันเมื่อพัฒนาและทดสอบในเครื่อง การแอบอ้างเป็นบัญชีบริการช่วยให้คุณทดสอบฟังก์ชันด้วยข้อมูลเข้าสู่ระบบเดียวกันกับในเวอร์ชันที่ใช้งานจริงได้

การทำเช่นนี้ไม่เพียงแต่จะช่วยยืนยันบทบาทเท่านั้น แต่ยังเป็นไปตามหลักการให้สิทธิ์ขั้นต่ำที่สุดด้วย เนื่องจากคุณไม่จำเป็นต้องให้บทบาทผู้เรียกใช้ Cloud Function แก่อัตลักษณ์อื่นๆ เพียงเพื่อวัตถุประสงค์ในการทดสอบในเครื่อง

สำหรับวัตถุประสงค์ของโค้ดแล็บนี้ คุณจะสร้างบัญชีบริการใหม่ที่มีเฉพาะบทบาทในการเรียกใช้ฟังก์ชันที่คุณสร้างในโค้ดแล็บนี้

สร้างบัญชีบริการใหม่

ก่อนอื่น คุณจะต้องสร้างตัวแปรสภาพแวดล้อมเพิ่มเติม 2-3 ตัวเพื่อแสดงบัญชีบริการที่ใช้ในคำสั่ง gcloud

SERVICE_ACCOUNT_NAME="invoke-functions-codelab"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com

จากนั้นคุณจะต้องสร้างบัญชีบริการ

gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
  --display-name="Cloud Function Authentication codelab"

และมอบบทบาทผู้เรียกใช้ Cloud Function ให้กับบัญชีบริการ

gcloud functions add-iam-policy-binding my-authenticated-function \
  --region=us-central1 --gen2 \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role='roles/cloudfunctions.invoker'

เรียกใช้ฟังก์ชันโดยการแอบอ้างบัญชีบริการ

โดยคุณจะแอบอ้างเป็นบัญชีบริการที่สร้างขึ้นใหม่โดยรับโทเค็นรหัสของบัญชี

เพิ่มบทบาทที่จำเป็นสำหรับการแอบอ้างเป็นบุคคลอื่น

หากต้องการแอบอ้างเป็นบัญชีบริการ บัญชีผู้ใช้ของคุณต้องมีบทบาทผู้สร้างโทเค็นบัญชีบริการ (roles/iam.serviceAccountTokenCreator) เพื่อสร้างโทเค็นรหัสสำหรับบัญชีบริการ

gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT_ADDRESS  \
  --member user:$ACCOUNT_EMAIL \
  --role='roles/iam.serviceAccountTokenCreator'

ใช้โทเค็นรหัสของบัญชีบริการ

ตอนนี้คุณสามารถเรียกใช้ฟังก์ชันได้โดยส่งโทเค็นรหัสของบัญชีบริการ

curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token --impersonate-service-account $SERVICE_ACCOUNT_ADDRESS)" 

และคุณจะเห็นข้อมูลต่อไปนี้

WARNING: This command is using service account impersonation. All API calls will be executed as [invoke-functions-codelab@<project-id>.iam.gserviceaccount.com].
Hello World!

6. สถานการณ์ที่ 3: ใช้ไลบรารีของไคลเอ็นต์ Google

สำหรับส่วนสุดท้ายของ Codelab นี้ คุณจะเรียกใช้บริการขนาดเล็กในเครื่องเพื่อสร้างโทเค็นรหัสสำหรับบัญชีบริการ จากนั้นจะเรียกใช้ฟังก์ชันโดยอัตโนมัติโดยใช้ไลบรารีของไคลเอ็นต์ Google Auth และข้อมูลรับรองเริ่มต้นของแอปพลิเคชัน (ADC) อ่านเพิ่มเติมเกี่ยวกับไลบรารีของไคลเอ็นต์ Google ได้ในส่วนคำอธิบายไลบรารีของไคลเอ็นต์ในเอกสารประกอบ

การใช้ ADC มีความสำคัญอย่างยิ่งเมื่อคุณต้องการเขียนและทดสอบฟังก์ชันในเครื่อง (เช่น ในแล็ปท็อป, Cloud Shell ฯลฯ) ขณะโต้ตอบกับทรัพยากรอื่นๆ ของ Google Cloud (เช่น Cloud Storage, Vision API ฯลฯ) ในตัวอย่างนี้ คุณจะเห็นวิธีที่บริการเรียกใช้ฟังก์ชันอื่นที่ต้องมีการตรวจสอบสิทธิ์ ดูข้อมูลเพิ่มเติมเกี่ยวกับ ADC และการพัฒนาในเครื่องได้ที่บล็อกโพสต์วิธีพัฒนาและทดสอบ Cloud Functions ในเครื่อง | บล็อก Google Cloud

เรียกใช้คำสั่ง gcloud เพื่อแอบอ้างบัญชีบริการ

ADC จะค้นหาข้อมูลเข้าสู่ระบบโดยอัตโนมัติตามสภาพแวดล้อมของแอปพลิเคชัน และใช้ข้อมูลเข้าสู่ระบบเหล่านั้นเพื่อตรวจสอบสิทธิ์กับ Google Cloud APIs แฟล็ก –impersonate-service-account ช่วยให้คุณสามารถแอบอ้างเป็นบัญชีบริการได้โดยใช้ข้อมูลประจำตัวของบัญชีเพื่อตรวจสอบสิทธิ์กับ Google Cloud API

หากต้องการแอบอ้างบัญชีบริการ คุณสามารถเรียกใช้คำสั่งต่อไปนี้

gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS

ตอนนี้คุณกำลังเรียกใช้คำสั่ง gcloud ในฐานะบัญชีบริการนั้นแทนที่จะเป็นข้อมูลประจำตัวของคุณ

สร้างและเรียกใช้บริการเพื่อเรียกใช้ฟังก์ชันที่ได้รับการตรวจสอบสิทธิ์

รันไทม์แต่ละรายการมีไลบรารีของไคลเอ็นต์ Google Auth ของตัวเองซึ่งคุณสามารถติดตั้งได้ Codelab นี้จะแนะนำวิธีสร้างและเรียกใช้แอป Node.js ในเครื่อง

ขั้นตอนสำหรับ Node.js มีดังนี้

  1. สร้างแอป Node.js ใหม่
npm init
  1. ติดตั้งไลบรารีของไคลเอ็นต์ Google Auth
npm install google-auth-library
  1. สร้างไฟล์ index.js
  2. ดึง URL ของ Cloud Function ซึ่งคุณจะเพิ่มลงในโค้ดในขั้นตอนต่อไป
echo $FUNCTION_URL
  1. เพิ่มโค้ดต่อไปนี้ลงใน index.js อย่าลืมเปลี่ยนตัวแปร targetAudience เป็น URL ของ Cloud Function

index.js

// Cloud Functions uses your function's url as the `targetAudience` value

const targetAudience = '<YOUR-CLOUD-FUNCTION-URL>';

// For Cloud Functions, endpoint(`url`) and `targetAudience` should be equal

const url = targetAudience;

const { GoogleAuth } = require('google-auth-library');
const auth = new GoogleAuth();

async function request() {
    console.info(`request ${url} with target audience ${targetAudience}`);

    // this call retrieves the ID token for the impersonated service account
    const client = await auth.getIdTokenClient(targetAudience);

    const res = await client.request({ url });
    console.info(res.data);
}

request().catch(err => {
    console.error(err.message);
    process.exitCode = 1;
});
  1. เรียกใช้แอป
node index.js

และคุณควรเห็นข้อความ "Hello World!" ที่ได้

การแก้ปัญหา

หากเห็นข้อผิดพลาด "ปฏิเสธสิทธิ์ "iam.serviceAccounts.getOpenIdToken" ในทรัพยากร (หรืออาจไม่มีอยู่)" โปรดรอสักครู่เพื่อให้บทบาทผู้สร้างโทเค็นบัญชีบริการมีผล

หากได้รับข้อผิดพลาด "ดึงโทเค็นรหัสในสภาพแวดล้อมนี้ไม่ได้ โปรดใช้ GCE หรือตั้งค่าตัวแปรสภาพแวดล้อม GOOGLE_APPLICATION_CREDENTIALS เป็นไฟล์ JSON ของข้อมูลเข้าสู่ระบบบัญชีบริการ" แสดงว่าคุณอาจลืมเรียกใช้คำสั่ง

gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS

7. ยินดีด้วย

ขอแสดงความยินดีที่ทำ Codelab นี้เสร็จสมบูรณ์

เราขอแนะนำให้อ่านเอกสารเกี่ยวกับวิธีรักษาความปลอดภัยของ Cloud Functions

นอกจากนี้ เราขอแนะนำบล็อกโพสต์นี้เกี่ยวกับการพัฒนาในเครื่องด้วย Cloud Functions เพื่อดูวิธีพัฒนาและทดสอบ Cloud Function ในสภาพแวดล้อมการพัฒนาในเครื่อง

สิ่งที่เราได้พูดถึง

  • วิธีกำหนดค่าการตรวจสอบสิทธิ์ใน Cloud Functions และยืนยันว่าได้กำหนดค่าการตรวจสอบสิทธิ์อย่างถูกต้อง
  • เรียกใช้ฟังก์ชันที่ได้รับการตรวจสอบสิทธิ์จากสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ในเครื่องโดยระบุโทเค็นสำหรับข้อมูลประจำตัว gcloud
  • วิธีสร้างบัญชีบริการและมอบบทบาทที่เหมาะสมเพื่อเรียกใช้ฟังก์ชัน
  • วิธีแอบอ้างเป็นบริการจากสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ในเครื่องที่มีบทบาทที่เหมาะสมสำหรับการเรียกใช้ฟังก์ชัน

8. ล้างข้อมูล

หากต้องการหลีกเลี่ยงการเรียกเก็บเงินโดยไม่ตั้งใจ (เช่น Cloud Function นี้ถูกเรียกใช้โดยไม่ตั้งใจมากกว่าการจัดสรรการเรียกใช้ Cloud Function รายเดือนในระดับฟรี) คุณสามารถลบ Cloud Function หรือลบโปรเจ็กต์ที่สร้างในขั้นตอนที่ 2 ก็ได้

หากต้องการหยุดการแอบอ้างเป็นบัญชีบริการ คุณสามารถเข้าสู่ระบบอีกครั้งโดยใช้ข้อมูลประจำตัวของคุณได้โดยทำดังนี้

gcloud auth application-default login

หากต้องการลบ Cloud Function ให้ไปที่ Cloud Console ของ Cloud Function ที่ https://console.cloud.google.com/functions/ ตรวจสอบว่าโปรเจ็กต์ที่คุณสร้างในขั้นตอนที่ 2 เป็นโปรเจ็กต์ที่เลือกอยู่ในขณะนี้

เลือก my-authenticated-function ที่คุณได้ติดตั้งใช้งานไปก่อนหน้านี้ จากนั้นกดลบ

หากเลือกที่จะลบทั้งโปรเจ็กต์ ให้ไปที่ https://console.cloud.google.com/cloud-resource-manager เลือกโปรเจ็กต์ที่สร้างในขั้นตอนที่ 2 แล้วเลือก "ลบ" หากลบโปรเจ็กต์ คุณจะต้องเปลี่ยนโปรเจ็กต์ใน Cloud SDK คุณดูรายการโปรเจ็กต์ทั้งหมดที่พร้อมใช้งานได้โดยเรียกใช้ gcloud projects list