0Pricing
Linux Command Line & Bash Scripting Mastery · บทเรียน

การเขียนสคริปต์จัดการทรัพยากรคลาวด์ด้วย CLI และ jq

ควบคุม CLI ของผู้ให้บริการคลาวด์ให้ทำงานซ้ำได้อย่างปลอดภัย และแยกวิเคราะห์การตอบกลับ JSON เพื่อจัดเตรียมและรื้อถอนทรัพยากร

การเขียนสคริปต์จัดการทรัพยากรคลาวด์ด้วย CLI และ jq เป็นบทเรียน Linux Command Line & Bash Scripting Mastery ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Linux Command Line & Bash Scripting Mastery และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Linux Command Line & Bash Scripting Mastery มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดการเขียนสคริปต์บนคลาวด์แบบไอดีมโพเทนต์จึงสำคัญ

ในระดับ C2 การเขียนสคริปต์บนคลาวด์ไม่ได้เกี่ยวกับการคลิกปุ่ม แต่เกี่ยวกับการเขียนโค้ดที่สามารถทำงานได้อย่างปลอดภัย หลายครั้ง โดยไม่สร้างทรัพยากรซ้ำหรือทำงานล้มเหลวเมื่อเรียกใช้ครั้งที่สอง

สคริปต์แบบ ไอดีมโพเทนต์ จะตรวจสอบว่าทรัพยากรมีอยู่แล้วหรือไม่ก่อนสร้าง นี่คือรากฐานของระบบอัตโนมัติด้านโครงสร้างพื้นฐานที่เชื่อถือได้

  • CLI ของคลาวด์ (AWS, GCP, Azure) ส่งคืน JSON การแยกวิเคราะห์ผลลัพธ์นั้นจึงเป็นสิ่งจำเป็น
  • jq เป็นเครื่องมือ Unix มาตรฐานสำหรับตัด กรอง และแปลง JSON จากสคริปต์เชลล์
  • การรวม CLI, jq และตรรกะแบบมีเงื่อนไขช่วยให้คุณเขียนสคริปต์จัดเตรียมทรัพยากรที่ทนทานและเรียกใช้ซ้ำได้

ตลอดบทเรียนนี้ คุณจะจัดเตรียมบักเก็ต S3 อินสแตนซ์ EC2 และบทบาท IAM โดยใช้ AWS CLI เป็นตัวอย่างอ้างอิง พร้อมรูปแบบที่นำไปใช้กับ gcloud และ az ได้โดยตรง

การติดตั้งและตรวจสอบ CLI ของคลาวด์

ก่อนเขียนสคริปต์ ให้ตรวจสอบว่ามีเครื่องมือที่ถูกต้องอยู่แล้ว ควรล็อกเวอร์ชันใน CI เสมอ เพื่อป้องกันไม่ให้สภาพแวดล้อมต่าง ๆ ค่อย ๆ แตกต่างกัน

ส่วนโค้ดด้านล่างจะตรวจสอบ AWS CLI v2, jq และ GCP SDK พร้อมติดตั้งเฉพาะรายการที่ยังขาดอยู่ รูปแบบนี้มีประโยชน์ในสคริปต์เริ่มต้นสำหรับ VM หรือคอนเทนเนอร์ใหม่

#!/usr/bin/env bash
set -euo pipefail

check_or_install() {
  local cmd="$1"
  local install_cmd="$2"
  if ! command -v "$cmd" &>/dev/null; then
    echo "[INFO] $cmd not found — installing..."
    eval "$install_cmd"
  else
    echo "[OK]   $cmd $("$cmd" --version 2>&1 | head -1)"
  fi
}

# AWS CLI v2
check_or_install aws \
  'curl -fsSL https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o /tmp/awscliv2.zip && unzip -q /tmp/awscliv2.zip -d /tmp && sudo /tmp/aws/install'

# jq
check_or_install jq \
  'sudo apt-get install -y jq 2>/dev/null || sudo yum install -y jq'

