การเขียนสคริปต์จัดการทรัพยากรคลาวด์ด้วย 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จึงเหมาะอย่างยิ่งสำหรับเงื่อนไขป้องกันของifjq '.[] | 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 แบบไอดีมโพเทนต์
เมื่อมีการตรวจสอบการมีอยู่แล้ว ให้ครอบการสร้างไว้ภายในเงื่อนไขป้องกัน ฟังก์ชันคลาวด์ที่จัดโครงสร้างอย่างดีจะทำตามรูปแบบนี้:
- อ่านสถานะปัจจุบันจาก API
- เปรียบเทียบสถานะที่ต้องการกับสถานะจริง
- ดำเนินการเฉพาะส่วนที่แตกต่างกัน
สังเกตแฟล็ก --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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเขียน Dockerfile และจุดเริ่มต้น Shell แบบกระชับ
- การสร้างแม่แบบการกำหนดค่าด้วย envsubst และ heredoc
- การเขียนสคริปต์จัดการทรัพยากรคลาวด์ด้วย CLI และ jq
- โพรบสุขภาพ ด่านความพร้อม และลูปรอ