πνμ΅λͺ©ν
π ν΄λΌμ°λ μ루μ μμ μ€ν¬λ¦½ν μ΄ μ€μν μ΄μ μ΄ν΄νκΈ°
π AZ cli μ€ν¬λ¦½νΈ μ€ννκΈ°
π AZ CLIλ₯Ό μ¬μ©νμ¬ μΉμ± λ°°ν¬νκΈ°.
"Infrastructure as Code" (IaC)λ κΈ°λ³Έμ μΌλ‘ IT μ₯λΉλ μμ€ν μ€μ κ°μ μΈνλΌλ₯Ό μλμΌλ‘ μ€μ νλ λμ μ½λλ‘ λ§λ€μ΄μ μλμΌλ‘ μ€μ νλ λ°©λ²μ λ§ν©λλ€.
μλ₯Ό λ€μ΄, μλ²λ₯Ό μ ν νλ €λ©΄ μ΄μ체μ λ₯Ό μ€μΉνκ³ , νμν νλ‘κ·Έλ¨μ μ€μΉνκ³ , λ€νΈμν¬ μ€μ μ ν΄μΌ ν©λλ€.
μ΄ λͺ¨λ μμ μ μλμΌλ‘ νλ©΄ μκ°λ λ§μ΄ λ€κ³ , μ€λ₯λ λ°μν μ μμ΅λλ€.
νμ§λ§ IaCλ₯Ό μ¬μ©νλ©΄ μ΄ λͺ¨λ μ€μ μ μ½λλ‘ μμ±νκ³ , κ·Έ μ½λλ₯Ό μ€ννλ©΄ μλμΌλ‘ μλ²κ° μνλ μ€μ λλ‘ μ€λΉλ©λλ€.
β ν΄λΌμ°λ μ루μ μμ μ€ν¬λ¦½ν
νΉμ λͺ λ Ήμ΄λ μ½λ μ‘°κ°μ μ¬μ©νμ¬ ν΄λΌμ°λ 리μμ€μ μλΉμ€λ₯Ό μλννκ³ κ΄λ¦¬νλ κ²μ λ§ν©λλ€.
μλ₯Ό λ€μ΄ν΄λΌμ°λμ μ»΄ν¨ν°(μλ²)λ₯Ό μΈν νλ €κ³ ν©λλ€.
μ΄ μλ²λ₯Ό μΈν
νκΈ° μν΄μλ μ¬λ¬ λ¨κ³μ μ€μ κ³Ό μμ
μ΄ νμν©λλ€.
μλ₯Ό λ€λ©΄, μ΄μ 체μ μ€μΉ, νμν νλ‘κ·Έλ¨ μ€μΉ, λ€νΈμν¬ μ€μ , 보μ μ€μ λ±μ΄ μμ£ .
μ΄ λͺ¨λ μμ μ μ§μ μλμΌλ‘ ν΄λ¦κ³Ό μ λ ₯μ ν΅ν΄ νκ² λλ©΄ μκ°λ λ§μ΄ λ€κ³ , μ€μν νλ₯ λ λμμ§λλ€.
μ΄μ , μ΄ λͺ¨λ μμ μ ν λ²μ μλμΌλ‘ μνν μ μκ² νλ 'λ μνΌ'λ 'λͺ λ Ήμ'κ° μλ€κ³ μμν΄λ³΄μΈμ. μ΄ 'λ μνΌ'λ₯Ό μ€νλ§ νλ©΄, λͺ¨λ μ€μ κ³Ό μ€μΉκ° μλμΌλ‘ μλ£λλ€λ©΄ νΈλ¦¬νμ§ μμκΉμ?
ν΄λΌμ°λ μ€ν¬λ¦½ν μ λ°λ‘ μ΄λ° 'λ μνΌ'λ 'λͺ λ Ήμ'μ κ°μ΅λλ€.
νΉμ μμ μ΄λ μΌλ ¨μ κ³Όμ μ μλννκΈ° μν μ½λλ λͺ λ Ήμ΄ μ‘°κ°μ λ§νλ κ²μ΄μ£ .
κ²°κ³Όμ μΌλ‘, ν΄λΌμ°λ μ루μ μμμ μ€ν¬λ¦½ν μ ν¨μ¨μ μΈ λ¦¬μμ€ κ΄λ¦¬, μκ° μ μ½, κ·Έλ¦¬κ³ μΌκ΄λ μμ μνμ μν΄ κΌ νμν λꡬμ λλ€.
ν΄λΌμ°λ μ루μ μμ μ€ν¬λ¦½ν μ μ μ€μνκ°μβ
μλν(Automation): ν΄λΌμ°λμμλ μλ°± λλ μμ²μ 리μμ€λ₯Ό κ΄λ¦¬ν΄μΌ ν μ μμ΅λλ€. μ΄λ₯Ό μλμΌλ‘ νλ €λ©΄ μκ°μ΄ λ§μ΄ 걸리며 μ€μμ μ¬μ§κ° λ§μ΅λλ€. μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ©΄ λ°λ³΅μ μΈ μμ μ μλνν μ μμ΄ ν¨μ¨μ±μ΄ ν¬κ² ν₯μλ©λλ€.
μΌκ΄μ±(Consistency): μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ©΄ λμΌν μμμ λ°©μμΌλ‘ 리μμ€λ₯Ό μμ±, μμ , μμ ν μ μμ΅λλ€. μ΄λ μΌκ΄λ νκ²½ ꡬμΆμ λμμ£Όλ©°, μ€μλ₯Ό μ€μ¬μ€λλ€.
νμ₯μ±(Scalability): μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ©΄ νμμ λ°λΌ 리μμ€λ₯Ό λΉ λ₯΄κ² νμ₯νκ±°λ μΆμν μ μμ΅λλ€. μλ₯Ό λ€μ΄, νΉμ μκ°λμ νΈλν½μ΄ μ¦κ°νλ©΄ μλμΌλ‘ μΆκ° μλ²λ₯Ό λ°°ν¬νλ λ±μ μμ μ μ€ν¬λ¦½νΈλ‘ μ½κ² ꡬνν μ μμ΅λλ€.
λ¬Έμν(Documentation): μ€ν¬λ¦½νΈλ μ체μ μΌλ‘ μ΄λ€ μμ μ μννλμ§μ λν λ¬Έμμ μν μ ν μ μμ΅λλ€. μ¦, νμμ΄λ νμμκ° ν΄λΉ μ€ν¬λ¦½νΈλ₯Ό 보면 ν΄λΌμ°λ νκ²½μ μ΄λ€ μμ μ΄ μνλμλμ§ μ½κ² μ΄ν΄ν μ μμ΅λλ€.
μ°μ visual studio code μ΅μ€ν
μ
μ€μμ Azure CLI Toolsλ₯Ό μ€μΉν©λλ€.
VSCode ν°λ―Έλμμ μλ λͺ λ Ήμ΄λ₯Ό ν΅ν΄μ μ λλ‘ μ€μΉκ° λμλμ§, μ΄λ€ λ²μ μΌλ‘ μ€μΉκ° λμλμ§ νμΈν©λλ€.
az --version
κ·Έλ¦¬κ³ λ‘κ·ΈμΈμ μ§νν©λλ€.
az login
μλλ μμ£Ό μ¬μ©νλ©΄ λͺ λ Ήμ΄μ λν νμ λλ€.

