ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋œ Functional Powershell์€ ๋ชจ์ˆœ์–ด๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ—ค์ด ํ•˜๋ธŒ๋ฅด! ๋‚˜๋Š” ๊ธฐ์‚ฌ์˜ ๋ฒˆ์—ญ์„ ๋‹น์‹ ์˜ ๊ด€์‹ฌ์— ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค "ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋œ ๊ธฐ๋Šฅ์  PowerShell.
๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ชจ์ˆœ์ด ์•„๋‹ˆ๋ผ๊ณ  ์•ฝ์†ํ•œ๋‹ค"
ํฌ๋ฆฌ์Šคํ† ํผ ์ฟ ์น˜ ์ง€์Œ.

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„๊ณผ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์€ ์„œ๋กœ ์ƒ์ถฉ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‘˜ ๋‹ค Powershell์—์„œ ๋™์ผํ•˜๊ฒŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ ์ด๋“  ์•„๋‹ˆ๋“  ๊ฑฐ์˜ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—๋Š” ํ™•์žฅ๋œ ์ด๋ฆ„-๊ฐ’ ๋ฐ”์ธ๋”ฉ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด ๋ฐ ๋ ˆ์ฝ”๋“œ์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์‚ฌ์šฉ์„ ์ด๋ฆ„๊ณผ ๊ฐ’ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์ œํ•œํ•˜๊ณ  ์ƒ์†, ๋‹คํ˜•์„ฑ ๋˜๋Š” ๊ฐ€๋ณ€์„ฑ๊ณผ ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์„ ํ”ผํ•œ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ํ•˜์ง€ ์•Š๊ณ ๋„ ํด๋ž˜์Šค์˜ ์ด์ ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ถˆ๋ณ€ ์œ ํ˜• ๋ณ€ํ™˜ ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ ์ฝ”๋“œ๋ฅผ ํ’๋ถ€ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์นด์ŠคํŠธ์˜ ๋งˆ๋ฒ•

์นด์ŠคํŠธ๋Š” Powershell์˜ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ฐ’์„ ์บ์ŠคํŒ…ํ•  ๋•Œ ํ™˜๊ฒฝ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ถ”๊ฐ€ํ•˜๋Š” ์•”์‹œ์  ์ดˆ๊ธฐํ™” ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ์— ์˜์กดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, [xml]์—์„œ ๋ฌธ์ž์—ด์„ ์บ์ŠคํŒ…ํ•˜๋ฉด ํŒŒ์„œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด์ด ์‹คํ–‰๋˜๊ณ  ์™„์ „ํ•œ xml ํŠธ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ชฉ์ ์œผ๋กœ ์ฝ”๋“œ์—์„œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์บ์ŠคํŠธ ํ•ด์‹œํ…Œ์ด๋ธ”

์ƒ์„ฑ์ž๊ฐ€ ์—†์œผ๋ฉด ํ•ด์‹œํ…Œ์ด๋ธ”์„ ํด๋ž˜์Šค ์œ ํ˜•์œผ๋กœ ์บ์ŠคํŒ…ํ•˜์—ฌ ์ƒ์„ฑ์ž ์—†์ด ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋ ค๋ฉด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”. ๋™์‹œ์— ํด๋ž˜์Šค์˜ ํ˜•์‹ํ™”๋œ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ›จ์”ฌ ๋” ์‹ฌ์ธต์ ์ธ ์ดˆ๊ธฐํ™” ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋…ผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index
}

[Cluster]@{
    Service       = "MyService"
    FlightingRing = "PROD"
    Region        = "EastUS"
    Index         = 2
}

๋˜ํ•œ ์บ์ŠคํŒ…์€ ๊น”๋”ํ•œ ์ถœ๋ ฅ์„ ์–ป๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. Format-Table์— ์ „๋‹ฌ๋œ ํด๋Ÿฌ์Šคํ„ฐ ํ•ด์‹œํ…Œ์ด๋ธ” ๋ฐฐ์—ด์˜ ์ถœ๋ ฅ์„ ์ด๋Ÿฌํ•œ ํ•ด์‹œํ…Œ์ด๋ธ”์„ ํด๋ž˜์Šค์— ์ฒ˜์Œ ์บ์ŠคํŒ…ํ•  ๋•Œ ์–ป๋Š” ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•˜์„ธ์š”. ํด๋ž˜์Šค์˜ ์†์„ฑ์€ ํ•ญ์ƒ ์ •์˜๋œ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์— ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ชจ๋“  ์†์„ฑ ์•ž์— ์ˆจ๊ฒจ์ง„ ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋œ Functional Powershell์€ ๋ชจ์ˆœ์–ด๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜๋ฏธ์˜ ์บ์ŠคํŒ…