# gcloud (optional)
check_or_install gcloud \
  'echo "Install gcloud SDK manually from https://cloud.google.com/sdk"'

echo "All prerequisites satisfied."

การสอบถามทรัพยากรที่มีอยู่ด้วย jq

ขั้นตอนแรกของสคริปต์แบบไอดีมโพเทนต์คือการ อ่าน ให้สอบถาม API ว่าทรัพยากรมีอยู่แล้วหรือไม่ แล้วจึงเลือกดำเนินการตามผลลัพธ์

AWS CLI ส่งคืน JSON เสมอ ส่วน jq ช่วยให้คุณดึงฟิลด์ที่ต้องการได้อย่างแม่นยำ:

  • jq -r '.Buckets[].Name' — แสดงผลเป็นสตริงดิบ โดยมีชื่อบักเก็ตหนึ่งชื่อต่อบรรทัด
  • jq -e — จบการทำงานด้วยรหัส 1 หากนิพจน์ให้ผลเป็น null หรือ false จึงเหมาะอย่างยิ่งสำหรับเงื่อนไขป้องกันของ if
  • jq '.[] | select(.Name == env.BUCKET)' — กรองโดยใช้ตัวแปรเชลล์ผ่าน env

ส่วนโค้ดด้านล่างจะแสดงรายการบักเก็ต S3 ทั้งหมดและตรวจสอบว่ามีบักเก็ตเป้าหมายอยู่แล้วหรือไม่

#!/usr/bin/env bash
set -euo pipefail

BUCKET="my-devops-artifacts-$(date +%Y%m)"

echo "Fetching existing S3 buckets..."
EXISTING=$(aws s3api list-buckets --output json)

# Extract names as newline-separated list
echo "$EXISTING" | jq -r '.Buckets[].Name'

# Check if target bucket exists
if echo "$EXISTING" | jq -e --arg b "$BUCKET" '.Buckets[] | select(.Name == $b)' > /dev/null 2>&1; then
  echo "[EXISTS] Bucket $BUCKET already present — skipping creation."
else
  echo "[MISSING] Bucket $BUCKET not found — will create."
fi

การสร้างบักเก็ต S3 แบบไอดีมโพเทนต์

เมื่อมีการตรวจสอบการมีอยู่แล้ว ให้ครอบการสร้างไว้ภายในเงื่อนไขป้องกัน ฟังก์ชันคลาวด์ที่จัดโครงสร้างอย่างดีจะทำตามรูปแบบนี้:

  1. อ่านสถานะปัจจุบันจาก API
  2. เปรียบเทียบสถานะที่ต้องการกับสถานะจริง
  3. ดำเนินการเฉพาะส่วนที่แตกต่างกัน

สังเกตแฟล็ก --create-bucket-configuration ซึ่งจำเป็นสำหรับทุกภูมิภาคยกเว้น us-east-1 การกำหนดภูมิภาคไว้ตายตัวในสคริปต์ช่วยป้องกันความล้มเหลวโดยไม่แจ้งเตือนเมื่อไม่ได้กำหนด AWS_DEFAULT_REGION

#!/usr/bin/env bash
set -euo pipefail

REGION="eu-west-1"
BUCKET="my-devops-artifacts-$(date +%Y%m)"

ensure_bucket() {
  local bucket="$1"
  local region="$2"

  local existing
  existing=$(aws s3api list-buckets --query 'Buckets[].Name' --output json)

  if echo "$existing" | jq -e --arg b "$bucket" 'index($b) != null' > /dev/null 2>&1; then
    echo "[SKIP] Bucket $bucket already exists."
    return 0
  fi

  echo "[CREATE] Creating bucket $bucket in $region..."
  aws s3api create-bucket \
    --bucket "$bucket" \
    --region "$region" \
    --create-bucket-configuration LocationConstraint="$region"

  # Enable versioning immediately after creation
  aws s3api put-bucket-versioning \
    --bucket "$bucket" \
    --versioning-configuration Status=Enabled

  echo "[DONE] Bucket $bucket created with versioning enabled."
}

