Kentlo's picture
Sync from GitHub 37f011465a0aa2abdfdd94d8bd5f31cfe932c669
28677d8 verified
Raw
History Blame Contribute Delete
70.9 kB
[
{
"id": "azure-rg",
"certification": "AZ-104",
"title": "Resource Group โ€” ๋ฆฌ์†Œ์Šค ๊ทธ๋ฃน",
"summary": "Azure ๋ฆฌ์†Œ์Šค๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ฌถ๋Š” ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. ๋™์ผ RG์˜ ๋ฆฌ์†Œ์Šค๋Š” ํ•จ๊ป˜ ๋ฐฐํฌยท๊ด€๋ฆฌยท์‚ญ์ œ๋˜๋ฉฐ, ์œ„์น˜(region)๊ฐ€ ์„œ๋กœ ๋‹ฌ๋ผ๋„ ๊ฐ™์€ RG์— ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"example": "az group create --name myRG --location koreacentral\naz group list --output table\naz group delete --name myRG --yes",
"common_mistake": "RG๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์•ˆ์— ์†ํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•จ๊ป˜ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. RG ์œ„์น˜์™€ ๋‚ด๋ถ€ ๋ฆฌ์†Œ์Šค ์œ„์น˜๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.",
"keywords": [
"resource group",
"container",
"lifecycle",
"region",
"az group"
],
"source_id": "azure-vm-overview",
"details": [
"RG๋Š” ๋ฆฌ์†Œ์Šค์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ณ„, ํ™˜๊ฒฝ๋ณ„(dev/prod), ๋˜๋Š” ํŒ€๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.",
"RG ์ž์ฒด์˜ ์œ„์น˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ ์œ„์น˜์ด๋ฉฐ, ๋‚ด๋ถ€ ๋ฆฌ์†Œ์Šค๋Š” ๋‹ค๋ฅธ region์— ์žˆ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: RG ์‚ญ์ œ ์‹œ ์˜ํ–ฅ ๋ฒ”์œ„, RG์— RBACยทLockยทTag๋ฅผ ์ ์šฉํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค, RG ์ด๋™ ์ œํ•œ ์‚ฌํ•ญ์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ",
"related_practices": [
"azure-lab-1"
]
},
{
"id": "azure-storage",
"certification": "AZ-104",
"title": "Storage Account โ€” ์Šคํ† ๋ฆฌ์ง€ ๊ณ„์ •",
"summary": "Blob, File, Queue, Table 4๊ฐ€์ง€ ์Šคํ† ๋ฆฌ์ง€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ตœ์ƒ์œ„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. SKU(Standard/Premium)์™€ ์ค‘๋ณต์„ฑ(LRS/GRS ๋“ฑ)์„ ์ƒ์„ฑ ์‹œ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.",
"example": "az storage account create \\\n --name mystorageacct \\\n --resource-group myRG \\\n --sku Standard_LRS \\\n --kind StorageV2",
"common_mistake": "Storage Account ์ด๋ฆ„์€ ์ „ ์„ธ๊ณ„์—์„œ ์œ ์ผํ•ด์•ผ ํ•˜๋ฉฐ ์†Œ๋ฌธ์žยท์ˆซ์ž๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(3~24์ž). SKU๋Š” ์ƒ์„ฑ ํ›„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.",
"keywords": [
"storage account",
"Blob",
"Files",
"LRS",
"GRS",
"SKU",
"StorageV2"
],
"source_id": "azure-storage-account",
"details": [
"StorageV2(๋ฒ”์šฉ v2)๊ฐ€ ํ˜„์žฌ ๊ถŒ์žฅ ํ˜•์‹์œผ๋กœ ๋ชจ๋“  ์Šคํ† ๋ฆฌ์ง€ ์„œ๋น„์Šค์™€ ์ตœ์‹  ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.",
"์ค‘๋ณต์„ฑ: LRS(๋‹จ์ผ datacenter 3๋ณต์ œ), ZRS(3 AZ), GRS(๋‹ค๋ฅธ region์œผ๋กœ ๋น„๋™๊ธฐ ๋ณต์ œ), GZRS(ZRS+GRS).",
"์‹œํ—˜ ํŒจํ„ด: ์ค‘๋ณต์„ฑ ์ˆ˜์ค€๋ณ„ ํŠน์ง•, ์Šคํ† ๋ฆฌ์ง€ ๊ณ„์ • ์ข…๋ฅ˜(Blob์ „์šฉ/StorageV2 ๋“ฑ), ๋ณด์•ˆ ์„ค์ •(HTTPS ๊ฐ•์ œ, ๋ฐฉํ™”๋ฒฝ) ๋ฌธ์ œ๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ",
"related_practices": [
"azure-lab-2"
]
},
{
"id": "azure-vnet",
"certification": "AZ-104",
"title": "Virtual Network โ€” ๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ",
"summary": "Azure์—์„œ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ†ต์‹ ํ•˜๋Š” ๊ฒฉ๋ฆฌ๋œ ์‚ฌ์„ค ๋„คํŠธ์›Œํฌ์ž…๋‹ˆ๋‹ค. ์„œ๋ธŒ๋„ท์œผ๋กœ ๋‚˜๋‰˜๋ฉฐ, ์˜จํ”„๋ ˆ๋ฏธ์Šค ์—ฐ๊ฒฐ(VPN Gateway, ExpressRoute)๊ณผ ํ”ผ์–ด๋ง์„ ํ†ตํ•ด ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.",
"example": "az network vnet create \\\n --name myVNet \\\n --address-prefix 10.0.0.0/16 \\\n --subnet-name default \\\n --subnet-prefix 10.0.0.0/24",
"common_mistake": "VNet ์ฃผ์†Œ ๊ณต๊ฐ„์ด ๊ฒน์น˜๋ฉด ํ”ผ์–ด๋ง์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์„ค๊ณ„ ์ดˆ๊ธฐ์— IP ๋ฒ”์œ„๋ฅผ ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ์žก์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"VNet",
"subnet",
"address space",
"CIDR",
"peering",
"NSG"
],
"source_id": "azure-vnet-overview",
"details": [
"VNet ๋‚ด ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋กœ ํ†ต์‹  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ์ธํ„ฐ๋„ท ํ†ต์‹ ์€ Public IP ๋˜๋Š” NAT Gateway๋ฅผ ํ†ตํ•ฉ๋‹ˆ๋‹ค.",
"์„œ๋ธŒ๋„ท์€ VNet ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์ผ๋ถ€. Azure๊ฐ€ ๊ฐ ์„œ๋ธŒ๋„ท์—์„œ 5๊ฐœ IP๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค(์ฒซ 4๊ฐœ + ๋งˆ์ง€๋ง‰).",
"์‹œํ—˜ ํŒจํ„ด: VNet/์„œ๋ธŒ๋„ท ์ฃผ์†Œ ๋ฒ”์œ„ ๊ณ„์‚ฐ, NSG์™€ ์„œ๋ธŒ๋„ท ์—ฐ๊ฒฐ, ํ”ผ์–ด๋ง ์กฐ๊ฑด(์ฃผ์†Œ ๋น„์ค‘์ฒฉ) ๋ฌธ์ œ๊ฐ€ ์ž์ฃผ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ",
"related_practices": [
"azure-lab-3"
]
},
{
"id": "azure-rbac",
"certification": "AZ-104",
"title": "Azure RBAC โ€” ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด",
"summary": "๋ˆ„๊ฐ€(Who), ์–ด๋–ค ๋ฆฌ์†Œ์Šค์—(Scope), ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€(Role)๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์—ญํ•  ํ• ๋‹น์€ ๊ตฌ๋…ยทRGยท๋ฆฌ์†Œ์Šค ๋ ˆ๋ฒจ์—์„œ ์ƒ์†๋ฉ๋‹ˆ๋‹ค.",
"example": "az role assignment create \\\n --assignee alice@example.com \\\n --role 'Contributor' \\\n --scope /subscriptions/SUB_ID/resourceGroups/myRG",
"common_mistake": "RBAC๋Š” ๊ด€๋ฆฌ ํ‰๋ฉด(Azure Portal/API) ์ ‘๊ทผ ์ œ์–ด์ž…๋‹ˆ๋‹ค. VM ๋‚ด๋ถ€ OS ์ ‘๊ทผ์ด๋‚˜ Storage ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์€ ๋ณ„๋„ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"RBAC",
"role assignment",
"Owner",
"Contributor",
"Reader",
"scope",
"principal"
],
"source_id": "azure-rbac-overview",
"details": [
"๋‚ด์žฅ ์—ญํ•  3๊ฐ€์ง€: Owner(๋ชจ๋“  ๊ถŒํ•œ+์—ญํ•  ํ• ๋‹น), Contributor(๋ฆฌ์†Œ์Šค CRUD, ์—ญํ•  ํ• ๋‹น ๋ถˆ๊ฐ€), Reader(์ฝ๊ธฐ๋งŒ).",
"์—ญํ•  ํ• ๋‹น ๋ฒ”์œ„: ๊ด€๋ฆฌ ๊ทธ๋ฃน > ๊ตฌ๋… > RG > ๋ฆฌ์†Œ์Šค. ์ƒ์œ„ ๋ฒ”์œ„ ์—ญํ• ์€ ํ•˜์œ„๋กœ ์ƒ์†๋ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์— ๋”ฐ๋ฅธ ์—ญํ•  ์„ ํƒ, ๋ฒ”์œ„๋ณ„ ์—ญํ•  ์ƒ์† ๊ฒฐ๊ณผ, Owner vs Contributor ์ฐจ์ด ๋ฌธ์ œ๊ฐ€ ์ž์ฃผ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ",
"related_practices": [
"azure-lab-5"
]
},
{
"id": "azure-policy",
"certification": "AZ-104",
"title": "Azure Policy โ€” ์ •์ฑ…",
"summary": "๋ฆฌ์†Œ์Šค๊ฐ€ ์กฐ์ง์˜ ๊ทœ์ •์„ ์ค€์ˆ˜ํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • region๋งŒ ํ—ˆ์šฉ, ํƒœ๊ทธ ๊ฐ•์ œ, SKU ์ œํ•œ ๋“ฑ์„ ์ •์ฑ… ์ •์˜๋กœ ๋งŒ๋“ค์–ด ๊ตฌ๋…ยทRG์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.",
"example": "# ํ—ˆ์šฉ location ์ œํ•œ ์ •์ฑ… ํ• ๋‹น ์˜ˆ\naz policy assignment create \\\n --name 'allowed-locations' \\\n --policy 'e56962a6-4747-49cd-b67b-bf8b01975c4f' \\\n --params '{\"listOfAllowedLocations\":{\"value\":[\"koreacentral\"]}}'",
"common_mistake": "Policy๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋น„์ค€์ˆ˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋ฉด remediation task๋ฅผ ๋ณ„๋„๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"Azure Policy",
"policy definition",
"initiative",
"compliance",
"deny",
"audit",
"remediation"
],
"source_id": "azure-policy-overview",
"details": [
"ํšจ๊ณผ(effect) ์œ ํ˜•: Deny(๊ฑฐ๋ถ€), Audit(๊ฐ์‚ฌ๋งŒ), AuditIfNotExists, DeployIfNotExists(์ž๋™ ๋ณด์™„ ๋ฐฐํฌ), Disabled.",
"Initiative(์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ)๋Š” ์—ฌ๋Ÿฌ Policy๋ฅผ ๋ฌถ์€ ์ง‘ํ•ฉ. NIST, CIS ๋“ฑ ๊ทœ์ • ์ค€์ˆ˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: Policy์™€ RBAC ์ฐจ์ด(RBAC๋Š” ํ–‰์œ„ ์ œ์–ด, Policy๋Š” ๋ฆฌ์†Œ์Šค ์†์„ฑ ์ œ์–ด), ํšจ๊ณผ ์œ ํ˜•๋ณ„ ๋™์ž‘, ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ vs ๋‹จ๋… ์ •์ฑ… ๋ฌธ์ œ๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ"
},
{
"id": "azure-vm",
"certification": "AZ-104",
"title": "Virtual Machine โ€” ๊ฐ€์ƒ ๋จธ์‹ ",
"summary": "Azure์—์„œ ์ œ๊ณตํ•˜๋Š” IaaS ์ปดํ“จํŒ…์ž…๋‹ˆ๋‹ค. VM ํฌ๊ธฐ(SKU), OS ์ด๋ฏธ์ง€, ๊ฐ€์šฉ์„ฑ ๊ตฌ์„ฑ, ๋””์Šคํฌ ์œ ํ˜•์„ ์„ ํƒํ•ด ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.",
"example": "az vm create \\\n --name myVM \\\n --resource-group myRG \\\n --image Ubuntu2204 \\\n --size Standard_B2s \\\n --admin-username azureuser \\\n --generate-ssh-keys",
"common_mistake": "VM์„ '์ค‘์ง€(Stop)'ํ•ด๋„ ํ• ๋‹น ํ•ด์ œ(deallocated)๊ฐ€ ์•„๋‹ˆ๋ฉด ์ปดํ“จํŒ… ์š”๊ธˆ์ด ๊ณ„์† ์ฒญ๊ตฌ๋ฉ๋‹ˆ๋‹ค. ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด '์ค‘์ง€(ํ• ๋‹น ํ•ด์ œ)'๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"VM",
"SKU",
"availability set",
"managed disk",
"deallocate",
"NSG",
"public IP"
],
"source_id": "azure-vm-overview",
"details": [
"VM ํฌ๊ธฐ ์‹œ๋ฆฌ์ฆˆ: B(๋ฒ„์ŠคํŠธ, ์ €๋น„์šฉ), D(๋ฒ”์šฉ), E(๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”), F(์ปดํ“จํŒ… ์ตœ์ ํ™”), N(GPU). ์ˆซ์ž๋Š” vCPU ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.",
"VM ์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ NIC, OS ๋””์Šคํฌ, Public IP(์„ ํƒ)๊ฐ€ ํ•จ๊ป˜ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ์ค‘์ง€ vs ํ• ๋‹น ํ•ด์ œ ์š”๊ธˆ ์ฐจ์ด, VM ํฌ๊ธฐ ๋ณ€๊ฒฝ ์‹œ ์žฌ์‹œ์ž‘ ํ•„์š” ์—ฌ๋ถ€, ๊ฐ€์šฉ์„ฑ SLA 99.9/99.95/99.99% ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์ด ์ž์ฃผ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ"
},
{
"id": "azure-vmss",
"certification": "AZ-104",
"title": "Virtual Machine Scale Sets โ€” ๊ฐ€์ƒ ๋จธ์‹  ํ™•์žฅ ์ง‘ํ•ฉ",
"summary": "๋™์ผํ•œ VM์„ ์ž๋™์œผ๋กœ ํ™•์žฅยท์ถ•์†Œํ•˜๋Š” ๊ทธ๋ฃน์ž…๋‹ˆ๋‹ค. ๋ถ€ํ•˜์— ๋”ฐ๋ผ ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ์ž๋™ ์กฐ์ •(Autoscale)ํ•˜๊ณ , ๋ถ€ํ•˜ ๋ถ„์‚ฐ ์žฅ์น˜์™€ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค.",
"example": "az vmss create \\\n --name myVMSS \\\n --resource-group myRG \\\n --image Ubuntu2204 \\\n --instance-count 2 \\\n --vm-sku Standard_B2s",
"common_mistake": "VMSS์˜ ๊ฐœ๋ณ„ ์ธ์Šคํ„ด์Šค๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ ์ •์ฑ…(์ž๋™/์ˆ˜๋™/๋กค๋ง)์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์ž๋™ ์ •์ฑ…์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"VMSS",
"scale set",
"autoscale",
"instance count",
"upgrade policy",
"load balancer"
],
"source_id": "azure-vmss-overview",
"details": [
"Orchestration ๋ชจ๋“œ: Uniform(๋™์ผ VM, ์ž๋™ ํ™•์žฅ ์ตœ์ ํ™”) vs Flexible(ํ˜ผํ•ฉ VM ํฌ๊ธฐ ๊ฐ€๋Šฅ, Availability Zone ์ง€์› ๊ฐ•ํ™”).",
"Autoscale ๊ทœ์น™: CPU%, ๋ฉ”๋ชจ๋ฆฌ, ํ ๊ธธ์ด ๋“ฑ ๋ฉ”ํŠธ๋ฆญ ๊ธฐ๋ฐ˜์œผ๋กœ scale-out/in ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: VMSS vs Availability Set ์ฐจ์ด(AS๋Š” ์ž๋™ ํ™•์žฅ ์—†์Œ), ์—…๊ทธ๋ ˆ์ด๋“œ ์ •์ฑ… ์„ ํƒ, ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ ํ†ตํ•ฉ ๋ฐฉ๋ฒ•์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-nsg",
"certification": "AZ-104",
"title": "Network Security Group โ€” ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๊ทธ๋ฃน",
"summary": "์ธ๋ฐ”์šด๋“œ/์•„์›ƒ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ์„ ํฌํŠธยทํ”„๋กœํ† ์ฝœยท์›๋ณธIP๋กœ ํ—ˆ์šฉ/๊ฑฐ๋ถ€ํ•˜๋Š” ๊ทœ์น™ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ์„œ๋ธŒ๋„ท ๋˜๋Š” NIC์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.",
"example": "az network nsg rule create \\\n --nsg-name myNSG \\\n --name allow-ssh \\\n --priority 100 \\\n --access Allow \\\n --protocol Tcp \\\n --destination-port-ranges 22",
"common_mistake": "์šฐ์„ ์ˆœ์œ„ ์ˆซ์ž๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก ๋จผ์ € ์ ์šฉ๋ฉ๋‹ˆ๋‹ค(100์ด 200๋ณด๋‹ค ๋†’์€ ์šฐ์„ ์ˆœ์œ„). ๊ทœ์น™ ์ถฉ๋Œ ์‹œ ๋‚ฎ์€ ๋ฒˆํ˜ธ ๊ทœ์น™์ด ์ด๊น๋‹ˆ๋‹ค.",
"keywords": [
"NSG",
"inbound",
"outbound",
"priority",
"allow",
"deny",
"subnet",
"NIC"
],
"source_id": "azure-nsg-overview",
"details": [
"NSG์—๋Š” ๊ธฐ๋ณธ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค: AllowVNetInbound(65000), AllowAzureLoadBalancerInbound(65001), DenyAllInbound(65500).",
"NSG๋ฅผ ์„œ๋ธŒ๋„ท๊ณผ NIC ์–‘์ชฝ์— ์—ฐ๊ฒฐํ•˜๋ฉด ํŠธ๋ž˜ํ”ฝ์ด ๋‘ NSG๋ฅผ ๋ชจ๋‘ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฐ”์šด๋“œ๋Š” ์„œ๋ธŒ๋„ทNSGโ†’NIC NSG ์ˆœ์„œ.",
"์‹œํ—˜ ํŒจํ„ด: ํŠน์ • ํฌํŠธ ํ—ˆ์šฉ/์ฐจ๋‹จ ๊ทœ์น™ ์„ค๊ณ„, ์šฐ์„ ์ˆœ์œ„ ์ถฉ๋Œ ๊ฒฐ๊ณผ, ์„œ๋ธŒ๋„ท vs NIC ์—ฐ๊ฒฐ ์ฐจ์ด ๋ฌธ์ œ๊ฐ€ ์ž์ฃผ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ",
"related_practices": [
"azure-lab-4"
]
},
{
"id": "azure-app-gateway",
"certification": "AZ-104",
"title": "Application Gateway โ€” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฒŒ์ดํŠธ์›จ์ด",
"summary": "HTTP/HTTPS ๋ ˆ์ด์–ด(L7) ๋ถ€ํ•˜ ๋ถ„์‚ฐ ์žฅ์น˜์ž…๋‹ˆ๋‹ค. URL ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…, SSL ์ข…๋ฃŒ, WAF(์›น ๋ฐฉํ™”๋ฒฝ)๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.",
"example": "# ๊ตฌ์„ฑ ์š”์†Œ: Frontend IP โ†’ Listener โ†’ Rule โ†’ Backend Pool โ†’ HTTP Settings\n# URL ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… ์˜ˆ:\n# /images/* โ†’ image-pool\n# /api/* โ†’ api-pool",
"common_mistake": "Application Gateway๋Š” L7, Azure Load Balancer๋Š” L4์ž…๋‹ˆ๋‹ค. URL ๊ฒฝ๋กœ๋‚˜ ํ˜ธ์ŠคํŠธ ํ—ค๋” ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์ด ํ•„์š”ํ•˜๋ฉด App Gateway๋ฅผ ์”๋‹ˆ๋‹ค.",
"keywords": [
"Application Gateway",
"L7",
"WAF",
"SSL termination",
"URL routing",
"backend pool"
],
"source_id": "azure-app-gateway-overview",
"details": [
"๊ตฌ์„ฑ ํ๋ฆ„: Frontend IP โ†’ Listener(ํฌํŠธ/ํ”„๋กœํ† ์ฝœ) โ†’ Routing Rule โ†’ Backend Pool(VM/VMSS/IP) โ†’ HTTP Settings.",
"WAF SKU๋Š” OWASP ๊ทœ์น™์…‹์œผ๋กœ SQL injection, XSS ๋“ฑ ์›น ๊ณต๊ฒฉ์„ ํƒ์ง€ยท์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: App Gateway vs Load Balancer ์„ ํƒ ๊ธฐ์ค€, URL ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… ๊ตฌ์„ฑ, SSL ์˜คํ”„๋กœ๋”ฉ ๊ฐœ๋…์ด ์ž์ฃผ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-dns",
"certification": "AZ-104",
"title": "Azure DNS โ€” ๋„๋ฉ”์ธ ์ด๋ฆ„ ์„œ๋น„์Šค",
"summary": "Azure์—์„œ DNS ์˜์—ญ์„ ํ˜ธ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค. Public DNS Zone์€ ์ธํ„ฐ๋„ท์šฉ, Private DNS Zone์€ VNet ๋‚ด๋ถ€ ์ด๋ฆ„ ํ•ด์„์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.",
"example": "az network dns zone create --name example.com --resource-group myRG\naz network dns record-set a add-record \\\n --zone-name example.com \\\n --record-set-name www \\\n --ipv4-address 1.2.3.4",
"common_mistake": "Azure DNS๋Š” ๋„๋ฉ”์ธ ๋“ฑ๋ก ์„œ๋น„์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ์€ ๋ณ„๋„ ๋“ฑ๋ก ๊ธฐ๊ด€์—์„œ ๊ตฌ๋งค ํ›„ ๋„ค์ž„์„œ๋ฒ„๋ฅผ Azure๋กœ ์œ„์ž„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"Azure DNS",
"Public Zone",
"Private Zone",
"A record",
"CNAME",
"NS delegation"
],
"source_id": "azure-dns-overview",
"details": [
"Public DNS Zone ์ƒ์„ฑ ํ›„ Azure๊ฐ€ ์ œ๊ณตํ•˜๋Š” NS ๋ ˆ์ฝ”๋“œ 4๊ฐœ๋ฅผ ๋„๋ฉ”์ธ ๋“ฑ๋ก ๊ธฐ๊ด€์—์„œ ์„ค์ •ํ•ด ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.",
"Private DNS Zone์€ VNet์— ์—ฐ๊ฒฐ(link)ํ•˜๋ฉด ํ•ด๋‹น VNet์˜ VM์ด ์‚ฌ์„ค ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: Public vs Private Zone ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค, ๋„ค์ž„์„œ๋ฒ„ ์œ„์ž„ ์ ˆ์ฐจ, Azure ์„œ๋น„์Šค์— DNS๋ณ„์นญ(CNAME/alias) ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-blob-tier",
"certification": "AZ-104",
"title": "Blob Access Tier โ€” Blob ์ ‘๊ทผ ๊ณ„์ธต",
"summary": "๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋นˆ๋„์— ๋”ฐ๋ผ HotยทCoolยทColdยทArchive ๊ณ„์ธต์„ ์„ ํƒํ•ด ์Šคํ† ๋ฆฌ์ง€ ๋น„์šฉ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ ๋น„์šฉ๊ณผ ์ ‘๊ทผ ๋น„์šฉ์€ ๋ฐ˜๋น„๋ก€ํ•ฉ๋‹ˆ๋‹ค.",
"example": "az storage blob set-tier \\\n --account-name myaccount \\\n --container-name mycontainer \\\n --name myblob.log \\\n --tier Cool",
"common_mistake": "Archive ๊ณ„์ธต์˜ Blob์€ ์ฆ‰์‹œ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ์œผ๋ ค๋ฉด Hot ๋˜๋Š” Cool๋กœ rehydration(๋ช‡ ์‹œ๊ฐ„~15์‹œ๊ฐ„)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"blob tier",
"Hot",
"Cool",
"Cold",
"Archive",
"rehydration",
"lifecycle"
],
"source_id": "azure-blob-access-tiers",
"details": [
"๊ณ„์ธต๋ณ„ ํŠน์ง•: Hot(์ž์ฃผ ์ ‘๊ทผ, ๋†’์€ ์ €์žฅ ๋น„์šฉ ๋‚ฎ์€ ์ ‘๊ทผ ๋น„์šฉ), Cool(30์ผ ์ด์ƒ ๋ณด๊ด€), Cold(90์ผ ์ด์ƒ), Archive(180์ผ ์ด์ƒ, ์ ‘๊ทผ ๋น„์šฉ ์ตœ๊ณ ).",
"Archive์—์„œ ๊บผ๋‚ผ ๋•Œ ์šฐ์„ ์ˆœ์œ„: Standard(์ตœ๋Œ€ 15์‹œ๊ฐ„), High Priority(1์‹œ๊ฐ„ ์ด๋‚ด, ๋น„์Œˆ).",
"์‹œํ—˜ ํŒจํ„ด: ๊ณ„์ธต๋ณ„ ์ตœ์†Œ ๋ณด๊ด€ ๊ธฐ๊ฐ„(Cool=30์ผ, Cold=90์ผ, Archive=180์ผ), ์กฐ๊ธฐ ์‚ญ์ œ ์‹œ ์š”๊ธˆ ๋ถ€๊ณผ, rehydration ์‹œ๊ฐ„ ๋ฌธ์ œ๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ",
"related_practices": [
"azure-lab-7"
]
},
{
"id": "azure-log-analytics",
"certification": "AZ-104",
"title": "Log Analytics Workspace โ€” ๋กœ๊ทธ ๋ถ„์„ ์ž‘์—… ์˜์—ญ",
"summary": "Azure Monitor์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. VMยท์„œ๋น„์Šค์˜ ๋กœ๊ทธ์™€ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•˜๊ณ  KQL(Kusto Query Language)๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.",
"example": "# KQL ์˜ˆ: ์ตœ๊ทผ 1์‹œ๊ฐ„ ์˜ค๋ฅ˜ ๋กœ๊ทธ\nEvent\n| where TimeGenerated > ago(1h)\n| where EventLevelName == 'Error'\n| summarize count() by Source",
"common_mistake": "Log Analytics๋Š” ์ €์žฅ์†Œ์ด๊ณ  Azure Monitor๊ฐ€ ์ˆ˜์ง‘ ์—์ด์ „ํŠธยท๊ฒฝ๋ณด๋ฅผ ํฌํ•จํ•œ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ๋‘˜์€ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋ฉฐ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.",
"keywords": [
"Log Analytics",
"KQL",
"workspace",
"diagnostic settings",
"MMA",
"AMA"
],
"source_id": "azure-log-analytics-overview",
"details": [
"๋ฐ์ดํ„ฐ ์ˆ˜์ง‘: VM์— Azure Monitor Agent(AMA) ์„ค์น˜ ๋˜๋Š” Diagnostic Settings๋กœ Azure ์„œ๋น„์Šค ๋กœ๊ทธ๋ฅผ Workspace๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.",
"KQL ํ•ต์‹ฌ: `| where`, `| project`(์ปฌ๋Ÿผ ์„ ํƒ), `| summarize`(์ง‘๊ณ„), `| order by`, `| take`(์ƒ์œ„ N๊ฐœ).",
"์‹œํ—˜ ํŒจํ„ด: Diagnostic Settings ์„ค์ • ์ ˆ์ฐจ, VM์— ์—์ด์ „ํŠธ ์—ฐ๊ฒฐ, KQL ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์œผ๋กœ ๋กœ๊ทธ๋ฅผ ์ฟผ๋ฆฌํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-recovery-vault",
"certification": "AZ-104",
"title": "Recovery Services Vault โ€” ๋ณต๊ตฌ ์„œ๋น„์Šค ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ์Œ",
"summary": "Azure Backup๊ณผ Site Recovery ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. VM, SQL, Files ๋“ฑ์˜ ๋ฐฑ์—… ์ •์ฑ…์„ ์ •์˜ํ•˜๊ณ  ๋ณต์› ์ง€์ ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.",
"example": "az backup vault create \\\n --name myVault \\\n --resource-group myRG \\\n --location koreacentral\naz backup protection enable-for-vm \\\n --vault-name myVault \\\n --vm myVM \\\n --policy-name DefaultPolicy",
"common_mistake": "Recovery Services Vault๋Š” ๋ฐฑ์—… ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์™€ ๊ฐ™์€ region์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ region์˜ VM์€ ๋ฐฑ์—…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.",
"keywords": [
"Recovery Services Vault",
"Azure Backup",
"backup policy",
"restore point",
"soft delete"
],
"source_id": "azure-recovery-services-vault",
"details": [
"๋ฐฑ์—… ์ •์ฑ…: ์Šค์ผ€์ค„(์ผ๋ณ„/์ฃผ๋ณ„), ๋ณด์กด ๊ธฐ๊ฐ„(์ผ/์ฃผ/์›”/๋…„)์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. VM์€ ๊ธฐ๋ณธ ์ •์ฑ…(์ผ 1ํšŒ, 30์ผ ๋ณด์กด)์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.",
"Soft Delete: ๋ฐฑ์—… ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ ํ›„ 14์ผ๊ฐ„ ๋ณต์› ๊ฐ€๋Šฅ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋žœ์„ฌ์›จ์–ด ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ๋ฐฑ์—… ์ •์ฑ… ๊ตฌ์„ฑ, ๋ณต์› ์œ ํ˜•(์›๋ž˜ ์œ„์น˜/์ƒˆ ์œ„์น˜), ์ง€์—ญ ๊ฐ„ ๋ณต์›(CRR) ๊ธฐ๋Šฅ, Soft Delete ํ™œ์„ฑํ™” ๋ฐฉ๋ฒ•์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰",
"related_practices": [
"azure-lab-8"
]
},
{
"id": "azure-entra-id",
"certification": "AZ-104",
"title": "Microsoft Entra ID โ€” ID ๊ด€๋ฆฌ",
"summary": "Azure์˜ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ID ๋ฐ ์ ‘๊ทผ ๊ด€๋ฆฌ(IAM) ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค(๊ตฌ Azure Active Directory). ์‚ฌ์šฉ์žยท๊ทธ๋ฃนยท์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ID๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  MFA, ์กฐ๊ฑด๋ถ€ ์ ‘๊ทผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.",
"example": "az ad user create \\\n --display-name 'Alice Kim' \\\n --user-principal-name alice@mydomain.com \\\n --password 'TempPass123!'\naz ad group create --display-name 'Developers' --mail-nickname 'devs'",
"common_mistake": "Entra ID์™€ ์˜จํ”„๋ ˆ๋ฏธ์Šค Active Directory๋Š” ๋‹ค๋ฅธ ์ œํ’ˆ์ž…๋‹ˆ๋‹ค. Entra ID๋Š” ํด๋ผ์šฐ๋“œ LDAP/Kerberos๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ๋„๋ฉ”์ธ ์กฐ์ธ์€ Entra Domain Services๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"Entra ID",
"AAD",
"tenant",
"user",
"group",
"MFA",
"SSO",
"B2B",
"B2C"
],
"source_id": "azure-rbac-overview",
"details": [
"ํ…Œ๋„ŒํŠธ(Tenant)๋Š” Entra ID์˜ ์ธ์Šคํ„ด์Šค์ด๋ฉฐ ์กฐ์ง ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ๊ตฌ๋…์€ ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ํ…Œ๋„ŒํŠธ์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.",
"์‚ฌ์šฉ์ž ์œ ํ˜•: Member(๋‚ด๋ถ€ ์‚ฌ์šฉ์ž) vs Guest(B2B ์ดˆ๋Œ€ ์‚ฌ์šฉ์ž). ๊ทธ๋ฃน ์œ ํ˜•: Security(RBAC ํ• ๋‹น์šฉ) vs Microsoft 365.",
"์‹œํ—˜ ํŒจํ„ด: ์‚ฌ์šฉ์ž/๊ทธ๋ฃน ์ƒ์„ฑยท๊ด€๋ฆฌ, ๊ฒŒ์ŠคํŠธ ์‚ฌ์šฉ์ž ์ดˆ๋Œ€(B2B), MFA ๋“ฑ๋ก, SSPR ์„ค์ •, Entra ID vs ์˜จํ”„๋ ˆ๋ฏธ์Šค AD ์ฐจ์ด๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ"
},
{
"id": "azure-management-group",
"certification": "AZ-104",
"title": "Management Group โ€” ๊ด€๋ฆฌ ๊ทธ๋ฃน",
"summary": "์—ฌ๋Ÿฌ ๊ตฌ๋…์„ ๊ณ„์ธต์ ์œผ๋กœ ๋ฌถ๋Š” ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„ ๋ฃจํŠธ ๊ด€๋ฆฌ ๊ทธ๋ฃน์—์„œ RBAC์™€ Policy๋ฅผ ํ• ๋‹นํ•˜๋ฉด ํ•˜์œ„ ๊ตฌ๋…์œผ๋กœ ์ƒ์†๋ฉ๋‹ˆ๋‹ค.",
"example": "# ๊ณ„์ธต ๊ตฌ์กฐ ์˜ˆ:\n# Root Management Group\n# โ””โ”€ Production MG\n# โ”œโ”€ Sub-A\n# โ””โ”€ Sub-B\naz account management-group create --name 'Production'",
"common_mistake": "๊ด€๋ฆฌ ๊ทธ๋ฃน์€ ์ตœ๋Œ€ 6๋‹จ๊ณ„(๋ฃจํŠธ ํฌํ•จ)๊นŒ์ง€ ์ค‘์ฒฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋…์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๊ด€๋ฆฌ ๊ทธ๋ฃน์—๋งŒ ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"keywords": [
"management group",
"hierarchy",
"policy inheritance",
"RBAC",
"root",
"subscription"
],
"source_id": "azure-rbac-overview",
"details": [
"๋ฃจํŠธ ๊ด€๋ฆฌ ๊ทธ๋ฃน์— ํ• ๋‹นํ•œ PolicyยทRBAC๋Š” ํ…Œ๋„ŒํŠธ์˜ ๋ชจ๋“  ๊ตฌ๋…์— ์ƒ์†๋ฉ๋‹ˆ๋‹ค. ์ „์‚ฌ ๊ทœ์ • ์ ์šฉ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.",
"๊ด€๋ฆฌ ๊ทธ๋ฃน ์ด๋™: ๊ตฌ๋…์ด๋‚˜ ํ•˜์œ„ ๊ด€๋ฆฌ ๊ทธ๋ฃน์„ ๋‹ค๋ฅธ ๊ด€๋ฆฌ ๊ทธ๋ฃน์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ๊ด€๋ฆฌ ๊ทธ๋ฃน ๊ณ„์ธต ์„ค๊ณ„, Policy/RBAC ์ƒ์† ํ๋ฆ„, ๊ด€๋ฆฌ ๊ทธ๋ฃน vs ๊ตฌ๋… vs RG ๋ฒ”์œ„ ์ฐจ์ด ๋ฌธ์ œ๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ"
},
{
"id": "azure-subscription",
"certification": "AZ-104",
"title": "Subscription โ€” ๊ตฌ๋…",
"summary": "Azure ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ๋น„์šฉ์„ ์ฒญ๊ตฌํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ๊ตฌ๋…๋งˆ๋‹ค ๋ฆฌ์†Œ์Šค ํ•œ๋„(quota)๊ฐ€ ์žˆ์œผ๋ฉฐ ํ•˜๋‚˜์˜ Entra ID ํ…Œ๋„ŒํŠธ์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.",
"example": "az account list --output table\naz account set --subscription 'My Subscription'\naz account show",
"common_mistake": "๊ตฌ๋…๊ณผ ํ…Œ๋„ŒํŠธ๋Š” 1:1์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํ…Œ๋„ŒํŠธ์— ์—ฌ๋Ÿฌ ๊ตฌ๋…์ด ์†ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ตฌ๋…์„ ๋‹ค๋ฅธ ํ…Œ๋„ŒํŠธ๋กœ ์ด์ „ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.",
"keywords": [
"subscription",
"tenant",
"quota",
"billing",
"az account"
],
"source_id": "azure-rbac-overview",
"details": [
"๊ตฌ๋… ์œ ํ˜•: Pay-As-You-Go, Enterprise Agreement(EA), CSP(ํŒŒํŠธ๋„ˆ ์ œ๊ณต) ๋“ฑ. ๋น„์šฉ ์ฒญ๊ตฌ ๊ณ„์ •๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.",
"๋ฆฌ์†Œ์Šค ํ•œ๋„(Quota)๋Š” ๊ตฌ๋… ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ: ํŠน์ • region์˜ vCPU ์ตœ๋Œ€ ์ˆ˜. ํ•œ๋„ ์ฆ๊ฐ€๋Š” Microsoft์— ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ๊ตฌ๋… ์ด๋™(ํ…Œ๋„ŒํŠธ ๊ฐ„), ๊ตฌ๋… ๋ ˆ๋ฒจ RBAC, Cost Management์—์„œ ๊ตฌ๋…๋ณ„ ๋น„์šฉ ๋ถ„์„ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ"
},
{
"id": "azure-resource-lock",
"certification": "AZ-104",
"title": "Resource Lock โ€” ๋ฆฌ์†Œ์Šค ์ž ๊ธˆ",
"summary": "์‹ค์ˆ˜๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •ยท์‚ญ์ œํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. ReadOnly(์ˆ˜์ •ยท์‚ญ์ œ ์ฐจ๋‹จ)์™€ CanNotDelete(์‚ญ์ œ๋งŒ ์ฐจ๋‹จ) ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.",
"example": "az lock create \\\n --name 'prod-lock' \\\n --resource-group myRG \\\n --lock-type CanNotDelete\naz lock list --resource-group myRG",
"common_mistake": "Lock์€ RBAC๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. Owner๋ผ๋„ Lock์ด ๊ฑธ๋ฆฐ ๋ฆฌ์†Œ์Šค๋Š” ์ž ๊ธˆ์„ ๋จผ์ € ํ•ด์ œํ•ด์•ผ ์ˆ˜์ •ยท์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"keywords": [
"resource lock",
"CanNotDelete",
"ReadOnly",
"RBAC override"
],
"source_id": "azure-vm-overview",
"details": [
"ReadOnly Lock: ์ฝ๊ธฐ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์“ฐ๊ธฐยท์‚ญ์ œ ๋ชจ๋‘ ์ฐจ๋‹จ. VM์— ๊ฑธ๋ฉด ์žฌ์‹œ์ž‘๋„ ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"Lock์€ RG์— ์„ค์ •ํ•˜๋ฉด ํ•˜์œ„ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ์ƒ์†๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค์—๋งŒ ๊ฑธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: Lock๊ณผ RBAC ์ƒํ˜ธ์ž‘์šฉ, CanNotDelete vs ReadOnly ์‹œ๋‚˜๋ฆฌ์˜ค, ์ž ๊ธˆ ํ•ด์ œ ์—†์ด ์‚ญ์ œ ์‹œ๋„ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ",
"related_practices": [
"azure-lab-6"
]
},
{
"id": "azure-tags",
"certification": "AZ-104",
"title": "Tags โ€” ํƒœ๊ทธ",
"summary": "๋ฆฌ์†Œ์Šค์— ํ‚ค-๊ฐ’ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ถ™์—ฌ ๋ถ„๋ฅ˜ยท๋น„์šฉ ์ถ”์ ยท์ž๋™ํ™”์— ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. RG์˜ ํƒœ๊ทธ๋Š” ๋‚ด๋ถ€ ๋ฆฌ์†Œ์Šค์— ์ž๋™ ์ƒ์†๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
"example": "az resource tag \\\n --tags Environment=Production CostCenter=IT \\\n --ids /subscriptions/SUB/resourceGroups/myRG\n# Policy๋กœ ํƒœ๊ทธ ๊ฐ•์ œ:\n# 'Require a tag on resources'",
"common_mistake": "ํƒœ๊ทธ๋Š” RG์—์„œ ๋‚ด๋ถ€ ๋ฆฌ์†Œ์Šค๋กœ ์ž๋™ ์ƒ์†๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ์†์ด ํ•„์š”ํ•˜๋ฉด Azure Policy๋กœ ํƒœ๊ทธ ์ƒ์† ๊ทœ์น™์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"tags",
"key-value",
"cost center",
"environment",
"policy",
"inheritance"
],
"source_id": "azure-vm-overview",
"details": [
"๋ฆฌ์†Œ์Šค๋‹น ์ตœ๋Œ€ 50๊ฐœ์˜ ํƒœ๊ทธ. ์ด๋ฆ„ ์ตœ๋Œ€ 512์ž, ๊ฐ’ ์ตœ๋Œ€ 256์ž(์Šคํ† ๋ฆฌ์ง€ ๊ณ„์ •์€ ์ด๋ฆ„ 128์ž).",
"๋น„์šฉ ๋ถ„์„์—์„œ ํƒœ๊ทธ๋กœ ํ•„ํ„ฐ๋งํ•˜๋ฉด ๋ถ€์„œ๋ณ„ยทํ”„๋กœ์ ํŠธ๋ณ„ ๋น„์šฉ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ํƒœ๊ทธ ์ƒ์† ์ œํ•œ, Policy๋ฅผ ํ†ตํ•œ ํƒœ๊ทธ ๊ฐ•์ œ ์ ์šฉ, ๋น„์šฉ ๋ถ„์„์—์„œ ํƒœ๊ทธ ํ™œ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ"
},
{
"id": "azure-custom-role",
"certification": "AZ-104",
"title": "Custom Role โ€” ์‚ฌ์šฉ์ž ์ง€์ • ์—ญํ• ",
"summary": "๋‚ด์žฅ ์—ญํ• ์ด ๋„ˆ๋ฌด ๊ด‘๋ฒ”์œ„ํ•˜๊ฑฐ๋‚˜ ๋ถ€์กฑํ•  ๋•Œ ํŠน์ • Actions๋งŒ ํ—ˆ์šฉํ•˜๋Š” ์—ญํ• ์„ ์ง์ ‘ ๋งŒ๋“ญ๋‹ˆ๋‹ค. JSON์œผ๋กœ ActionsยทNotActionsยทDataActions๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.",
"example": "{\n \"Name\": \"VM Operator\",\n \"Actions\": [\n \"Microsoft.Compute/virtualMachines/start/action\",\n \"Microsoft.Compute/virtualMachines/restart/action\",\n \"Microsoft.Compute/virtualMachines/read\"\n ],\n \"AssignableScopes\": [\"/subscriptions/SUB_ID\"]\n}",
"common_mistake": "Custom Role์€ ํ…Œ๋„ŒํŠธ ๋‚ด์—์„œ ๋งŒ๋“ค์ง€๋งŒ, AssignableScopes์— ์ง€์ •ํ•œ ๊ตฌ๋…/RG ๋ฒ”์œ„์—์„œ๋งŒ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"keywords": [
"custom role",
"Actions",
"NotActions",
"DataActions",
"AssignableScopes",
"JSON"
],
"source_id": "azure-rbac-overview",
"details": [
"Actions: ๊ด€๋ฆฌ ํ‰๋ฉด ์ž‘์—… ํ—ˆ์šฉ. NotActions: Actions์—์„œ ์ œ์™ธํ•  ์ž‘์—…. DataActions: ๋ฐ์ดํ„ฐ ํ‰๋ฉด ์ž‘์—…(Blob ์ฝ๊ธฐ ๋“ฑ).",
"๊ธฐ์กด ๋‚ด์žฅ ์—ญํ• ์„ ๋ณต์‚ฌํ•ด ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ์‹์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค: `az role definition list --name 'Contributor'`๋กœ ์‹œ์ž‘.",
"์‹œํ—˜ ํŒจํ„ด: ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์— ๋”ฐ๋ฅธ Custom Role Actions ์„ค๊ณ„, DataActions vs Actions ์ฐจ์ด, AssignableScopes ์„ค์ •์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-sas",
"certification": "AZ-104",
"title": "Shared Access Signature โ€” SAS",
"summary": "์Šคํ† ๋ฆฌ์ง€ ๊ณ„์ • ์ „์ฒด๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์ œํ•œ๋œ ๊ถŒํ•œ๊ณผ ์‹œ๊ฐ„ ๋ฒ”์œ„์˜ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๋Š” ์„œ๋ช…๋œ URL์ž…๋‹ˆ๋‹ค.",
"example": "az storage blob generate-sas \\\n --account-name myaccount \\\n --container-name data \\\n --name report.pdf \\\n --permissions r \\\n --expiry 2024-12-31",
"common_mistake": "SAS URL์ด ๋…ธ์ถœ๋˜๋ฉด ๋งŒ๋ฃŒ ์ „๊นŒ์ง€ ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋Š” ์งง์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜๊ณ , SAS๋ฅผ ์ €์žฅํ•œ Stored Access Policy๋ฅผ ์‚ฌ์šฉํ•ด ์ฆ‰์‹œ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"keywords": [
"SAS",
"Service SAS",
"Account SAS",
"User Delegation SAS",
"expiry",
"stored access policy"
],
"source_id": "azure-storage-account",
"details": [
"SAS ์œ ํ˜•: Account SAS(์ „์ฒด ์Šคํ† ๋ฆฌ์ง€ ์„œ๋น„์Šค), Service SAS(ํŠน์ • ์„œ๋น„์Šค), User Delegation SAS(Entra ID ์ž๊ฒฉ ์ฆ๋ช… ๊ธฐ๋ฐ˜, ๊ฐ€์žฅ ์•ˆ์ „).",
"Stored Access Policy: ์„œ๋น„์Šค SAS๋ฅผ ์ •์ฑ…์— ์—ฐ๊ฒฐํ•˜๋ฉด URL์„ ์žฌ๋ฐœ๊ธ‰ํ•˜์ง€ ์•Š๊ณ  ์ •์ฑ… ์‚ญ์ œ๋งŒ์œผ๋กœ ์ ‘๊ทผ์„ ์ฆ‰์‹œ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: SAS ์œ ํ˜• ์„ ํƒ, ๊ถŒํ•œยท๋งŒ๋ฃŒ ์„ค์ •, Stored Access Policy๋ฅผ ํ†ตํ•œ ์ทจ์†Œ ๋ฐฉ๋ฒ•, ํ‚ค ๊ธฐ๋ฐ˜ vs Entra ID ๊ธฐ๋ฐ˜ SAS ์ฐจ์ด๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-storage-redundancy",
"certification": "AZ-104",
"title": "Storage Redundancy โ€” ์Šคํ† ๋ฆฌ์ง€ ์ค‘๋ณต์„ฑ",
"summary": "๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•ด ๊ฐ€์šฉ์„ฑ๊ณผ ๋‚ด๊ตฌ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณต์ œ ๋ฒ”์œ„(๋‹จ์ผ ๋ฐ์ดํ„ฐ์„ผํ„ฐโ†’AZโ†’๋‹ค๋ฅธ region)์— ๋”ฐ๋ผ LRSยทZRSยทGRSยทGZRS ์ค‘ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.",
"example": "# ์ƒ์„ฑ ์‹œ SKU๋กœ ๊ฒฐ์ •\naz storage account create --sku Standard_GRS ...\n# ๋ณ€๊ฒฝ (์ผ๋ถ€๋งŒ ๊ฐ€๋Šฅ)\naz storage account update --sku Standard_RAGRS --name myaccount",
"common_mistake": "GRS๋Š” ๋ณด์กฐ ์ง€์—ญ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ๊ธฐ ๋ถˆ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋ณด์กฐ ์ง€์—ญ ์ฝ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋ฉด RA-GRS(Read-Access GRS)๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"LRS",
"ZRS",
"GRS",
"GZRS",
"RA-GRS",
"redundancy",
"replication"
],
"source_id": "azure-storage-account",
"details": [
"LRS: ๋‹จ์ผ datacenter ๋‚ด 3๋ณต์ œ. ZRS: ๋™์ผ region 3๊ฐœ AZ์— ๋ณต์ œ. GRS: ๋‹ค๋ฅธ region์— ๋น„๋™๊ธฐ ๋ณต์ œ(LRSร—2). GZRS: ZRS+GRS.",
"๋‚ด๊ตฌ์„ฑ(nines): LRS=11 9s, ZRS=12 9s, GRS=16 9s. ๋น„์šฉ์€ LRS<ZRS<GRS<GZRS ์ˆœ์ž…๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ์š”๊ตฌ์‚ฌํ•ญ(AZ ์žฅ์•  ๋ณดํ˜ธ, region ์žฅ์•  ๋ณดํ˜ธ)์— ๋”ฐ๋ฅธ ์ค‘๋ณต์„ฑ ์„ ํƒ, RA-GRS์—์„œ ๋ณด์กฐ ์ง€์—ญ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-lifecycle",
"certification": "AZ-104",
"title": "Storage Lifecycle Management โ€” ์Šคํ† ๋ฆฌ์ง€ ์ˆ˜๋ช… ์ฃผ๊ธฐ",
"summary": "Blob์„ ์ผ์ • ๊ธฐ๊ฐ„ ํ›„ ์ž๋™์œผ๋กœ ๊ณ„์ธต ์ „ํ™˜(Hotโ†’Coolโ†’Archive)ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ์ •์ฑ…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋น„์šฉ ์ž๋™ ์ตœ์ ํ™”์— ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.",
"example": "# ๊ทœ์น™ ์˜ˆ: 30์ผ ํ›„ Cool, 90์ผ ํ›„ Archive, 365์ผ ํ›„ ์‚ญ์ œ\n{\n \"rules\": [{\n \"action\": {\"baseBlob\": {\n \"tierToCool\": {\"daysAfterModificationGreaterThan\": 30},\n \"tierToArchive\": {\"daysAfterModificationGreaterThan\": 90},\n \"delete\": {\"daysAfterModificationGreaterThan\": 365}\n }}\n }]\n}",
"common_mistake": "์ˆ˜๋ช… ์ฃผ๊ธฐ ์ •์ฑ…์€ Blob ๋ ˆ๋ฒจ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ Archive ๊ณ„์ธต์ธ Blob์€ ์ •์ฑ…์ด ๋‹ค์‹œ Archive๋กœ ์ „ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
"keywords": [
"lifecycle policy",
"tier transition",
"Hot",
"Cool",
"Archive",
"delete",
"daysAfterModification"
],
"source_id": "azure-blob-access-tiers",
"details": [
"์กฐ๊ฑด ๊ธฐ์ค€: ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ๋‚ ์งœ, ๋งˆ์ง€๋ง‰ ์ ‘๊ทผ ๋‚ ์งœ(์ ‘๊ทผ ์ถ”์  ํ™œ์„ฑํ™” ํ•„์š”), blob ์ƒ์„ฑ ๋‚ ์งœ ์ค‘ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.",
"ํ•„ํ„ฐ๋กœ ํŠน์ • ์ปจํ…Œ์ด๋„ˆ, ์ ‘๋‘์‚ฌ, blob ์œ ํ˜•(blockBlob/appendBlob)์—๋งŒ ์ •์ฑ…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ํŠน์ • ๋น„์šฉ ์ตœ์ ํ™” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ lifecycle ์ •์ฑ… ๊ทœ์น™ ์ž‘์„ฑ, ์กฐ๊ฑด๋ณ„ ๊ณ„์ธต ์ „ํ™˜ ์ˆœ์„œ, ์‚ญ์ œ ํฌํ•จ ์ „์ฒด ํ๋ฆ„์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-files",
"certification": "AZ-104",
"title": "Azure Files โ€” ํŒŒ์ผ ๊ณต์œ ",
"summary": "SMB/NFS ํ”„๋กœํ† ์ฝœ๋กœ ๋งˆ์šดํŠธํ•˜๋Š” ์™„์ „ ๊ด€๋ฆฌํ˜• ํด๋ผ์šฐ๋“œ ํŒŒ์ผ ๊ณต์œ ์ž…๋‹ˆ๋‹ค. VMยท์˜จํ”„๋ ˆ๋ฏธ์Šคยท์ปจํ…Œ์ด๋„ˆ์—์„œ ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ธŒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.",
"example": "# Windows์—์„œ ๋งˆ์šดํŠธ\nnet use Z: \\\\myaccount.file.core.windows.net\\myshare /user:myaccount [key]\n# Linux์—์„œ ๋งˆ์šดํŠธ\nmount -t cifs //myaccount.file.core.windows.net/myshare /mnt -o user=myaccount,password=[key]",
"common_mistake": "Azure Files SMB๋Š” ํฌํŠธ 445๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ISP์™€ ๊ธฐ์—… ๋ฐฉํ™”๋ฒฝ์ด 445๋ฅผ ์ฐจ๋‹จํ•ด ๋งˆ์šดํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.",
"keywords": [
"Azure Files",
"SMB",
"NFS",
"file share",
"port 445",
"Azure File Sync"
],
"source_id": "azure-storage-account",
"details": [
"์„ฑ๋Šฅ ๊ณ„์ธต: Standard(HDD ๊ธฐ๋ฐ˜), Premium(SSD ๊ธฐ๋ฐ˜). Premium์€ ๋‚ฎ์€ ์ง€์—ฐ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ ์›Œํฌ๋กœ๋“œ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.",
"Azure File Sync: ์˜จํ”„๋ ˆ๋ฏธ์Šค ํŒŒ์ผ ์„œ๋ฒ„์™€ Azure Files๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ณ , ์ž์ฃผ ์“ฐ์ง€ ์•Š๋Š” ํŒŒ์ผ์„ Cloud Tiering์œผ๋กœ Azure์— ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: Blob vs Files ์„ ํƒ ๊ธฐ์ค€(ํŒŒ์ผ ์‹œ์Šคํ…œ ๋งˆ์šดํŠธ ํ•„์š” ์—ฌ๋ถ€), Azure File Sync ์•„ํ‚คํ…์ฒ˜, ํฌํŠธ 445 ๋ฌธ์ œ ํ•ด๊ฒฐ์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-managed-disk",
"certification": "AZ-104",
"title": "Managed Disk โ€” ๊ด€๋ฆฌ ๋””์Šคํฌ",
"summary": "VM์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ธ”๋ก ์Šคํ† ๋ฆฌ์ง€์ž…๋‹ˆ๋‹ค. OS ๋””์Šคํฌ์™€ ๋ฐ์ดํ„ฐ ๋””์Šคํฌ๋กœ ๋‚˜๋‰˜๋ฉฐ, ์„ฑ๋Šฅ ์š”๊ตฌ์— ๋”ฐ๋ผ Standard HDDยทStandard SSDยทPremium SSDยทUltra Disk๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.",
"example": "az disk create \\\n --name myDataDisk \\\n --resource-group myRG \\\n --size-gb 128 \\\n --sku Premium_LRS\naz vm disk attach --vm-name myVM --name myDataDisk",
"common_mistake": "๊ด€๋ฆฌ ๋””์Šคํฌ ํฌ๊ธฐ๋Š” ๋Š˜๋ฆด ์ˆ˜๋งŒ ์žˆ๊ณ  ์ค„์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ ค๋ฉด ์ƒˆ ์ž‘์€ ๋””์Šคํฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ด์ „ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"managed disk",
"OS disk",
"data disk",
"Premium SSD",
"Ultra Disk",
"snapshot",
"disk encryption"
],
"source_id": "azure-storage-account",
"details": [
"SKU ์„ ํƒ: Standard HDD(๋น„์šฉ ์ตœ์ €, ๋ฐฑ์—…์šฉ), Standard SSD(์ผ๋ฐ˜ ์›Œํฌ๋กœ๋“œ), Premium SSD(I/O ์ง‘์•ฝ ์•ฑ), Ultra Disk(DB, ์ตœ์ € ์ง€์—ฐ).",
"์Šค๋ƒ…์ƒท: ํŠน์ • ์‹œ์ ์˜ ๋””์Šคํฌ ์ƒํƒœ๋ฅผ ์บก์ฒ˜. ๋‹ค๋ฅธ region์— ๋ณต์‚ฌํ•ด ์žฌํ•ด ๋ณต๊ตฌ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ์›Œํฌ๋กœ๋“œ๋ณ„ ๋””์Šคํฌ SKU ์„ ํƒ, ๋””์Šคํฌ ํ™•์žฅ ํ›„ OS์—์„œ ํŒŒํ‹ฐ์…˜ ํ™•์žฅ ํ•„์š” ์—ฌ๋ถ€, ์Šค๋ƒ…์ƒท vs ๋ฐฑ์—… ์ฐจ์ด๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ"
},
{
"id": "azure-availability-set",
"certification": "AZ-104",
"title": "Availability Set โ€” ๊ฐ€์šฉ์„ฑ ์ง‘ํ•ฉ",
"summary": "๋™์ผ ๋ฐ์ดํ„ฐ์„ผํ„ฐ ๋‚ด์—์„œ VM์„ ๋‹ค๋ฅธ ๋ฌผ๋ฆฌ ๋ž™(์žฅ์•  ๋„๋ฉ”์ธ)๊ณผ ์—…๋ฐ์ดํŠธ ๊ทธ๋ฃน(์—…๋ฐ์ดํŠธ ๋„๋ฉ”์ธ)์— ๋ฐฐ์น˜ํ•ด ๋‹จ์ผ ์žฅ์• ์ ์„ ์—†์•ฑ๋‹ˆ๋‹ค.",
"example": "az vm availability-set create \\\n --name myAS \\\n --resource-group myRG \\\n --platform-fault-domain-count 2 \\\n --platform-update-domain-count 5",
"common_mistake": "Availability Set์€ ๋‹จ์ผ ๋ฐ์ดํ„ฐ์„ผํ„ฐ ๋‚ด ๋ณดํ˜ธ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์„ผํ„ฐ ์ „์ฒด ์žฅ์• ๋‚˜ AZ ์žฅ์• ์— ๋Œ€์‘ํ•˜๋ ค๋ฉด Availability Zones๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"availability set",
"fault domain",
"update domain",
"UD",
"FD",
"SLA 99.95%"
],
"source_id": "azure-vm-overview",
"details": [
"์žฅ์•  ๋„๋ฉ”์ธ(FD): ๊ณต์œ  ์ „์›ยท๋„คํŠธ์›Œํฌ ์Šค์œ„์น˜ ๊ธฐ์ค€ ๋ฌผ๋ฆฌ ๋ž™ ๋ถ„๋ฆฌ. ๊ธฐ๋ณธ ์ตœ๋Œ€ 3๊ฐœ.",
"์—…๋ฐ์ดํŠธ ๋„๋ฉ”์ธ(UD): ๊ณ„ํš๋œ ์œ ์ง€ ๊ด€๋ฆฌ ์‹œ ๋™์‹œ์— ์žฌ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ทธ๋ฃน. ๊ธฐ๋ณธ 5๊ฐœ(์ตœ๋Œ€ 20๊ฐœ).",
"์‹œํ—˜ ํŒจํ„ด: AS vs AZ ๋ณดํ˜ธ ์ˆ˜์ค€ ์ฐจ์ด, SLA(AS=99.95%, ๋‹จ์ผVM-Premium=99.9%, AZ=99.99%), AS์— VM ์ถ”๊ฐ€ ์‹œ๊ธฐ ์ œํ•œ์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ž…๋ฌธ"
},
{
"id": "azure-autoscale",
"certification": "AZ-104",
"title": "Autoscale โ€” ์ž๋™ ํฌ๊ธฐ ์กฐ์ •",
"summary": "๋ฉ”ํŠธ๋ฆญ(CPU, ๋ฉ”๋ชจ๋ฆฌ, ํ ๊ธธ์ด ๋“ฑ)์ด๋‚˜ ์ผ์ •์— ๋”ฐ๋ผ VM Scale Set ๋˜๋Š” App Service์˜ ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ๋Š˜๋ฆฌ๊ณ  ์ค„์ž…๋‹ˆ๋‹ค.",
"example": "# Autoscale ๊ทœ์น™ ์˜ˆ:\n# CPU > 70% 5๋ถ„ ์œ ์ง€ โ†’ +1 ์ธ์Šคํ„ด์Šค ์ถ”๊ฐ€\n# CPU < 30% 5๋ถ„ ์œ ์ง€ โ†’ -1 ์ธ์Šคํ„ด์Šค ์ œ๊ฑฐ\n# ์ตœ์†Œ 2, ์ตœ๋Œ€ 10 ์ธ์Šคํ„ด์Šค",
"common_mistake": "Scale-out(์ถ”๊ฐ€)๊ณผ Scale-in(์ œ๊ฑฐ) ๊ทœ์น™์„ ๋ชจ๋‘ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Scale-out๋งŒ ์„ค์ •ํ•˜๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ค„์–ด๋“ค์ง€ ์•Š์•„ ๋น„์šฉ์ด ๊ณ„์† ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"autoscale",
"scale-out",
"scale-in",
"metric",
"cooldown",
"min/max instances"
],
"source_id": "azure-vmss-overview",
"details": [
"๋ƒ‰๊ฐ ๊ธฐ๊ฐ„(Cooldown): Scale ๋™์ž‘ ํ›„ ๋‹ค์Œ ๋™์ž‘๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„. ๋„ˆ๋ฌด ์งง์œผ๋ฉด ์ง„๋™(flapping) ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.",
"์ผ์ • ๊ธฐ๋ฐ˜ Autoscale: ํŠน์ • ์š”์ผยท์‹œ๊ฐ„๋Œ€์— ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ๊ณ ์ •ํ•˜๊ฑฐ๋‚˜ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: Scale-in/out ๊ทœ์น™ ์„ค๊ณ„, ๋ƒ‰๊ฐ ๊ธฐ๊ฐ„ ๊ฐœ๋…, ๋ฉ”ํŠธ๋ฆญ ๊ธฐ๋ฐ˜ vs ์ผ์ • ๊ธฐ๋ฐ˜ ์„ ํƒ, VMSS์™€ App Service์˜ Autoscale ์ฐจ์ด๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-vnet-peering",
"certification": "AZ-104",
"title": "VNet Peering โ€” ๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ ํ”ผ์–ด๋ง",
"summary": "๋‘ VNet์„ Microsoft ๋ฐฑ๋ณธ ๋„คํŠธ์›Œํฌ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋™์ผ region(Local Peering)๊ณผ ๋‹ค๋ฅธ region(Global Peering) ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.",
"example": "az network vnet peering create \\\n --name VNet1-to-VNet2 \\\n --vnet-name VNet1 \\\n --remote-vnet VNet2 \\\n --resource-group myRG\n# ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ๋„ ์ƒ์„ฑํ•ด์•ผ ํ•จ",
"common_mistake": "ํ”ผ์–ด๋ง์€ ๋น„์ „์ด์ (non-transitive)์ž…๋‹ˆ๋‹ค. Aโ†”B, Bโ†”C๋กœ ํ”ผ์–ด๋งํ•ด๋„ A์—์„œ C๋กœ ์ง์ ‘ ํ†ต์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Aโ†”C๋ฅผ ๋ณ„๋„๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"VNet peering",
"non-transitive",
"local peering",
"global peering",
"transit"
],
"source_id": "azure-vnet-overview",
"details": [
"ํ”ผ์–ด๋ง ์กฐ๊ฑด: ๋‘ VNet์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์ด ๊ฒน์น˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”ผ์–ด๋ง์€ ์–‘๋ฐฉํ–ฅ ์„ค์ •์ด ๊ฐ๊ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.",
"๊ฒŒ์ดํŠธ์›จ์ด ์ „์†ก(Gateway Transit): ํ”ผ์–ด๋ง๋œ VNet์ด ํ—ˆ๋ธŒ์˜ VPN Gateway๋ฅผ ๊ณต์œ ํ•ด ์˜จํ”„๋ ˆ๋ฏธ์Šค ์—ฐ๊ฒฐ์— ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ๋น„์ „์ด์„ฑ์œผ๋กœ ์ธํ•œ ์—ฐ๊ฒฐ ๋ถˆ๊ฐ€ ์‹œ๋‚˜๋ฆฌ์˜ค, ์ฃผ์†Œ ๊ณต๊ฐ„ ์ค‘์ฒฉ ์˜ค๋ฅ˜, Gateway Transit ์„ค์ • ๋ฐฉ๋ฒ•์ด ์ž์ฃผ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰",
"related_practices": [
"azure-lab-10"
]
},
{
"id": "azure-route-table",
"certification": "AZ-104",
"title": "Route Table โ€” ๊ฒฝ๋กœ ํ…Œ์ด๋ธ”",
"summary": "์„œ๋ธŒ๋„ท์˜ ํŠธ๋ž˜ํ”ฝ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•ฉ๋‹ˆ๋‹ค(UDR: User-Defined Route). ๊ธฐ๋ณธ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ๋ฅผ ์žฌ์ •์˜ํ•ด ํŠธ๋ž˜ํ”ฝ์„ NVA, VPN GW, VNet Gateway ๋“ฑ์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.",
"example": "az network route-table create --name myRT --resource-group myRG\naz network route-table route create \\\n --route-table-name myRT \\\n --name force-to-firewall \\\n --address-prefix 0.0.0.0/0 \\\n --next-hop-type VirtualAppliance \\\n --next-hop-ip-address 10.0.1.4",
"common_mistake": "๊ฒฝ๋กœ ํ…Œ์ด๋ธ”์€ ์„œ๋ธŒ๋„ท์— ์—ฐ๊ฒฐํ•ด์•ผ ํšจ๊ณผ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. Route Table์„ ๋งŒ๋“ค๊ธฐ๋งŒ ํ•˜๊ณ  ์„œ๋ธŒ๋„ท์— ์—ฐ๊ฒฐ(association)ํ•˜์ง€ ์•Š์œผ๋ฉด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
"keywords": [
"route table",
"UDR",
"next hop",
"NVA",
"VirtualAppliance",
"subnet association"
],
"source_id": "azure-vnet-overview",
"details": [
"Next hop ์œ ํ˜•: VirtualAppliance(๋ฐฉํ™”๋ฒฝ NVA), VirtualNetworkGateway(VPN), Internet, VnetLocal, None(ํŠธ๋ž˜ํ”ฝ ๋“œ๋กญ).",
"๊ฐ•์ œ ํ„ฐ๋„๋ง(Force Tunneling): 0.0.0.0/0์„ VPN Gateway๋กœ ๋ณด๋‚ด ์ธํ„ฐ๋„ท ํŠธ๋ž˜ํ”ฝ๋„ ์˜จํ”„๋ ˆ๋ฏธ์Šค ๊ฒฝ์œ ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ํŠน์ • ํŠธ๋ž˜ํ”ฝ์„ NVA๋กœ ์šฐํšŒํ•˜๋Š” UDR ์„ค๊ณ„, ๊ฐ•์ œ ํ„ฐ๋„๋ง ๊ตฌ์„ฑ, ์‹œ์Šคํ…œ ๊ฒฝ๋กœ vs ์‚ฌ์šฉ์ž ๊ฒฝ๋กœ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-private-endpoint",
"certification": "AZ-104",
"title": "Private Endpoint โ€” ํ”„๋ผ์ด๋น— ์—”๋“œํฌ์ธํŠธ",
"summary": "Azure PaaS ์„œ๋น„์Šค(Storage, SQL, Key Vault ๋“ฑ)์— VNet ๋‚ด ์‚ฌ์„ค IP๋กœ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์„ ํ†ตํ•˜์ง€ ์•Š์•„ ๋ฐ์ดํ„ฐ ๋…ธ์ถœ ์œ„ํ—˜์„ ์ค„์ž…๋‹ˆ๋‹ค.",
"example": "az network private-endpoint create \\\n --name myPE \\\n --resource-group myRG \\\n --vnet-name myVNet \\\n --subnet default \\\n --private-connection-resource-id /subscriptions/.../storageAccounts/myaccount \\\n --group-ids blob",
"common_mistake": "Private Endpoint ์ƒ์„ฑ ํ›„ DNS ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Private DNS Zone๊ณผ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์œผ๋ฉด ๊ณต์šฉ DNS๊ฐ€ Public IP๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ธํ„ฐ๋„ท ๊ฒฝ๋กœ๋กœ ์ ‘์†๋ฉ๋‹ˆ๋‹ค.",
"keywords": [
"private endpoint",
"private link",
"private IP",
"DNS zone",
"Service Endpoint ์ฐจ์ด"
],
"source_id": "azure-private-endpoint",
"details": [
"Private Endpoint vs Service Endpoint: Private Endpoint๋Š” VNet์— ์‚ฌ์„ค IP๋ฅผ ๋ถ€์—ฌ(๋” ์•ˆ์ „), Service Endpoint๋Š” Public IP ์œ ์ง€ํ•˜๋˜ VNet์—์„œ๋งŒ ํ—ˆ์šฉ.",
"Private DNS Zone ์ž๋™ ํ†ตํ•ฉ: Private Endpoint ์ƒ์„ฑ ์‹œ DNS Zone Group์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ DNS ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: Private Endpoint vs Service Endpoint ์ฐจ์ด, DNS ์„ค์ • ์—†์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ, ์˜จํ”„๋ ˆ๋ฏธ์Šค์—์„œ Private Endpoint ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰",
"related_practices": [
"azure-lab-11"
]
},
{
"id": "azure-load-balancer-probe",
"certification": "AZ-104",
"title": "Load Balancer โ€” ๋ถ€ํ•˜ ๋ถ„์‚ฐ ์žฅ์น˜",
"summary": "L4(TCP/UDP) ์ˆ˜์ค€์—์„œ ์ธ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐฑ์—”๋“œ VM ํ’€๋กœ ๋ถ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Public LB๋Š” ์ธํ„ฐ๋„ท ํŠธ๋ž˜ํ”ฝ, Internal LB๋Š” VNet ๋‚ด๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.",
"example": "az network lb create \\\n --name myLB \\\n --resource-group myRG \\\n --frontend-ip-name frontendIP \\\n --backend-pool-name backendPool\n# ์ƒํƒœ ํ”„๋กœ๋ธŒ ์ถ”๊ฐ€\naz network lb probe create --lb-name myLB --name myProbe --protocol Http --port 80 --path /health",
"common_mistake": "์ƒํƒœ ํ”„๋กœ๋ธŒ(Health Probe)๊ฐ€ ์‹คํŒจํ•˜๋ฉด ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋ธŒ ๊ฒฝ๋กœ(/health)๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์œผ๋ฉด ์ •์ƒ VM๋„ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.",
"keywords": [
"load balancer",
"health probe",
"backend pool",
"frontend IP",
"SKU Basic/Standard"
],
"source_id": "azure-load-balancer",
"details": [
"SKU: Basic(๋ฌด๋ฃŒ, AZ ๋ฏธ์ง€์›, ๊ณต๊ฐœ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ) vs Standard(์œ ๋ฃŒ, AZ ์ง€์›, HTTPS ํ”„๋กœ๋ธŒ, SLA 99.99%). ์ƒˆ ๊ตฌ์ถ•์€ Standard ๊ถŒ์žฅ.",
"๋ถ€ํ•˜ ๋ถ„์‚ฐ ๊ทœ์น™: ํฌํŠธยทํ”„๋กœํ† ์ฝœยท์„ธ์…˜ ์ง€์†์„ฑ(Client IP/Protocol)์„ ์„ค์ •. Floating IP๋กœ SQL AlwaysOn ๋“ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ํ”„๋กœ๋ธŒ ์‹คํŒจ ์‹œ ๋™์ž‘, Public vs Internal LB ์„ ํƒ, Basic vs Standard SKU ์ฐจ์ด, ์„ธ์…˜ ์ง€์†์„ฑ ์˜ต์…˜์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-private-dns",
"certification": "AZ-104",
"title": "Private DNS Zone โ€” ์‚ฌ์„ค DNS ์˜์—ญ",
"summary": "VNet ๋‚ด๋ถ€์—์„œ๋งŒ ํ•ด์„๋˜๋Š” ์‚ฌ์„ค ๋„๋ฉ”์ธ์„ ํ˜ธ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค. Private Endpoint, ๋‚ด๋ถ€ ์„œ๋น„์Šค ๊ฒ€์ƒ‰, ์˜จํ”„๋ ˆ๋ฏธ์Šค DNS ํ†ตํ•ฉ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.",
"example": "az network private-dns zone create \\\n --name 'privatelink.blob.core.windows.net' \\\n --resource-group myRG\naz network private-dns link vnet create \\\n --zone-name 'privatelink.blob.core.windows.net' \\\n --virtual-network myVNet \\\n --registration-enabled false",
"common_mistake": "Private DNS Zone ์ƒ์„ฑ๋งŒ์œผ๋กœ๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. VNet์— ๋งํฌ(link)๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ด๋‹น VNet์˜ VM์ด ์‚ฌ์„ค DNS๋ฅผ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"private DNS zone",
"VNet link",
"registration",
"privatelink",
"custom DNS"
],
"source_id": "azure-dns-overview",
"details": [
"์ž๋™ ๋“ฑ๋ก(Auto-registration): VNet ๋งํฌ์—์„œ ํ™œ์„ฑํ™”ํ•˜๋ฉด ํ•ด๋‹น VNet์˜ VM์ด ์ž๋™์œผ๋กœ A ๋ ˆ์ฝ”๋“œ๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.",
"Private Endpoint DNS: `privatelink.blob.core.windows.net` ๊ฐ™์€ ํŠน์ˆ˜ ์˜์—ญ์„ ์‚ฌ์šฉํ•ด PaaS ์„œ๋น„์Šค์˜ ์‚ฌ์„ค IP๋ฅผ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: Private Endpoint์™€ Private DNS Zone ์—ฐ๋™ ์ˆœ์„œ, ์ž๋™ ๋“ฑ๋ก vs ์ˆ˜๋™ ๋ ˆ์ฝ”๋“œ, VNet ๋งํฌ ์—†์„ ๋•Œ DNS ํ•ด์„ ์‹คํŒจ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-monitor-metrics",
"certification": "AZ-104",
"title": "Azure Monitor Metrics โ€” ๋ชจ๋‹ˆํ„ฐ ๋ฉ”ํŠธ๋ฆญ",
"summary": "Azure ๋ฆฌ์†Œ์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋Š” ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ(CPU%, ๋„คํŠธ์›Œํฌ In/Out, ๋””์Šคํฌ IOPS ๋“ฑ)๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜๊ณ  ๊ฒฝ๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.",
"example": "az monitor metrics list \\\n --resource /subscriptions/.../virtualMachines/myVM \\\n --metric 'Percentage CPU' \\\n --interval PT1M",
"common_mistake": "๊ธฐ๋ณธ ํ”Œ๋žซํผ ๋ฉ”ํŠธ๋ฆญ์€ 93์ผ ๋ณด๊ด€๋ฉ๋‹ˆ๋‹ค. ๋” ์˜ค๋ž˜ ๋ณด๊ด€ํ•˜๊ฑฐ๋‚˜ ์ปค์Šคํ…€ ๋ฉ”ํŠธ๋ฆญ์„ ์ €์žฅํ•˜๋ ค๋ฉด Log Analytics Workspace๋กœ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"metrics",
"Azure Monitor",
"CPU",
"latency",
"alert",
"93 days retention"
],
"source_id": "azure-monitor-overview",
"details": [
"ํ”Œ๋žซํผ ๋ฉ”ํŠธ๋ฆญ์€ ๋ณ„๋„ ์„ค์ • ์—†์ด ์ž๋™ ์ˆ˜์ง‘๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ŠคํŠธ OS ๋‚ด๋ถ€ ๋ฉ”ํŠธ๋ฆญ(๋ฉ”๋ชจ๋ฆฌ ๋“ฑ)์€ Azure Monitor Agent๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.",
"๋ฉ”ํŠธ๋ฆญ ํƒ์ƒ‰๊ธฐ(Metrics Explorer)์—์„œ ์—ฌ๋Ÿฌ ๋ฉ”ํŠธ๋ฆญ์„ ๋น„๊ตํ•˜๊ณ  ์ฐจํŠธ๋ฅผ ๋Œ€์‹œ๋ณด๋“œ์— ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ๋ฉ”ํŠธ๋ฆญ ๊ธฐ๋ฐ˜ ๊ฒฝ๋ณด ์„ค์ •, ํ”Œ๋žซํผ ๋ฉ”ํŠธ๋ฆญ vs ๊ฒŒ์ŠคํŠธ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ๋ฐฉ๋ฒ•, ๋ณด๊ด€ ๊ธฐ๊ฐ„ ํ•œ๊ณ„์™€ Log Analytics ์—ฐ๋™์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰",
"related_practices": [
"azure-lab-15"
]
},
{
"id": "azure-activity-log",
"certification": "AZ-104",
"title": "Activity Log โ€” ํ™œ๋™ ๋กœ๊ทธ",
"summary": "๊ตฌ๋… ๋ ˆ๋ฒจ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ด€๋ฆฌ ์ž‘์—…(๋ฆฌ์†Œ์Šค ์ƒ์„ฑยท์‚ญ์ œยท๋ณ€๊ฒฝ)์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€, ์–ธ์ œ, ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€ ๊ฐ์‚ฌ(Audit)์— ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.",
"example": "az monitor activity-log list \\\n --resource-group myRG \\\n --start-time 2024-01-01 \\\n --end-time 2024-01-31\n# Portal: Monitor โ†’ Activity Log",
"common_mistake": "Activity Log๋Š” ๊ธฐ๋ณธ 90์ผ ๋ณด๊ด€๋ฉ๋‹ˆ๋‹ค. ์žฅ๊ธฐ ๋ณด๊ด€์„ ์œ„ํ•ด Storage Account์— ์•„์นด์ด๋ธŒํ•˜๊ฑฐ๋‚˜ Log Analytics๋กœ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"activity log",
"audit",
"management plane",
"90 days",
"diagnostic settings"
],
"source_id": "azure-monitor-overview",
"details": [
"๊ธฐ๋ก ๋‚ด์šฉ: ๋ˆ„๊ฐ€(caller), ์–ธ์ œ(eventTimestamp), ๋ฌด์—‡์„(operation), ์„ฑ๊ณต/์‹คํŒจ(status). ๋ฐ์ดํ„ฐ ํ‰๋ฉด ์ž‘์—…(Blob ์ฝ๊ธฐ ๋“ฑ)์€ ๊ธฐ๋ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
"์ง„๋‹จ ์„ค์ •(Diagnostic Settings)์œผ๋กœ Activity Log๋ฅผ Log Analytics, Storage Account, Event Hub๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ๋ฆฌ์†Œ์Šค ์‚ญ์ œ ์ฑ…์ž„์ž ์ถ”์ , 90์ผ ์ด์ƒ ๋ณด๊ด€ ๋ฐฉ๋ฒ•, Activity Log vs Diagnostic Log(๋ฆฌ์†Œ์Šค ๋ ˆ๋ฒจ) ์ฐจ์ด๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-alert",
"certification": "AZ-104",
"title": "Alert Rule โ€” ๊ฒฝ๋ณด ๊ทœ์น™",
"summary": "๋ฉ”ํŠธ๋ฆญยท๋กœ๊ทธยทํ™œ๋™ ๋กœ๊ทธ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋ฉด ์ด๋ฉ”์ผยทSMSยทwebhookยทITSM ๋“ฑ์œผ๋กœ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. Action Group์— ์•Œ๋ฆผ ๋Œ€์ƒ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.",
"example": "az monitor alert create \\\n --name highCPU \\\n --resource /subscriptions/.../myVM \\\n --condition 'avg Percentage CPU > 80' \\\n --action email alice@example.com",
"common_mistake": "๊ฒฝ๋ณด๋Š” Action Group ์—†์ด๋Š” ๋ฐœ์ƒํ•ด๋„ ์•„๋ฌด๋„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ Action Group์— ์•Œ๋ฆผ ์ฑ„๋„์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"alert rule",
"action group",
"metric alert",
"log alert",
"severity",
"signal"
],
"source_id": "azure-monitor-overview",
"details": [
"์‹ ํ˜ธ ์œ ํ˜•: ๋ฉ”ํŠธ๋ฆญ(์ˆ˜์น˜ ์ž„๊ณ„๊ฐ’), ๋กœ๊ทธ(KQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ), ํ™œ๋™ ๋กœ๊ทธ(ํŠน์ • ์ž‘์—… ๋ฐœ์ƒ), ์„œ๋น„์Šค ์ƒํƒœ.",
"Action Group: ์ด๋ฉ”์ผ, SMS, ์ „ํ™”, Azure Function, Logic App, webhook, ITSM ํ†ตํ•ฉ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฒฝ๋ณด์—์„œ ๊ณต์œ  ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ๋ฉ”ํŠธ๋ฆญ ๊ฒฝ๋ณด ๊ตฌ์„ฑ ์ ˆ์ฐจ, Action Group ์ƒ์„ฑ ๋ฐ ์—ฐ๊ฒฐ, ๊ฒฝ๋ณด ์‹ฌ๊ฐ๋„(0~4) ๋ ˆ๋ฒจ, ์ •์  vs ๋™์  ์ž„๊ณ„๊ฐ’์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰",
"related_practices": [
"azure-lab-15"
]
},
{
"id": "azure-backup-policy",
"certification": "AZ-104",
"title": "Backup Policy โ€” ๋ฐฑ์—… ์ •์ฑ…",
"summary": "๋ฐฑ์—… ์Šค์ผ€์ค„(์ผ๋ณ„/์ฃผ๋ณ„)๊ณผ ๋ณด์กด ๊ธฐ๊ฐ„(์ผ/์ฃผ/์›”/๋…„)์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Recovery Services Vault์—์„œ ์›Œํฌ๋กœ๋“œ๋ณ„๋กœ ์ •์ฑ…์„ ๋งŒ๋“ค์–ด ๋ฆฌ์†Œ์Šค์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.",
"example": "az backup policy create \\\n --vault-name myVault \\\n --resource-group myRG \\\n --name myPolicy \\\n --policy @policy.json\n# policy.json์— ์Šค์ผ€์ค„๊ณผ ๋ณด์กด ๊ธฐ๊ฐ„ ์ •์˜",
"common_mistake": "๋ฐฑ์—… ์ •์ฑ…์„ ๋ณ€๊ฒฝํ•ด๋„ ๊ธฐ์กด ๋ณต์› ์ง€์  ๋ณด์กด ๊ธฐ๊ฐ„์€ ์†Œ๊ธ‰ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์ดํ›„ ์ƒ์„ฑ๋˜๋Š” ๋ณต์› ์ง€์ ์—๋งŒ ์ƒˆ ์ •์ฑ…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.",
"keywords": [
"backup policy",
"schedule",
"retention",
"RPO",
"Recovery Services Vault"
],
"source_id": "azure-recovery-services-vault",
"details": [
"Enhanced Policy(ํ–ฅ์ƒ๋œ ์ •์ฑ…): ์‹œ๊ฐ„๋‹น ๋ฐฑ์—…, AZ ์ค‘๋ณต ๋ณต์› ์ง€์ , Trusted Launch VM ์ง€์› ๋“ฑ ๋” ๋งŽ์€ ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.",
"๋ณด์กด ๊ณ„์ธต: ์ผ๋ณ„(์ตœ๋Œ€ 180์ผ), ์ฃผ๋ณ„(์ตœ๋Œ€ 520์ฃผ), ์›”๋ณ„(์ตœ๋Œ€ 120๊ฐœ์›”), ์—ฐ๋ณ„(์ตœ๋Œ€ 10๋…„).",
"์‹œํ—˜ ํŒจํ„ด: RPO(๋ณต๊ตฌ ์‹œ์  ๋ชฉํ‘œ)์— ๋”ฐ๋ฅธ ๋ฐฑ์—… ์Šค์ผ€์ค„ ์„ ํƒ, ์žฅ๊ธฐ ๋ณด์กด ์„ค์ •, GRS ๋ฐฑ์—…์œผ๋กœ ์ง€์—ญ ๊ฐ„ ๋ณต์› ๋ฐฉ๋ฒ•์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰",
"related_practices": [
"azure-lab-8"
]
},
{
"id": "azure-restore",
"certification": "AZ-104",
"title": "Restore โ€” ๋ณต์›",
"summary": "Recovery Services Vault์˜ ๋ณต์› ์ง€์ ์—์„œ VM, ๋””์Šคํฌ, ํŒŒ์ผ์„ ์›๋ž˜ ์œ„์น˜ ๋˜๋Š” ์ƒˆ ์œ„์น˜๋กœ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.",
"example": "az backup restore restore-disks \\\n --vault-name myVault \\\n --resource-group myRG \\\n --container-name myVM \\\n --item-name myVM \\\n --rp-name 'RecoveryPointName' \\\n --storage-account myStorageAcct",
"common_mistake": "VM ์ „์ฒด ๋ณต์›(Restore VM)๊ณผ ๋””์Šคํฌ๋งŒ ๋ณต์›(Restore Disks)์€ ๋‹ค๋ฅธ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๋””์Šคํฌ ๋ณต์› ํ›„์—๋Š” VM์„ ๋ณ„๋„๋กœ ์žฌ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"restore",
"recovery point",
"original location",
"alternate location",
"cross-region restore"
],
"source_id": "azure-recovery-services-vault",
"details": [
"๋ณต์› ์˜ต์…˜: ์›๋ž˜ ์œ„์น˜(๊ธฐ์กด VM ๋ฎ์–ด์“ฐ๊ธฐ), ์ƒˆ ์œ„์น˜(์ƒˆ VM ์ƒ์„ฑ), ๋””์Šคํฌ๋งŒ ๋ณต์›(Storage Account์— VHD ์ €์žฅ), ํŒŒ์ผ ๋ณต์›(ํŒŒ์ผ ๋‹จ์œ„).",
"์ง€์—ญ ๊ฐ„ ๋ณต์›(CRR): GRS Vault์—์„œ ๋ณด์กฐ region์˜ ๋ณต์› ์ง€์ ์œผ๋กœ DR ๋ณต์›. CRR ๊ธฐ๋Šฅ์„ Vault์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ๋ณต์› ์œ ํ˜• ์„ ํƒ(VM vs ํŒŒ์ผ), ์ง€์—ญ ๊ฐ„ ๋ณต์› ์š”๊ฑด, Soft Delete ์ƒํƒœ์—์„œ ๋ณต์› ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰",
"related_practices": [
"azure-lab-8"
]
},
{
"id": "azure-app-service-plan",
"certification": "AZ-104",
"title": "App Service Plan โ€” ์•ฑ ์„œ๋น„์Šค ํ”Œ๋žœ",
"summary": "App Service ์•ฑ์ด ์‹คํ–‰๋˜๋Š” ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค(CPU, ๋ฉ”๋ชจ๋ฆฌ, ์Šคํ† ๋ฆฌ์ง€)๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผ ํ”Œ๋žœ์˜ ์•ฑ์€ ๊ฐ™์€ VM ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.",
"example": "az appservice plan create \\\n --name myPlan \\\n --resource-group myRG \\\n --sku P1v3 \\\n --is-linux\naz webapp create --name myApp --plan myPlan --runtime 'NODE:18-lts'",
"common_mistake": "Free/Shared ํ”Œ๋žœ์€ Autoscale๊ณผ ์ปค์Šคํ…€ ๋„๋ฉ”์ธ SSL์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์—๋Š” Standard(S1) ์ด์ƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"App Service Plan",
"SKU",
"Free",
"Basic",
"Standard",
"Premium",
"Isolated",
"autoscale"
],
"source_id": "azure-app-service-overview",
"details": [
"SKU ๊ณ„์ธต: Free/Shared(๊ณต์œ  ์ธํ”„๋ผ, SLA ์—†์Œ), Basic(์ „์šฉ VM), Standard(Autoscale, SSL), Premium(๊ณ ์„ฑ๋Šฅ), Isolated(VNet ์ „์šฉ ํ™˜๊ฒฝ).",
"๊ฐ™์€ ํ”Œ๋žœ์— ์—ฌ๋Ÿฌ ์•ฑ์„ ๋„ฃ์œผ๋ฉด ์ปดํ“จํŒ…์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ๋งŽ์•„์ง€๋ฉด ํ”Œ๋žœ์„ ์Šค์ผ€์ผ์—…(ํฌ๊ธฐ ๋ณ€๊ฒฝ)ํ•˜๊ฑฐ๋‚˜ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ํ”Œ๋žœ SKU๋ณ„ ์ง€์› ๊ธฐ๋Šฅ(Autoscale, Deployment Slots, VNet ํ†ตํ•ฉ ์กฐ๊ฑด), ํ”Œ๋žœ ๋ณ€๊ฒฝ ์‹œ ์•ฑ ์˜ํ–ฅ์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "๊ณ ๊ธ‰",
"related_practices": [
"azure-lab-13"
]
},
{
"id": "azure-container-registry",
"certification": "AZ-104",
"title": "Azure Container Registry โ€” ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ",
"summary": "Docker ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์™€ Helm ์ฐจํŠธ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ์„ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค. AKS, Container Instances, App Service์™€ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.",
"example": "az acr create \\\n --name myRegistry \\\n --resource-group myRG \\\n --sku Standard\naz acr build --registry myRegistry --image myapp:v1 .\ndocker pull myregistry.azurecr.io/myapp:v1",
"common_mistake": "ACR์—์„œ ์ด๋ฏธ์ง€๋ฅผ pullํ•˜๋ ค๋ฉด ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. AKS์—์„œ ์‚ฌ์šฉ ์‹œ Managed Identity ๋˜๋Š” Service Principal๋กœ pull ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"ACR",
"container registry",
"docker",
"image",
"geo-replication",
"SKU Basic/Standard/Premium"
],
"source_id": "azure-app-service-overview",
"details": [
"SKU: Basic(๊ฐœ๋ฐœ์šฉ), Standard(์ผ๋ฐ˜, geo-replication ๋ฏธ์ง€์›), Premium(geo-replication, Private Link ์ง€์›).",
"ACR Tasks: ์ด๋ฏธ์ง€ ๋นŒ๋“œยทํ…Œ์ŠคํŠธยทํŒจ์น˜๋ฅผ Azure์—์„œ ์ง์ ‘ ์‹คํ–‰. Docker ์—†์ด ํด๋ผ์šฐ๋“œ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ACR SKU๋ณ„ ๊ธฐ๋Šฅ ์ฐจ์ด, AKS์—์„œ ACR ์ด๋ฏธ์ง€ pull ๊ถŒํ•œ ์„ค์ •(Managed Identity ์—ฐ๊ฒฐ), geo-replication ์„ค์ •์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "๊ณ ๊ธ‰"
},
{
"id": "azure-key-vault",
"certification": "AZ-104",
"title": "Key Vault โ€” ํ‚ค ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ์Œ",
"summary": "๋น„๋ฐ€(Secret), ํ‚ค(Key), ์ธ์ฆ์„œ(Certificate)๋ฅผ ์ค‘์•™์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅยท๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•ฑ ์ฝ”๋“œ์—์„œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ œ๊ฑฐํ•˜๋Š” ํ•ต์‹ฌ ๋ณด์•ˆ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.",
"example": "az keyvault create --name myKV --resource-group myRG --location koreacentral\naz keyvault secret set --vault-name myKV --name 'db-password' --value 'MyP@ss'\naz keyvault secret show --vault-name myKV --name 'db-password'",
"common_mistake": "Key Vault์— ์ ‘๊ทผํ•˜๋ ค๋ฉด Access Policy ๋˜๋Š” RBAC๋กœ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Managed Identity๋ฅผ ํ†ตํ•ด ์•ฑ์ด ์ž๊ฒฉ ์ฆ๋ช… ์—†์ด Key Vault์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.",
"keywords": [
"Key Vault",
"secret",
"key",
"certificate",
"soft delete",
"RBAC",
"access policy"
],
"source_id": "azure-key-vault-overview",
"details": [
"์ ‘๊ทผ ์ œ์–ด: ๊ตฌ์‹ Access Policy ๋ฐฉ์‹๊ณผ ์ตœ์‹  Azure RBAC ๋ฐฉ์‹ ๋‘ ๊ฐ€์ง€. ์ƒˆ ๊ตฌ์ถ•์€ RBAC ๋ฐฉ์‹ ๊ถŒ์žฅ.",
"Soft Delete์™€ Purge Protection: ์‹ค์ˆ˜๋กœ ์‚ญ์ œ๋œ ๋น„๋ฐ€์„ 7~90์ผ ๋‚ด ๋ณต์› ๊ฐ€๋Šฅ. Purge Protection ํ™œ์„ฑํ™” ์‹œ ์‚ญ์ œ๋œ ํ•ญ๋ชฉ ์˜๊ตฌ ์ œ๊ฑฐ ๋ถˆ๊ฐ€.",
"์‹œํ—˜ ํŒจํ„ด: Managed Identity๋กœ ์•ฑ์—์„œ ๋น„๋ฐ€ ์ ‘๊ทผ, Soft Delete/Purge Protection ๊ฐœ๋…, HSM(ํ•˜๋“œ์›จ์–ด ๋ณด์•ˆ ๋ชจ๋“ˆ) ์ง€์› SKU ์ฐจ์ด๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰",
"related_practices": [
"azure-lab-9"
]
},
{
"id": "azure-cost-management",
"certification": "AZ-104",
"title": "Cost Management โ€” ๋น„์šฉ ๊ด€๋ฆฌ",
"summary": "Azure ์„œ๋น„์Šค ์‚ฌ์šฉ ๋น„์šฉ์„ ๋ถ„์„ํ•˜๊ณ  ์˜ˆ์‚ฐ์„ ์„ค์ •ํ•ด ์ดˆ๊ณผ ์‹œ ์•Œ๋ฆผ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํƒœ๊ทธยท๊ตฌ๋…ยทRG๋ณ„๋กœ ๋น„์šฉ์„ ์„ธ๋ถ„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"example": "az consumption budget create \\\n --budget-name monthlyBudget \\\n --amount 1000 \\\n --time-grain Monthly \\\n --start-date 2024-01-01 \\\n --end-date 2024-12-31",
"common_mistake": "์˜ˆ์‚ฐ ๊ฒฝ๋ณด๋Š” ์ง€์ถœ์ด ์ž„๊ณ„๊ฐ’์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด์ง€, ์ž๋™์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜ ๋น„์šฉ์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
"keywords": [
"Cost Management",
"budget",
"alert",
"cost analysis",
"tags",
"billing"
],
"source_id": "azure-monitor-overview",
"details": [
"๋น„์šฉ ๋ถ„์„(Cost Analysis): ๊ธฐ๊ฐ„ยท์„œ๋น„์Šคยทlocationยทํƒœ๊ทธ ๋“ฑ์œผ๋กœ ํ•„ํ„ฐ๋งํ•ด ๋น„์šฉ ๋‚ด์—ญ์„ ํŒŒ์ด/๋ˆ„์  ์ฐจํŠธ๋กœ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.",
"์˜ˆ์‚ฐ ๊ฒฝ๋ณด: ์‹ค์ œ ๋น„์šฉ ๋˜๋Š” ์˜ˆ์ธก ๋น„์šฉ์ด ์„ค์ • ๋น„์œจ(์˜ˆ: 80%, 100%)์— ๋„๋‹ฌํ•˜๋ฉด Action Group์œผ๋กœ ์•Œ๋ฆผ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ์˜ˆ์‚ฐ ๊ฒฝ๋ณด ์„ค์ • ์ ˆ์ฐจ, ํƒœ๊ทธ๋ฅผ ํ†ตํ•œ ๋น„์šฉ ๋ถ„๋ฅ˜, Cost Management vs Azure Advisor ์—ญํ•  ์ฐจ์ด๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-bastion",
"certification": "AZ-104",
"title": "Azure Bastion โ€” ์•ˆ์ „ํ•œ ์›๊ฒฉ ์ ‘์†",
"summary": "๊ณต์šฉ IP ์—†์ด Azure Portal์—์„œ ์ง์ ‘ VM์— RDP/SSH๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. TLS 443 ํฌํŠธ๋งŒ ์‚ฌ์šฉํ•ด VM์˜ ๊ด€๋ฆฌ ํฌํŠธ๋ฅผ ์ธํ„ฐ๋„ท์— ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
"example": "az network bastion create \\\n --name myBastion \\\n --public-ip-address myBastionIP \\\n --resource-group myRG \\\n --vnet-name myVNet \\\n --location koreacentral",
"common_mistake": "Bastion์€ VNet์— `AzureBastionSubnet`์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์„œ๋ธŒ๋„ท(/27 ์ด์ƒ)์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"Azure Bastion",
"RDP",
"SSH",
"AzureBastionSubnet",
"port 443",
"no public IP"
],
"source_id": "azure-bastion-overview",
"details": [
"Bastion SKU: Basic(RDP/SSH ๊ธฐ๋ณธ), Standard(ํŒŒ์ผ ์ „์†ก, ๋ฉ€ํ‹ฐํƒญ, ๊ธฐ๋ณธ ํ˜ธ์ŠคํŠธ ํฌํŠธ ์™ธ ํฌํŠธ, VM Auth ๋“ฑ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ).",
"VM์— Public IP์™€ NSG์— RDP/SSH ํ—ˆ์šฉ ๊ทœ์น™์ด ์—†์–ด๋„ Bastion์œผ๋กœ ์ ‘์† ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ ํ‘œ๋ฉด์ด ํฌ๊ฒŒ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: Bastion ์„œ๋ธŒ๋„ท ์ด๋ฆ„ยทํฌ๊ธฐ ์š”๊ตฌ์‚ฌํ•ญ, Public IP ์—†๋Š” VM ์ ‘์† ๋ฐฉ๋ฒ•, JIT(Just-In-Time) VM Access์™€ ์ฐจ์ด๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰",
"related_practices": [
"azure-lab-12"
]
},
{
"id": "azure-nat-gateway",
"certification": "AZ-104",
"title": "NAT Gateway โ€” ์•„์›ƒ๋ฐ”์šด๋“œ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ",
"summary": "์„œ๋ธŒ๋„ท์˜ ๋ชจ๋“  VM์ด ๋™์ผํ•œ ๊ณ ์ • ๊ณต์šฉ IP๋กœ ์ธํ„ฐ๋„ท์— ๋‚˜๊ฐ€๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์•„์›ƒ๋ฐ”์šด๋“œ ์—ฐ๊ฒฐ ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ณ  SNAT ํฌํŠธ ๊ณ ๊ฐˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.",
"example": "az network public-ip create --name myNatIP --resource-group myRG --sku Standard\naz network nat gateway create \\\n --name myNatGW \\\n --resource-group myRG \\\n --public-ip-addresses myNatIP\naz network vnet subnet update --nat-gateway myNatGW ...",
"common_mistake": "NAT Gateway๋Š” ์•„์›ƒ๋ฐ”์šด๋“œ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ์ธ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›์œผ๋ ค๋ฉด ์—ฌ์ „ํžˆ Public IP ๋˜๋Š” Load Balancer๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"NAT Gateway",
"outbound",
"SNAT",
"public IP",
"port exhaustion",
"static IP"
],
"source_id": "azure-nat-gateway",
"details": [
"SNAT(Source NAT): VM์˜ ์‚ฌ์„ค IP๋ฅผ NAT Gateway์˜ ๊ณต์šฉ IP๋กœ ๋ณ€ํ™˜. ์—ฌ๋Ÿฌ VM์ด ๊ฐ™์€ ๊ณต์šฉ IP๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.",
"Load Balancer ์•„์›ƒ๋ฐ”์šด๋“œ ๊ทœ์น™ vs NAT Gateway: NAT Gateway๊ฐ€ ๋” ๋งŽ์€ SNAT ํฌํŠธ(64,512 ร— IP ์ˆ˜)๋ฅผ ์ œ๊ณตํ•ด ๊ณ ๋ถ€ํ•˜์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: NAT Gateway ์„œ๋ธŒ๋„ท ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•, ๊ณ ์ • ์•„์›ƒ๋ฐ”์šด๋“œ IP ์š”๊ตฌ ์‹œ๋‚˜๋ฆฌ์˜ค, Load Balancer์™€ ๋™์‹œ ์‚ฌ์šฉ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-app-service",
"certification": "AZ-104",
"title": "App Service โ€” ์›น ์•ฑ ํ˜ธ์ŠคํŒ…",
"summary": "์ฝ”๋“œ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ์™„์ „ ๊ด€๋ฆฌํ˜• PaaS ์›น ํ˜ธ์ŠคํŒ… ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. .NET, Node.js, Python, Java, PHP ๋“ฑ ๋‹ค์–‘ํ•œ ๋Ÿฐํƒ€์ž„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.",
"example": "az webapp create \\\n --name myWebApp \\\n --resource-group myRG \\\n --plan myPlan \\\n --runtime 'PYTHON:3.11'\naz webapp deployment source config-zip \\\n --name myWebApp --src app.zip",
"common_mistake": "App Service์˜ ์•ฑ ์„ค์ •(Application Settings)์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์•ฑ์— ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์„ค์ •๋ณด๋‹ค ์•ฑ ์„ค์ •์— ๋„ฃ๋Š” ๊ฒƒ์ด ๋ณด์•ˆ์— ์ข‹์Šต๋‹ˆ๋‹ค.",
"keywords": [
"App Service",
"web app",
"deployment slot",
"custom domain",
"SSL",
"VNet integration"
],
"source_id": "azure-app-service-overview",
"details": [
"๋ฐฐํฌ ๋ฐฉ๋ฒ•: ZIP ๋ฐฐํฌ, Git(๋กœ์ปฌ/GitHub Actions), Docker ์ด๋ฏธ์ง€, Azure DevOps. CI/CD ์—ฐ๋™์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.",
"VNet ํ†ตํ•ฉ: Standard ์ด์ƒ ํ”Œ๋žœ์—์„œ App Service๋ฅผ VNet์— ์—ฐ๊ฒฐํ•ด ์‚ฌ์„ค ๋ฆฌ์†Œ์Šค(DB, ์บ์‹œ)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ์ปค์Šคํ…€ ๋„๋ฉ”์ธยทSSL ๋ฐ”์ธ๋”ฉ, ๋ฐฐํฌ ์Šฌ๋กฏ ์Šค์™‘, VNet ํ†ตํ•ฉ ์„ค์ •, App Settings vs Connection Strings ์ฐจ์ด๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "๊ณ ๊ธ‰",
"related_practices": [
"azure-lab-13"
]
},
{
"id": "azure-deployment-slot",
"certification": "AZ-104",
"title": "Deployment Slot โ€” ๋ฐฐํฌ ์Šฌ๋กฏ",
"summary": "์•ฑ์˜ ์Šคํ…Œ์ด์ง• ๋ฒ„์ „์„ ๋ณ„๋„ ์Šฌ๋กฏ์— ๋ฐฐํฌํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํ›„ ํ”„๋กœ๋•์…˜ ์Šฌ๋กฏ๊ณผ ์ฆ‰์‹œ ๊ต์ฒด(Swap)ํ•ฉ๋‹ˆ๋‹ค. Standard ์ด์ƒ ํ”Œ๋žœ์—์„œ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.",
"example": "az webapp deployment slot create \\\n --name myWebApp \\\n --resource-group myRG \\\n --slot staging\n# ํ…Œ์ŠคํŠธ ํ›„ swap\naz webapp deployment slot swap \\\n --name myWebApp --slot staging",
"common_mistake": "Swap ์‹œ ์Šฌ๋กฏ ๊ณ ์œ  ์„ค์ •(Slot Settings๋กœ ํ‘œ์‹œ๋œ ํ•ญ๋ชฉ)์€ ๊ต์ฒด๋˜์ง€ ์•Š๊ณ  ๊ฐ ์Šฌ๋กฏ์— ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ: ์Šคํ…Œ์ด์ง• DB ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด์€ ํ”„๋กœ๋•์…˜์œผ๋กœ ๋”ฐ๋ผ๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
"keywords": [
"deployment slot",
"staging",
"swap",
"slot settings",
"traffic routing",
"warm-up"
],
"source_id": "azure-app-service-overview",
"details": [
"Swap ๋™์ž‘: ์Šฌ๋กฏ์ด ์›Œ๋ฐ์—…๋œ ํ›„ ๋ผ์šฐํ„ฐ ์ˆ˜์ค€์—์„œ ํŠธ๋ž˜ํ”ฝ์ด ์ฆ‰์‹œ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋‹ค์šดํƒ€์ž„ ์—†์ด ์ƒˆ ๋ฒ„์ „ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.",
"ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ…: % ๊ธฐ๋ฐ˜์œผ๋กœ ์ผ๋ถ€ ํŠธ๋ž˜ํ”ฝ๋งŒ ์Šคํ…Œ์ด์ง• ์Šฌ๋กฏ์œผ๋กœ ๋ณด๋‚ด A/B ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: Slot Settings(์Šฌ๋กฏ ๊ณ ์ • ์„ค์ •) ๊ฐœ๋…, Swap ์‹œ ์„ค์ • ๊ต์ฒด ๊ทœ์น™, Auto Swap ๊ธฐ๋Šฅ, ์Šฌ๋กฏ ์ˆ˜ ์ œํ•œ(Standard=5) ์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "๊ณ ๊ธ‰",
"related_practices": [
"azure-lab-14"
]
},
{
"id": "azure-aci",
"certification": "AZ-104",
"title": "Azure Container Instances โ€” ์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค",
"summary": "VM์ด๋‚˜ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ ์—†์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ดˆ ๋‹จ์œ„๋กœ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœ ์ž‘์—…, ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ, ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.",
"example": "az container create \\\n --name myapp \\\n --resource-group myRG \\\n --image nginx:latest \\\n --cpu 1 --memory 1.5 \\\n --ports 80 \\\n --dns-name-label myapp-dns",
"common_mistake": "ACI๋Š” ๋‹จ๊ธฐ ์‹คํ–‰ ์ปจํ…Œ์ด๋„ˆ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ง€์†์ ์ธ ๊ณ ๊ฐ€์šฉ์„ฑ ์›น ์•ฑ์ด๋‚˜ ๋ณต์žกํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์—๋Š” AKS(Kubernetes)๊ฐ€ ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"ACI",
"container",
"serverless",
"container group",
"CPU/memory",
"VNet"
],
"source_id": "azure-container-instances",
"details": [
"Container Group: ๋™์ผ ํ˜ธ์ŠคํŠธ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ชจ์Œ. Kubernetes Pod ๊ฐœ๋…๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.",
"VNet ๋ฐฐํฌ: ACI๋ฅผ VNet์— ๋ฐฐํฌํ•˜๋ฉด ์‚ฌ์„ค IP๋ฅผ ๋ถ€์—ฌ๋ฐ›์•„ ๋‹ค๋ฅธ Azure ๋ฆฌ์†Œ์Šค์™€ ์‚ฌ์„ค๋ง์—์„œ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: ACI vs AKS ์„ ํƒ ๊ธฐ์ค€, ์ปจํ…Œ์ด๋„ˆ ๊ทธ๋ฃน ๋‚ด ์‚ฌ์ด๋“œ์นด ํŒจํ„ด, ์žฌ์‹œ์ž‘ ์ •์ฑ…(Always/OnFailure/Never) ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "๊ณ ๊ธ‰"
},
{
"id": "azure-keyvault-secret",
"certification": "AZ-104",
"title": "Key Vault Secret โ€” ๋น„๋ฐ€ ๊ด€๋ฆฌ",
"summary": "Key Vault์—์„œ API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด์„ ๋ฒ„์ „ ๊ด€๋ฆฌ์™€ ํ•จ๊ป˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์—์„œ Managed Identity๋กœ ์ฝ”๋“œ์— ์ž๊ฒฉ ์ฆ๋ช… ์—†์ด ๋น„๋ฐ€์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.",
"example": "az keyvault secret set --vault-name myKV --name 'APIKey' --value 'secret123'\naz keyvault secret show --vault-name myKV --name 'APIKey' --query 'value'\n# ์•ฑ์—์„œ: ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋˜๋Š” Key Vault ์ฐธ์กฐ๋กœ ์ฃผ์ž…",
"common_mistake": "๋น„๋ฐ€์„ ์‚ญ์ œํ•˜๋ฉด ๋ชจ๋“  ๋ฒ„์ „์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. Soft Delete๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ๋ณต์› ๊ธฐ๊ฐ„(90์ผ ๊ธฐ๋ณธ) ๋‚ด์— ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"secret",
"version",
"managed identity",
"Key Vault reference",
"rotation",
"soft delete"
],
"source_id": "azure-key-vault-overview",
"details": [
"๋น„๋ฐ€ ๋ฒ„์ „: ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ ๋ฒ„์ „์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์•ฑ์€ ๋ฒ„์ „ ์—†์ด ์ฐธ์กฐํ•˜๋ฉด ํ˜„์žฌ ํ™œ์„ฑ ๋ฒ„์ „์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.",
"Key Vault ์ฐธ์กฐ: App Service ์•ฑ ์„ค์ •์—์„œ `@Microsoft.KeyVault(SecretUri=...)` ํ˜•์‹์œผ๋กœ ๋น„๋ฐ€์„ ์ง์ ‘ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: App Service์—์„œ Key Vault ์ฐธ์กฐ๋กœ ๋น„๋ฐ€ ์ฃผ์ž…, ๋น„๋ฐ€ ์ˆœํ™˜(rotation) ์„ค์ •, Managed Identity์™€ Key Vault ์—ฐ๋™ ์ ˆ์ฐจ๊ฐ€ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "๊ณ ๊ธ‰",
"related_practices": [
"azure-lab-9"
]
},
{
"id": "azure-managed-identity",
"certification": "AZ-104",
"title": "Managed Identity โ€” ๊ด€๋ฆฌํ˜• ID",
"summary": "Azure ๋ฆฌ์†Œ์Šค(VM, App Service ๋“ฑ)์— Entra ID ID๋ฅผ ๋ถ€์—ฌํ•ด ์ž๊ฒฉ ์ฆ๋ช… ์—†์ด ๋‹ค๋ฅธ Azure ์„œ๋น„์Šค์— ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์— ๋น„๋ฐ€์„ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.",
"example": "# VM์— System-Assigned MI ํ™œ์„ฑํ™”\naz vm identity assign --name myVM --resource-group myRG\n# MI์— ์—ญํ•  ํ• ๋‹น\naz role assignment create \\\n --assignee $(az vm show --name myVM --query identity.principalId -o tsv) \\\n --role 'Key Vault Secrets User' \\\n --scope /subscriptions/.../vaults/myKV",
"common_mistake": "System-Assigned MI๋Š” ๋ฆฌ์†Œ์Šค ์‚ญ์ œ ์‹œ ํ•จ๊ป˜ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค์—์„œ ๊ณต์œ ํ•˜๋Š” ID๊ฐ€ ํ•„์š”ํ•˜๋ฉด User-Assigned MI๋ฅผ ์”๋‹ˆ๋‹ค.",
"keywords": [
"managed identity",
"system-assigned",
"user-assigned",
"principal ID",
"service principal"
],
"source_id": "azure-rbac-overview",
"details": [
"์œ ํ˜•: System-Assigned(๋ฆฌ์†Œ์Šค์— ์ข…์†, 1:1), User-Assigned(๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑ, ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค์— ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ).",
"๋™์ž‘ ์›๋ฆฌ: ๋ฆฌ์†Œ์Šค๊ฐ€ Entra ID์—์„œ ํ† ํฐ์„ ์ž๋™ ํš๋“ โ†’ ํ•ด๋‹น ํ† ํฐ์œผ๋กœ Key Vault, Storage ๋“ฑ์— ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: System vs User-Assigned ์„ ํƒ ์‹œ๋‚˜๋ฆฌ์˜ค, MI์— RBAC ์—ญํ•  ๋ถ€์—ฌ ์ ˆ์ฐจ, App Service์—์„œ MI๋ฅผ ํ†ตํ•œ Key Vault ์ ‘๊ทผ์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "๊ณ ๊ธ‰"
},
{
"id": "azure-network-watcher",
"certification": "AZ-104",
"title": "Network Watcher โ€” ๋„คํŠธ์›Œํฌ ์ง„๋‹จ",
"summary": "Azure ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ๋„๊ตฌ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. IP ํ๋ฆ„ ํ™•์ธ, ์—ฐ๊ฒฐ ๋ฌธ์ œ ํ•ด๊ฒฐ, NSG ์ง„๋‹จ, ํŒจํ‚ท ์บก์ฒ˜ ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.",
"example": "# NSG๊ฐ€ ํŒจํ‚ท์„ ํ—ˆ์šฉํ•˜๋Š”์ง€ ํ™•์ธ\naz network watcher test-ip-flow \\\n --vm myVM \\\n --direction Inbound \\\n --protocol TCP \\\n --local 10.0.0.4:80 \\\n --remote 0.0.0.0:*",
"common_mistake": "Network Watcher๋Š” region๋ณ„๋กœ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. VNet์„ ์ƒ์„ฑํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ์ž๋™ ํ™œ์„ฑํ™”๋˜์ง€๋งŒ, ๋น„ํ™œ์„ฑํ™”๋œ region์—์„œ๋Š” ์ง„๋‹จ ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
"keywords": [
"Network Watcher",
"IP flow verify",
"connection troubleshoot",
"NSG flow log",
"packet capture"
],
"source_id": "azure-vnet-overview",
"details": [
"IP ํ๋ฆ„ ํ™•์ธ: ํŠน์ • VM์—์„œ ์ถœ๋ฐœ์ง€/๋ชฉ์ ์ง€ IPยทํฌํŠธ๋กœ NSG๊ฐ€ ํ—ˆ์šฉ/๊ฑฐ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ทœ์น™์„ ์ฐพ์•„์ค๋‹ˆ๋‹ค.",
"NSG Flow Log: ์„œ๋ธŒ๋„ทยทNIC๋ฅผ ํ†ต๊ณผํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์˜ ํ—ˆ์šฉ/๊ฑฐ๋ถ€ ํ๋ฆ„์„ Storage Account์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. Traffic Analytics์™€ ์—ฐ๋™ํ•ด ์‹œ๊ฐํ™”.",
"์‹œํ—˜ ํŒจํ„ด: IP ํ๋ฆ„ ํ™•์ธ์œผ๋กœ NSG ๊ทœ์น™ ์ง„๋‹จ, Connection Troubleshoot์œผ๋กœ VM ๊ฐ„ ์—ฐ๊ฒฐ ๊ฒ€์ฆ, NSG Flow Log ์„ค์ •์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "์ค‘๊ธ‰"
},
{
"id": "azure-move-resource",
"certification": "AZ-104",
"title": "๋ฆฌ์†Œ์Šค ์ด๋™ โ€” Resource Move",
"summary": "๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค๋ฅธ Resource Group์ด๋‚˜ ๋‹ค๋ฅธ Subscription์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋™ ์ค‘ ๋ฆฌ์†Œ์Šค๋Š” ์ž ๊ธฐ๋ฉฐ, ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ์ด๋™์„ ์ง€์›ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.",
"example": "az resource move \\\n --destination-group targetRG \\\n --ids /subscriptions/SUB/resourceGroups/sourceRG/providers/Microsoft.Compute/virtualMachines/myVM",
"common_mistake": "์ด๋™ ํ›„ ๋ฆฌ์†Œ์Šค ID(ARM ID)๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ด ID๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉํ•œ ์Šคํฌ๋ฆฝํŠธยท๋ชจ๋‹ˆํ„ฐ๋งยทRole Assignment๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"resource move",
"RG move",
"subscription move",
"ARM ID change",
"limitations"
],
"source_id": "azure-vm-overview",
"details": [
"์ด๋™ ์ „ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ: `az resource invoke-action --action validate-move`๋กœ ์ด๋™ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋ฏธ๋ฆฌ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.",
"์ด๋™์ด ๋ถˆ๊ฐ€ํ•œ ๊ฒฝ์šฐ: ํŠน์ • ๋ฆฌ์†Œ์Šค ์œ ํ˜•, ๊ตฌ๋… ๊ฐ„ ์ด๋™ ์‹œ ์„œ๋น„์Šค๋ณ„ ์ œํ•œ, Key Vault(๊ตฌ๋… ์ด๋™ ์‹œ ์ผ๋ถ€ ์ œํ•œ) ๋“ฑ.",
"์‹œํ—˜ ํŒจํ„ด: ์ด๋™ ํ›„ ๋ฆฌ์†Œ์Šค ID ๋ณ€๊ฒฝ ์˜ํ–ฅ, ์ด๋™ ๋ถˆ๊ฐ€ ๋ฆฌ์†Œ์Šค ์˜ˆ์‹œ, ๊ตฌ๋… ๊ฐ„ ์ด๋™ ์‹œ ์ถ”๊ฐ€ ์กฐ๊ฑด(Entra ID ํ…Œ๋„ŒํŠธ ์ผ์น˜ ๋“ฑ)์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "๊ณ ๊ธ‰"
},
{
"id": "azure-template-deployment",
"certification": "AZ-104",
"title": "ARM/Bicep โ€” ์ธํ”„๋ผ ์ฝ”๋“œ ๋ฐฐํฌ",
"summary": "ARM Template(JSON) ๋˜๋Š” Bicep(DSL)์œผ๋กœ Azure ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ์ •์˜ํ•˜๊ณ  ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. IaC(Infrastructure as Code)์˜ ํ‘œ์ค€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.",
"example": "# Bicep ๋ฐฐํฌ\naz deployment group create \\\n --resource-group myRG \\\n --template-file main.bicep \\\n --parameters environment=prod\n# ๊ตฌ๋… ๋ ˆ๋ฒจ ๋ฐฐํฌ\naz deployment sub create --template-file rg.bicep --location koreacentral",
"common_mistake": "ARM ๋ฐฐํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Incremental ๋ชจ๋“œ(๊ธฐ์กด ๋ฆฌ์†Œ์Šค ์œ ์ง€, ์ƒˆ ๋ฆฌ์†Œ์Šค ์ถ”๊ฐ€)์ž…๋‹ˆ๋‹ค. Complete ๋ชจ๋“œ๋Š” ํ…œํ”Œ๋ฆฟ์— ์—†๋Š” RG ๋‚ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.",
"keywords": [
"ARM template",
"Bicep",
"IaC",
"incremental",
"complete",
"deployment scope"
],
"source_id": "azure-vm-overview",
"details": [
"๋ฐฐํฌ ๋ฒ”์œ„: Resource Group(๋Œ€๋ถ€๋ถ„), Subscription(RG ์ƒ์„ฑ ํฌํ•จ), Management Group(Policy/RBAC), Tenant ๋ ˆ๋ฒจ ์ค‘ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.",
"Bicep์€ ARM JSON๋ณด๋‹ค ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์œผ๋กœ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค. `bicep build`๋กœ ARM JSON์œผ๋กœ ์ปดํŒŒ์ผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.",
"์‹œํ—˜ ํŒจํ„ด: Incremental vs Complete ๋ชจ๋“œ ์ฐจ์ด, ๋ฐฐํฌ ๋ฒ”์œ„๋ณ„ ๋ช…๋ น(`deployment group/sub/mg create`), What-If ๊ฒ€์ฆ ์‚ฌ์šฉ๋ฒ•์ด ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค."
],
"level": "๊ณ ๊ธ‰"
}
]