์ธ์ˆ˜๊ฐ€ ํ•˜๋‚˜์ธ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํด๋ž˜์Šค ์œ ํ˜•์— ๊ฐ’์„ ์บ์ŠคํŒ…ํ•˜๋ฉด ํ•ด๋‹น ๊ฐ’์ด ์ƒ์„ฑ์ž์— ์ „๋‹ฌ๋˜์–ด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index

    Cluster([string] $id) {
        $this.Service, $this.FlightingRing, $this.Region, $this.Index = $id -split "-"
    }
}

[Cluster]"MyService-PROD-EastUS-2"

๋ผ์ธ์— ์บ์ŠคํŠธ

[string] ToString() ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ๋ฌธ์ž์—ด ๋ณด๊ฐ„ ์‚ฌ์šฉ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด์˜ ๋ฌธ์ž์—ด ํ‘œํ˜„ ๋’ค์— ์žˆ๋Š” ๋…ผ๋ฆฌ๋ฅผ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index

    [string] ToString() {
        return $this.Service, $this.FlightingRing, $this.Region, $this.Index -join "-"
    }
}

$cluster = [Cluster]@{
    Service       = "MyService"
    FlightingRing = "PROD"
    Region        = "EastUS"
    Index         = 2
}

Write-Host "We just created a model for '$cluster'"

์ง๋ ฌํ™”๋œ ์ธ์Šคํ„ด์Šค ์ „์†ก

Cast๋Š” ์•ˆ์ „ํ•œ ์—ญ์ง๋ ฌํ™”๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์‚ฌ์–‘์„ ์ถฉ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ž˜ ์˜ˆ๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

# ะ’ะฐะปะธะดะฐั†ะธั ัะตั€ะธะฐะปะธะทะพะฒะฐะฝะฝั‹ั… ะดะฐะฝะฝั‹ั…

[Cluster]$cluster = Get-Content "./my-cluster.json" | ConvertFrom-Json
[Cluster[]]$clusters = Import-Csv "./my-clusters.csv"

๊ธฐ๋Šฅ ์ฝ”๋“œ์˜ ์บ์ŠคํŠธ

๊ธฐ๋Šฅ์  ํ”„๋กœ๊ทธ๋žจ์€ ๋จผ์ € ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•œ ๋‹ค์Œ ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ผ๋ จ์˜ ๋ณ€ํ™˜์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ์ˆœ๋œ ์ธ์ƒ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํด๋ž˜์Šค๋Š” ์œ ํ˜• ๋ณ€ํ™˜ ๋ฐฉ๋ฒ• ๋•๋ถ„์— ๊ธฐ๋Šฅ์  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‹ค์ œ๋กœ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ž‘์„ฑ ์ค‘์ธ Powershell์ด โ€‹โ€‹์ž‘๋™ํ•˜๋‚˜์š”?

C# ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๋ฐฐ๊ฒฝ์„ ๊ฐ€์ง„ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด C#๊ณผ ์œ ์‚ฌํ•œ Powershell์„ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์—์„œ ๋ฒ—์–ด๋‚˜ Powershell์˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ง‘์ค‘ํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ(|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์— ํฌ๊ฒŒ ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ๋” ๊ธฐ๋Šฅ์ ์ธ ์Šคํƒ€์ผ์„ ๊ฐ–๊ฒŒ ๋˜๋ฉฐ Powershell์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์  ์Šคํƒ€์ผ์˜ ์ˆ˜์—….

ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์  ์‚ฌ์šฉ

์นด์ŠคํŠธ๋Š” ๋Œ€์ฒด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‹จ์ง€ ๋‘ ์˜์—ญ ๊ฐ„์˜ ๋งคํ•‘์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ForEach-Object๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’ ๋ฐฐ์—ด์„ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์—์„œ๋Š” Datum์ด ์บ์ŠคํŒ…๋  ๋•Œ๋งˆ๋‹ค Node ์ƒ์„ฑ์ž๊ฐ€ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ƒ๋‹นํ•œ ์–‘์˜ ์ฝ”๋“œ ์ž‘์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์€ ์„ ์–ธ์  ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ๋ฐ ์ง‘๊ณ„์— ์ค‘์ ์„ ๋‘๊ณ  ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