ensure_bucket "$BUCKET" "$REGION"

การแยกวิเคราะห์ JSON ที่ซ้อนกัน: สถานะอินสแตนซ์ EC2

การตอบกลับจาก EC2 มีโครงสร้างซ้อนกันหลายชั้น การเดินตามเส้นทางด้วย jq และ --query (JMESPath ซึ่งมีมาใน AWS CLI) ใช้ได้ทั้งคู่ แต่ jq มีพลังมากกว่าสำหรับตรรกะที่ซับซ้อน

รูปแบบ jq สำคัญสำหรับ EC2:

  • .Reservations[].Instances[] — ทำโครงสร้างอาร์เรย์ซ้อนสองชั้นให้เป็นชั้นเดียว
  • select(.State.Name == "running") — กรองตามสถานะ
  • .Tags[] | select(.Key == "Name") | .Value — ดึงค่าของแท็ก

ส่วนโค้ดจะค้นหาอินสแตนซ์ที่กำลังทำงานอยู่โดยใช้แท็ก Name แล้วส่งคืน ID และ IP ส่วนตัวของอินสแตนซ์นั้น

#!/usr/bin/env bash
set -euo pipefail

INSTANCE_NAME="web-server-prod"

RESULT=$(aws ec2 describe-instances \
  --filters \
    "Name=tag:Name,Values=${INSTANCE_NAME}" \
    "Name=instance-state-name,Values=running" \
  --output json)

# Extract instance ID and private IP using jq
INSTANCE_ID=$(echo "$RESULT" | jq -r \
  '.Reservations[].Instances[] | .InstanceId')

PRIVATE_IP=$(echo "$RESULT" | jq -r \
  '.Reservations[].Instances[] | .PrivateIpAddress')

if [[ -z "$INSTANCE_ID" ]]; then
  echo "[WARN] No running instance named '$INSTANCE_NAME' found."
  exit 1
fi

echo "Instance ID : $INSTANCE_ID"
echo "Private IP  : $PRIVATE_IP"

การจัดเตรียมบทบาท IAM แบบไอดีมโพเทนต์

ทรัพยากร IAM เป็นทรัพยากรระดับสากลและต้องไม่สร้างซ้ำ AWS จะส่งคืนรหัสข้อผิดพลาดเฉพาะ EntityAlreadyExists เมื่อคุณพยายามสร้างบทบาทที่มีอยู่แล้ว การดักจับรหัสดังกล่าวเป็นรูปแบบไอดีมโพเทนต์ที่สะอาดกว่าการเรียก API แสดงรายการเพื่อตรวจสอบล่วงหน้า เมื่อจัดการ IAM ในระดับใหญ่

สคริปต์ด้านล่างสาธิตวิธี:

  • เก็บรหัสการจบการทำงานของ CLI ด้วย || true เพื่อป้องกันไม่ให้ set -e ยกเลิกการทำงาน
  • แยกวิเคราะห์ JSON ของข้อความข้อผิดพลาดที่ AWS เขียนไปยัง stderr โดยใช้การแทนที่กระบวนการ
  • แนบนโยบายเฉพาะเมื่อยังไม่ได้แนบนโยบายนั้นอยู่
#!/usr/bin/env bash
set -euo pipefail

ROLE_NAME="DevOpsDeployRole"
POLICY_ARN="arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"

TRUST_POLICY='{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": { "Service": "ec2.amazonaws.com" },
    "Action": "sts:AssumeRole"
  }]
}'

# Attempt creation; ignore EntityAlreadyExists
CREATE_OUTPUT=$(aws iam create-role \
  --role-name "$ROLE_NAME" \
  --assume-role-policy-document "$TRUST_POLICY" \
  --output json 2>&1) || {
  if echo "$CREATE_OUTPUT" | grep -q 'EntityAlreadyExists'; then
    echo "[SKIP] Role $ROLE_NAME already exists."
  else
    echo "[ERROR] Unexpected error: $CREATE_OUTPUT" >&2
    exit 1
  fi
}