λͺ
λ Ήμ΄λ₯Ό μ°ΎμΌλ €λ©΄ az find λͺ
λ Ήμ΄λ₯Ό μ΄μ©ν©λλ€.
az find secret // μμμ
λλ€.
λλ --helpλ₯Ό μ΄μ©ν μ μμ΅λλ€.
az network nsg --help
λͺ¨λ λͺ λ Ήμ΄μ μ¬μ©λλ argumentsλ€μ μλμ κ°μ΅λλ€.
--helpλ λͺ
λ Ήμ΄μ κ·Έλ€μ μΈμμ λν CLI μ°Έμ‘° μ 보λ₯Ό μΆλ ₯νκ³ μ¬μ© κ°λ₯ν νμ κ·Έλ£Ήκ³Ό λͺ
λ Ήμ΄λ₯Ό λμ΄ν©λλ€.
--outputμ μΆλ ₯ νμμ λ³κ²½ν©λλ€.
μ¬μ© κ°λ₯ν μΆλ ₯ νμμ json, jsonc (컬λ¬νλ JSON), tsv (νμΌλ‘ ꡬλΆλ κ°), table (μ¬λμ΄ μ½μ μ μλ ASCII ν
μ΄λΈ), κ·Έλ¦¬κ³ yamlμ
λλ€.
κΈ°λ³Έμ μΌλ‘ CLIλ jsonμ μΆλ ₯ν©λλ€. μ¬μ© κ°λ₯ν μΆλ ₯ νμμ λν΄ λ μμλ³΄λ €λ©΄, Azure CLIμ μΆλ ₯ νμμ μ°Έμ‘°νμΈμ.
--queryλ JMESPath 쿼리 μΈμ΄λ₯Ό μ¬μ©νμ¬ Azure μλΉμ€μμ λ°νλ μΆλ ₯μ νν°λ§ν©λλ€.
--verboseλ μμ
μ€μ Azureμμ μμ±λ 리μμ€μ λν μ 보μ κΈ°ν μ μ©ν μ 보λ₯Ό μΆλ ₯ν©λλ€. (verboseλ "μμΈνλ€" λΌλ λ»μ
λλ€)
--debugλ CLI μμ
μ λν λ λ§μ μ 보λ₯Ό μΆλ ₯νλ©° λλ²κΉ
λͺ©μ μΌλ‘ μ¬μ©λ©λλ€.
λ²κ·Έλ₯Ό λ°κ²¬νλ©΄ λ²κ·Έ 리ν¬νΈ μ μΆ μ --debug νλκ·Έλ₯Ό μ¬μ©νμ¬ μμ±λ μΆλ ₯μ μ 곡νμΈμ.
Interactive Mode μ¬μ©ν΄λ³΄κΈ°
μ¬μ©μμ λν νμμΌλ‘ μνΈ μμ©νλ λͺ λ Ή μ€ μΈν°νμ΄μ€ λͺ¨λλ μλ λͺ λ Ήμ΄λ₯Ό ν΅ν΄ μ€ν ν μ μμ΅λλ€.
az interactive
λ¨Όμ subscription idλ₯Ό μ νν©λλ€.
az account set --subscription <subscription id>
My SQLμλ²λ₯Ό μν Azure λ°μ΄ν°λ² μ΄μ€λ₯Ό λ§λ€μ΄λ΄ μλ€.
az group create --name myresourcegroup --location westus
az group create: Azure CLIμμ 리μμ€ κ·Έλ£Ήμ μμ±νκΈ° μν λͺ
λ Ήμ΄μ
λλ€.
βοΈμ°Έκ³ λ‘ λ¦¬μμ€ κ·Έλ£Ήμ΄λ ν΄λΌμ°λ νκ²½μμ μμ±νλ λ€μν 리μμ€λ€ (κ°μ λ¨Έμ , λ°μ΄ν°λ² μ΄μ€, λ€νΈμν¬, μ€ν λ¦¬μ§ λ±)μ κ·Έλ£Ήννμ¬ κ΄λ¦¬ν μ μκ² ν΄μ€λλ€.
--name myresourcegroup: μμ±ν 리μμ€ κ·Έλ£Ήμ μ΄λ¦μ μ§μ νλ μ΅μ
μ
λλ€. μμ μμλ myresourcegroupμ΄λΌλ μ΄λ¦μ μ¬μ©νμμ΅λλ€.
--location westus: 리μμ€ κ·Έλ£Ήμ΄ μμ±λ Azure 리μ (λ°μ΄ν° μΌν° μμΉ)λ₯Ό μ§μ νλ μ΅μ
μ
λλ€. "westus"λ λ―Έκ΅ μλΆμ μμΉν Azure 리μ μ μλ―Έν©λλ€.
λ§μ½μ 리μμ€ κ·Έλ£Ήμ΄ μλ€λ©΄ μ΄λ€ μΌμ΄ λ°μν κΉμβ
κ΄λ¦¬μ μ΄λ €μ: λͺ¨λ 리μμ€κ° κ°λ³μ μΌλ‘ μ‘΄μ¬νλ©΄ κ·Έλ€ κ°μ κ΄κ³λ μμ‘΄μ±μ νμ νκΈ° μ΄λ ΅μ΅λλ€. 리μμ€ κ·Έλ£Ήμ μ¬μ©νλ©΄ κ΄λ ¨ 리μμ€λ₯Ό ν¨κ» λ¬Άμ΄ νλ²μ κ΄λ¦¬ν μ μμ΅λλ€.
μμ μ± κ°μ: νΉμ νλ‘μ νΈλ μ ν리μΌμ΄μ μ μ€λ¨νκ±°λ μμ ν΄μΌ ν λ κ΄λ ¨λ λͺ¨λ 리μμ€λ₯Ό νλ²μ μμ νκΈ°κ° μ΄λ €μΈ μ μμ΅λλ€. μ΄λ‘ μΈν΄ λΆνμν 리μμ€κ° κ³μ μ€νλλ©΄μ λΉμ©μ΄ λ°μν μ μμ΅λλ€.
ν΅ν© μ μ± μ μ©μ μ΄λ €μ: νΉμ 리μμ€ κ·Έλ£Ή μ 체μ 보μ μ μ± , μ‘μΈμ€ μ μ΄, νκ·Έ λ±μ μΌκ΄λκ² μ μ©νλ κ²μ΄ μ΄λ €μμ§λλ€.
λΉμ© μΆμ μ 볡μ‘μ±: 리μμ€ κ·Έλ£Ήλ³λ‘ λΉμ©μ μΆμ νλ©΄ νΉμ νλ‘μ νΈλ μ ν리μΌμ΄μ μ λΉμ©μ μ½κ² νμ ν μ μμ΅λλ€. κ·Έλ£Ήμ΄ μμΌλ©΄ μ΄λ¬ν λΆμμ΄ μ΄λ ΅μ΅λλ€.
Azure Database for MySQL serverλ₯Ό λ§λλλ€.
az mysql server create --resource-group myresourcegroup --name mydemoserver --location westus --admin-user myadmin --admin-password <server_admin_password> --sku-name GP_Gen5_2
λΉλ°λ²νΈλ λ°λ‘ μ€μ ν΄μ£Όκ³ , μ κ°μ κ²½μ°λ μ΄λ¦μ΄ κ²ΉμΉλ€λ μλ¬λ μμ΄μ nameλ λ°κΏ¨μ΅λλ€.
κ° μ½λμ λν μ€λͺ μ μλμ κ°μ΅λλ€.
az mysql server create: Azure CLIμμ MySQL μλ²λ₯Ό μμ±νκΈ° μν λͺ
λ Ήμ
λλ€.
--resource-group myresourcegroup: μ΄ MySQL μλ²κ° μμ±λ 리μμ€ κ·Έλ£Ήμ μ§μ ν©λλ€. μ¬κΈ°μλ "myresourcegroup"μ΄λΌλ μ΄λ¦μ 리μμ€ κ·Έλ£Ήμ μ¬μ©νλλ‘ μ€μ λμ΄ μμ΅λλ€.
--name mydemoserver: μμ±λ MySQL μλ²μ μ΄λ¦μ μ§μ ν©λλ€. μ΄ μμμλ "mydemoserver"λΌλ μ΄λ¦μ΄ μ¬μ©λ©λλ€.
--location westus: μλ²λ₯Ό νΈμ€ν
ν Azure μ§μμ μ§μ ν©λλ€. μ΄ κ²½μ°μλ "westus"(λ―Έκ΅ μλΆ) μ§μμ μλ²κ° μμ±λ©λλ€.
--admin-user myadmin: MySQL μλ²μ κ΄λ¦¬μ κ³μ μ΄λ¦μ μ§μ ν©λλ€. μ¬κΈ°μλ "myadmin"μ΄λΌλ μ΄λ¦μ΄ μ¬μ©λ©λλ€.
--admin-password <server_admin_password>: κ΄λ¦¬μ κ³μ μ λΉλ°λ²νΈλ₯Ό μ€μ ν©λλ€. <server_admin_password>λ μ€μ λ‘ μ¬μ©νλ €λ λΉλ°λ²νΈλ‘ λ°κΏμΌ ν©λλ€.
--sku-name GP_Gen5_2: μλ²μ SKU(μ ν λͺ
μΈ λ° κ°κ²©)λ₯Ό μ§μ ν©λλ€. "GP_Gen5_2"λ General Purpose, Generation 5μ 2 vCoreλ₯Ό μλ―Έν©λλ€. μ΄λ ν΄λΉ μλ²μ μ±λ₯κ³Ό μ©λμ κ²°μ νλ μμ μ€ νλμ
λλ€.
az mysql server firewall-rule create λͺ
λ Ήμ΄λ₯Ό μ¬μ©νμ¬ μλ²μμ λ°©νλ²½ κ·μΉμ ꡬμ±ν μ μμ΅λλ€.
μ΄λ κ² νλ©΄ λ‘컬μμ μλ²μ μ°κ²°ν μ μκ² λ©λλ€.
az mysql server firewall-rule create --resource-group myresourcegroup --server mydemoserver --name AllowMyIP --start-ip-address 192.168.0.1 --end-ip-address 192.168.0.1
μ΄ λͺ λ Ήμ΄λ₯Ό μ€ννλ©΄, mydemoserverλΌλ MySQL μλ²λ μ€μ§ 192.168.0.1 IP μ£Όμμμμ μ μλ§ νμ©νκ² λ©λλ€.
μ΄μΈμ λ€λ₯Έ IP μ£Όμμμμ μ μ μλλ λ°©νλ²½μ μν΄ μ°¨λ¨λ©λλ€.
az mysql server firewall-rule create: Azure CLIμμ Azure Database for MySQL μλ²μ λ°©νλ²½ κ·μΉμ μμ±νκΈ° μν λͺ
λ Ήμ΄μ
λλ€.
--resource-group myresourcegroup: 리μμ€ κ·Έλ£Ήμ μ§μ ν©λλ€. myresourcegroupμ ν΄λΉ MySQL μλ²κ° ν¬ν¨λ 리μμ€ κ·Έλ£Ήμ μ΄λ¦μ
λλ€.
--server mydemoserver: λ°©νλ²½ κ·μΉμ μΆκ°ν MySQL μλ²μ μ΄λ¦μ μ§μ ν©λλ€. μ¬κΈ°μλ mydemoserverλΌλ μ΄λ¦μ μλ²μ κ·μΉμ μΆκ°ν©λλ€.
--name AllowMyIP: μμ±λ λ°©νλ²½ κ·μΉμ μ΄λ¦μ μ§μ ν©λλ€. μ΄ μμμλ AllowMyIPλΌλ μ΄λ¦μΌλ‘ κ·μΉμ΄ μμ±λ©λλ€.
--start-ip-address 192.168.0.1 λ° --end-ip-address 192.168.0.1: μ΄ IP λ²μλ λ°©νλ²½ κ·μΉμΌλ‘ νμ©λ IP μ£Όμμ λ²μλ₯Ό μ§μ ν©λλ€. μ¬κΈ°μλ μμ IPμ λ IPκ° λμΌνλ―λ‘, λ¨μΌ IP μ£ΌμμΈ 192.168.0.1λ§ νμ©νκ² λ©λλ€.
μλ²μ μ°κ²°μ νλ €λ©΄ host information κ·Έλ¦¬κ³ access credentialsμ μ»μ΄μΌ ν©λλ€.
μ΄κ²μ μλμ λͺ λ Ήμ΄λ₯Ό ν΅ν΄μ νμΈν μ μμ΅λλ€.
az mysql server show --resource-group myresourcegroup --name mydemoserver
μ΄ λͺ λ Ήμ΄λ₯Ό μ€ννλ©΄ JSON νμΌλ‘ κ²°κ³Όλ₯Ό λ°μ μ μμ΅λλ€.
fullyQualifiedDomainName κ·Έλ¦¬κ³ administratorLoginμ λ©λͺ¨λ₯Ό ν©μλ€.
μκΉ λ©λͺ¨ν΄ λμ λ΄μ©μ λ°νμΌλ‘ μ½λλ₯Ό μμ±ν©λλ€.
mysql -h mydemoserver.mysql.database.azure.com -u myadmin@mydemoserver -p
-h: μ΄ μ΅μ
μ μ μνλ €λ MySQL μλ²μ νΈμ€νΈ μ΄λ¦ λλ IP μ£Όμλ₯Ό μ§μ ν©λλ€.
-u: μ΄ μ΅μ
μ MySQL μλ²μ λ‘κ·ΈμΈν λ μ¬μ©ν μ¬μ©μ μ΄λ¦μ μ§μ ν©λλ€.
-p: μ΄ μ΅μ
μ μ
λ ₯ν μ¬μ©μ μ΄λ¦μ λΉλ°λ²νΈλ₯Ό μ
λ ₯νλΌλ ν둬ννΈλ₯Ό μ 곡ν©λλ€.
λ§μ½ μ°κ²°μ μ±κ³΅νλ€λ©΄ λ€μκ³Ό κ°μ λ΄μ©μ΄ λνλ©λλ€.
Welcome to the MySQL monitor. Commands end with ; or \g.
μ°Έκ³ λ‘ λκ°λ λ°©λ²μ quitμ μ
λ ₯νλ©΄ λ©λλ€.
az group delete --name myresourcegroup
az mysql server delete --resource-group myresourcegroup --name mydemoserver
μλ μ½λλ‘ ν΄λ‘ ν©λλ€.
git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart
μν ν΄λλ‘ μ΄λν©λλ€.
cd msdocs-python-flask-webapp-quickstart
μ±μ μν κ°μνκ²½μ λ§λλλ€.
python3 -m venv .venv
source .venv/bin/activate
dependenciesλ₯Ό μ€μΉν©λλ€.
pip install -r requirements.txt
μ±μ νλ¨μ μ½λλ‘ μ€νν©λλ€.
flask run
μ°μ λ‘κ·ΈμΈλΆν° ν΄μ€μλ€.
az login
μ§μ ν΄λμ μλ μ½λλ₯Ό κΈ°λ°μΌλ‘ Azure App Serviceμ μΉ μ±μ μμ±ν©λλ€.
az webapp up --runtime PYTHON:3.9 --sku B1 --logs
az webapp up: μ΄ λͺ
λ Ήμ΄λ νμ¬ λλ ν 리μ μ½λλ₯Ό μ¬μ©νμ¬ Azureμμ μΉ μ±μ μμ±νκ±°λ μ
λ°μ΄νΈν©λλ€.
--runtime PYTHON:3.9: μ΄ μ΅μ
μ μΉ μ±μ λ°νμ μ€νμ μ€μ ν©λλ€. μ¬κΈ°μλ Python 3.9 λ²μ μ μ¬μ©νμ¬ μΉ μ±μ μ€ννλλ‘ μ§μ νκ³ μμ΅λλ€.
--sku B1: μ΄ μ΅μ
μ μΉ μ±μ μλΉμ€ κ³ν(Service Plan)μ SKU(Stock Keeping Unit)λ₯Ό μ§μ ν©λλ€. B1μ Basic κ³μΈ΅μ ν΄λΉνλ SKUμ
λλ€. Basic κ³μΈ΅μ κ°λ° λ° ν
μ€νΈμ μ ν©νλ©°, λ¬΄λ£ κ³μΈ΅λ³΄λ€λ λ λ§μ κΈ°λ₯μ μ 곡ν©λλ€.
--logs: μ΄ μ΅μ
μ μ ν리μΌμ΄μ
λ° μΉ μλ² λ‘κ·Έλ₯Ό νμ±νν©λλ€. μ΄λ₯Ό ν΅ν΄ μΉ μ±μ λμκ³Ό κ΄λ ¨λ λ‘κ·Έ μ 보λ₯Ό μμ§νκ³ λΆμν μ μμ΅λλ€.
μλμ κ°μ΄ λ¬Έκ΅¬κ° λ¨λ©΄ μ±κ³΅μ λλ€.
Deployment endpoint responded with status code 202
You can launch the app at http://thankful-dune-587e746a16104f88b672ddc0031f96fb.azurewebsites.net
Configuring default logging for the app, if not already enabled
2023-09-14T14:44:31 Welcome, you are now connected to log-streaming service.
az group delete \
--name msdocs-python-webapp-quickstart \
--no-wait
π μ°Έκ³ μλ£
VSCodeμμ Azure CLI Tools μ€μΉ