# ะŸั€ะธะผะตั€ ะบะพะผะฑะธะฝะธั€ะพะฒะฐะฝะธั ะบะปะฐััะพะฒ ั ะบะพะฝะฒะตะนะตั€ะฐะผะธ ะดะปั separation of concerns ะฒ ะบะพะฝะฒะตะนะตั€ะฐั…

class Node {
    [ValidateLength(3, 7)]
    [string] $Name
    [ValidateSet("INT", "PPE", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope", "WestEurope")]
    [string] $Region
    Node([string] $Name) {
        $Name -match "([a-z]+)(INT|PPE|PROD)([a-z]+)"
        $_, $this.Service, $this.FlightingRing, $this.Region = $Matches
        $this.Name = $Name
    }
}

class Datum {
    [string] $Name
    [int] $Value
    [Node] $Computer
    [int] Severity() {
        $this.Name -match "[0-9]+$"
        return $Matches[0]
    }
}

Write-Host "Urgent Security Audit Issues:"
Import-Csv "./audit-results.csv" `
    | ForEach-Object {[Datum]$_} `
    | Where-Object Value -gt 0 `
    | Group-Object {$_.Severity()} `
    | Where-Object Name -lt 2 `
    | ForEach-Object Group `
    | ForEach-Object Computer `
    | Where-Object FlightingRing -eq "PROD" `
    | Sort-Object Name, Region -Unique

์žฌ์‚ฌ์šฉ์„ ์œ„ํ•œ ํฌ์žฅ ํด๋ž˜์Šค

๋ณด์ด๋Š” ๊ฒƒ๋งŒํผ ์ข‹์€ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค

์•ˆํƒ€๊น๊ฒŒ๋„ ํด๋ž˜์Šค๋Š” ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“ˆ์—์„œ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ํŠธ๋ฆญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๊ฐ€ ./my-classes.ps1 ํŒŒ์ผ์— ์ •์˜๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋„ํŠธ์†Œ์‹ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ./my-classes.ps1. ๊ทธ๋Ÿฌ๋ฉด ํ˜„์žฌ ๋ฒ”์œ„์—์„œ my-classes.ps1์ด ์‹คํ–‰๋˜๊ณ  ํ•ด๋‹น ํŒŒ์ผ์˜ ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ง€์ • API(cmdlet)๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” Powershell ๋ชจ๋“ˆ์„ ๋งŒ๋“ค๊ณ  ๋ชจ๋“ˆ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ScriptsToProcess = "./my-classes.ps1" ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ./my-classes.ps1์€ ๋‹ค์Œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ํ™˜๊ฒฝ.

์–ด๋–ค ์˜ต์…˜์„ ์„ ํƒํ•˜๋“  Powershell์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์€ ๋‹ค๋ฅธ ์œ„์น˜์—์„œ ๋กœ๋“œ๋œ ๋™์ผํ•œ ์ด๋ฆ„์˜ ์œ ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์„œ๋กœ ๋‹ค๋ฅธ ์œ„์น˜์—์„œ ๋™์ผํ•œ ์†์„ฑ์„ ๊ฐ€์ง„ ๋‘ ๊ฐœ์˜ ๋™์ผํ•œ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•œ ๊ฒฝ์šฐ์—๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ์˜ ๊ธธ

์œ ํ˜• ํ™•์ธ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ž˜์Šค ์ •์˜ ์œ ํ˜•์„ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ๋Œ€์‹ , ํด๋ž˜์Šค์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜๋ฅผ ๋ชจ๋“ˆ์—์„œ ๋‚ด๋ณด๋‚ด์‹ญ์‹œ์˜ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ธํŠธ๋ฅผ ์ง€์›ํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” New-Cluster ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index
}

function New-Cluster {
    [OutputType([Cluster])]
    Param(
        [Parameter(Mandatory, ParameterSetName = "Id", Position = 0)]
        [ValidateNotNullOrEmpty()]
        [string] $Id,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [string] $Service,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [string] $FlightingRing,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [string] $Region,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [int] $Index
    )

    if ($Id) {
        $Service, $FlightingRing, $Region, $Index = $Id -split "-"
    }

    [Cluster]@{
        Service       = $Service
        FlightingRing = $FlightingRing
        Region        = $Region
        Index         = $Index
    }
}

Export-ModuleMember New-Cluster

๋˜ ๋ฌด์—‡์„ ์ฝ์„๊นŒ

์ˆ˜์—… ์ •๋ณด
๋ฐฉ์–ด์šฉ ํŒŒ์›Œ์…ธ
PowerShell์˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€