# Attach policy (attach-role-policy is idempotent by default)
aws iam attach-role-policy \
  --role-name "$ROLE_NAME" \
  --policy-arn "$POLICY_ARN"

echo "[OK] Role $ROLE_NAME ready with policy $POLICY_ARN."

jq ขั้นสูง: การแปลง การแมป และ toentries

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

รูปแบบขั้นสูงที่จำเป็น:

  • map(select(...)) — กรองอาร์เรย์โดยไม่ทำให้ตัวครอบอาร์เรย์หายไป
  • to_entries | map(select(.value != null)) — ลบฟิลด์ที่เป็นค่าว่างก่อนเขียนลงในการกำหนดค่า
  • [.[] | {id: .InstanceId, ip: .PrivateIpAddress}] — แปลงข้อมูลให้เป็นโครงสร้างรูปแบบใหม่
  • @csv, @tsv, @base64 — ตัวแปลงรูปแบบที่มีมาให้ในตัว

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

#!/usr/bin/env bash
set -euo pipefail

OUTPUT_FILE="/tmp/ec2_inventory.tsv"

aws ec2 describe-instances \
  --filters "Name=instance-state-name,Values=running" \
  --output json \
| jq -r '
  ["InstanceId", "Name", "PrivateIp", "Type", "AZ"],
  [
    .Reservations[].Instances[] | [
      .InstanceId,
      (.Tags // [] | map(select(.Key == "Name")) | .[0].Value // "(none)"),
      (.PrivateIpAddress // "N/A"),
      .InstanceType,
      .Placement.AvailabilityZone
    ]
  ][]
| @tsv' > "$OUTPUT_FILE"

echo "Inventory written to $OUTPUT_FILE:"
column -t "$OUTPUT_FILE"

การรอการดำเนินการแบบอะซิงโครนัส: การตรวจสอบสถานะเป็นระยะด้วย jq

การดำเนินการบนคลาวด์เป็นแบบอะซิงโครนัส การสร้างอินสแตนซ์ EC2 จะส่งคืนผลทันทีโดยมีสถานะ pending สคริปต์ที่เชื่อถือได้ต้อง ตรวจสอบซ้ำจนกว่าจะถึงสถานะที่ต้องการ ก่อนดำเนินการต่อ

รูปแบบด้านล่างใช้ลูป until ร่วมกับการหน่วงเวลาแบบทวีคูณ AWS CLI ยังมีคำสั่งย่อย wait ให้ใช้ด้วย เช่น aws ec2 wait instance-running แต่การเขียนระบบตรวจสอบสถานะเองช่วยให้ควบคุมเวลาหมดอายุได้ตามต้องการและสร้างบันทึกที่ละเอียดกว่า

#!/usr/bin/env bash
set -euo pipefail

INSTANCE_ID="i-0abcdef1234567890"
MAX_WAIT=300   # seconds
INTERVAL=10
ELAPSED=0

echo "Waiting for instance $INSTANCE_ID to reach 'running' state..."

while true; do
  STATE=$(aws ec2 describe-instances \
    --instance-ids "$INSTANCE_ID" \
    --output json \
  | jq -r '.Reservations[0].Instances[0].State.Name')

  echo "  [$(date +%T)] state = $STATE"

  [[ "$STATE" == "running" ]] && break

  if [[ "$STATE" == "terminated" || "$STATE" == "shutting-down" ]]; then
    echo "[FATAL] Instance entered terminal state: $STATE" >&2
    exit 1
  fi

  if (( ELAPSED >= MAX_WAIT )); then
    echo "[TIMEOUT] Instance did not reach 'running' after ${MAX_WAIT}s." >&2
    exit 1
  fi

  sleep "$INTERVAL"
  (( ELAPSED += INTERVAL ))
done

echo "[OK] Instance $INSTANCE_ID is running."

รูปแบบหลายคลาวด์: ทางเลือกเทียบเท่าของ GCP และ Azure

รูปแบบอ่านแล้วค่อยดำเนินการแบบไอดีมโพเทนต์สามารถนำไปใช้กับ CLI ของคลาวด์อื่นได้โดยตรง ทั้ง gcloud และ az ส่งคืน JSON และรองรับการกรอง:

  • GCP: gcloud ... --format='json' — ส่งต่อให้ jq ได้เช่นเดียวกับ AWS ใช้ gcloud ... --quiet เพื่อไม่ให้แสดงข้อความถามยืนยันในสคริปต์
  • Azure: az ... --output json — ใช้รูปแบบเดียวกัน az group exists ส่งคืนสตริงบูลีนธรรมดา (true/false) จึงไม่จำเป็นต้องใช้ jq ในกรณีง่าย ๆ

ส่วนโค้ดแสดงการสร้างกลุ่มทรัพยากรใน Azure และการสร้างบักเก็ต GCS ใน GCP แบบไอดีมโพเทนต์เคียงกัน โดยใช้รูปแบบเงื่อนไขป้องกันเดียวกัน

#!/usr/bin/env bash
set -euo pipefail

# --- Azure: idempotent resource group ---
RG="devops-rg"
LOCATION="westeurope"

if [[ $(az group exists --name "$RG") == "true" ]]; then
  echo "[SKIP] Azure resource group $RG already exists."
else
  echo "[CREATE] Creating Azure resource group $RG..."
  az group create --name "$RG" --location "$LOCATION" --output json \
    | jq '{name: .name, location: .location, provisioningState: .properties.provisioningState}'
fi

# --- GCP: idempotent GCS bucket ---
GCS_BUCKET="gs://devops-artifacts-prod"
PROJECT="my-gcp-project"

if gcloud storage buckets describe "$GCS_BUCKET" \
     --project="$PROJECT" --format='value(name)' &>/dev/null; then
  echo "[SKIP] GCS bucket $GCS_BUCKET already exists."
else
  echo "[CREATE] Creating GCS bucket $GCS_BUCKET..."
  gcloud storage buckets create "$GCS_BUCKET" \
    --project="$PROJECT" \
    --location=EU \
    --uniform-bucket-level-access
fi

การรื้อถอน: การทำลายทรัพยากรอย่างปลอดภัย

สคริปต์ทำลายทรัพยากรมีความสำคัญไม่แพ้สคริปต์สร้างทรัพยากร การรื้อถอนอย่างปลอดภัยต้อง:

  • แสดงรายการทรัพยากร ก่อน ลบสิ่งใด และพิมพ์สรุปเพื่อให้มนุษย์ตรวจสอบ
  • รองรับแฟล็ก --dry-run เพื่อให้ผู้ปฏิบัติงานยืนยันแผนได้โดยยังไม่ดำเนินการจริง
  • ลบตามลำดับการพึ่งพาที่ถูกต้อง เช่น ยุติการทำงานของอินสแตนซ์ก่อนลบกลุ่มความปลอดภัย

ส่วนโค้ดด้านล่างจะยุติการทำงานของอินสแตนซ์ EC2 ทั้งหมดที่มีแท็ก Env=staging พร้อมเงื่อนไขป้องกันแบบ dry-run

#!/usr/bin/env bash
set -euo pipefail

DRY_RUN="${1:-}"

echo "Finding staging EC2 instances..."

INSTANCE_IDS=$(aws ec2 describe-instances \
  --filters \
    "Name=tag:Env,Values=staging" \
    "Name=instance-state-name,Values=running,stopped" \
  --output json \
| jq -r '[.Reservations[].Instances[].InstanceId] | @sh')

if [[ -z "$INSTANCE_IDS" ]]; then
  echo "[INFO] No staging instances found. Nothing to do."
  exit 0
fi

echo "Instances to terminate: $INSTANCE_IDS"

if [[ "$DRY_RUN" == "--dry-run" ]]; then
  echo "[DRY-RUN] No changes made."
  exit 0
fi

read -rp "Terminate these instances? [yes/N]: " CONFIRM
[[ "$CONFIRM" != "yes" ]] && { echo "Aborted."; exit 0; }

# shellcheck disable=SC2086
aws ec2 terminate-instances --instance-ids $INSTANCE_IDS --output json \
| jq '.TerminatingInstances[] | {id: .InstanceId, state: .CurrentState.Name}'

echo "[DONE] Termination initiated."

ตั้งแต่ต้นจนจบ: สคริปต์เริ่มต้นโครงสร้างพื้นฐานแบบไม่ก่อให้เกิดผลซ้ำ

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

แนวปฏิบัติสำคัญที่สาธิตมีดังนี้:

  • การบันทึกเหตุการณ์แบบมีโครงสร้าง ผ่านตัวช่วย log() ซึ่งเติมคำนำหน้า [INFO], [WARN], [ERROR]
  • ไฟล์สถานะ — เขียนรหัสทรัพยากรที่สร้างแล้วลงในไฟล์สถานะ JSON เพื่อให้การเรียกใช้ครั้งถัดไปและสคริปต์ถอดถอนใช้ข้อมูลอ้างอิงชุดเดียวกัน
  • กับดักข้อผิดพลาด — trap ดักจับการออกจากการทำงานโดยไม่คาดคิดและรายงานหมายเลขบรรทัดที่ล้มเหลว
#!/usr/bin/env bash
set -euo pipefail

STATE_FILE="/tmp/infra_state.json"
REGION="eu-west-1"
BUCKET="devops-bootstrap-$(date +%Y%m)"
ROLE="BootstrapRole"

log() { echo "[$(date -u +%T)] [$1] ${*:2}"; }
trap 'log ERROR "Script failed at line $LINENO"' ERR

# Initialize state
[[ -f "$STATE_FILE" ]] || echo '{}' > "$STATE_FILE"

# --- Step 1: S3 bucket ---
EXISTING_BUCKETS=$(aws s3api list-buckets --query 'Buckets[].Name' --output json)
if echo "$EXISTING_BUCKETS" | jq -e --arg b "$BUCKET" 'index($b) != null' > /dev/null; then
  log INFO "Bucket $BUCKET exists — skipping."
else
  aws s3api create-bucket --bucket "$BUCKET" --region "$REGION" \
    --create-bucket-configuration LocationConstraint="$REGION" > /dev/null
  log INFO "Bucket $BUCKET created."
fi

# Update state file
jq --arg b "$BUCKET" '.bucket = $b' "$STATE_FILE" > /tmp/_state_tmp && mv /tmp/_state_tmp "$STATE_FILE"

# --- Step 2: IAM role ---
if aws iam get-role --role-name "$ROLE" &>/dev/null; then
  log INFO "Role $ROLE exists — skipping."
else
  aws iam create-role --role-name "$ROLE" \
    --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ec2.amazonaws.com"},"Action":"sts:AssumeRole"}]}' \
    --output json | jq '{RoleName: .Role.RoleName, Arn: .Role.Arn}'
  log INFO "Role $ROLE created."
fi

jq --arg r "$ROLE" '.role = $r' "$STATE_FILE" > /tmp/_state_tmp && mv /tmp/_state_tmp "$STATE_FILE"

log INFO "Bootstrap complete. State: $(cat "$STATE_FILE" | jq -c .)"

ตรวจสอบความรู้: ตัวป้องกันการทำงานซ้ำโดยไม่ก่อให้เกิดผลซ้ำด้วย jq

ทดสอบความเข้าใจเกี่ยวกับการเขียนสคริปต์คลาวด์ที่ทำงานซ้ำได้โดยไม่ก่อให้เกิดผลซ้ำด้วย jq

ทบทวน: การเขียนสคริปต์จัดการทรัพยากรคลาวด์ผ่าน CLI และ jq

บทเรียนนี้ครอบคลุมวงจรชีวิตทั้งหมดของการทำงานอัตโนมัติบนคลาวด์ที่ทำงานซ้ำได้โดยไม่ก่อให้เกิดผลซ้ำ โดยใช้สคริปต์เชลล์ เครื่องมือ CLI สำหรับคลาวด์ และ jq

หลักการสำคัญ:

  • อ่านก่อนเขียน — สอบถามสถานะที่มีอยู่ก่อนเสมอ แล้วดำเนินการเฉพาะส่วนที่แตกต่าง
  • ใช้ jq -e เป็นตัวป้องกัน — ใช้โหมดสถานะการออกเพื่อควบคุมแขนง if จากการตอบกลับในรูปแบบ JSON
  • ความหมายของรหัสข้อผิดพลาด — ดักจับรหัสข้อผิดพลาดเฉพาะของผู้ให้บริการ เช่น EntityAlreadyExists แทนการแสดงรายการล่วงหน้าเมื่อวิธีนี้มีประสิทธิภาพมากกว่า
  • ตรวจสอบสถานะแบบไม่พร้อมกันเป็นระยะ — ใช้ลูป until พร้อมระยะหมดเวลา อย่าสันนิษฐานว่าทรัพยากรพร้อมใช้งานทันทีหลังสร้างเสร็จ
  • ไฟล์สถานะ — เขียนรหัสทรัพยากรลงในไฟล์ JSON ที่ใช้ร่วมกัน เพื่อให้แต่ละช่วงของสคริปต์และการถอดถอนใช้ข้อมูลอ้างอิงชุดเดียวกัน
  • แฟล็กจำลองการทำงาน — รองรับ --dry-run เสมอ เพื่อให้ผู้ปฏิบัติงานตรวจสอบอย่างปลอดภัยก่อนดำเนินการที่ทำลายข้อมูล

รูปแบบเหล่านี้ เมื่อใช้ร่วมกับส่วนหัว set -euo pipefail ที่เข้มงวดและกับดัก ERR จะเป็นรากฐานของการเขียนสคริปต์โครงสร้างพื้นฐานระดับใช้งานจริงในระดับ C2

คำถามที่พบบ่อย

บทเรียน “การเขียนสคริปต์จัดการทรัพยากรคลาวด์ด้วย CLI และ jq” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเขียนสคริปต์จัดการทรัพยากรคลาวด์ด้วย CLI และ jq” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Linux Command Line & Bash Scripting Mastery ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Linux Command Line & Bash Scripting Mastery มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเขียนสคริปต์จัดการทรัพยากรคลาวด์ด้วย CLI และ jq”

ควบคุม CLI ของผู้ให้บริการคลาวด์ให้ทำงานซ้ำได้อย่างปลอดภัย และแยกวิเคราะห์การตอบกลับ JSON เพื่อจัดเตรียมและรื้อถอนทรัพยากร คุณปฏิบัติ Linux Command Line & Bash Scripting Mastery ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Linux Command Line & Bash Scripting Mastery หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Linux Command Line & Bash Scripting Mastery บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การเขียนสคริปต์จัดการทรัพยากรคลาวด์ด้วย CLI และ jq” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Linux Command Line & Bash Scripting Mastery นี้ได้ไหม

ได้ บทเรียน Linux Command Line & Bash Scripting Mastery ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเขียน Dockerfile และจุดเริ่มต้น Shell แบบกระชับ
  2. การสร้างแม่แบบการกำหนดค่าด้วย envsubst และ heredoc
  3. การเขียนสคริปต์จัดการทรัพยากรคลาวด์ด้วย CLI และ jq
  4. โพรบสุขภาพ ด่านความพร้อม และลูปรอ
← กลับไปที่ Linux Command Line & Bash Scripting Mastery