Pulumi๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ”„๋ผ๋ฅผ ์ฝ”๋“œ๋กœ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. 2 ๋ถ€

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๊ธฐ์‚ฌ์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์„ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. "Pulumi๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œํ˜• ์ธํ”„๋ผ ํ…Œ์ŠคํŠธ", ๊ทธ ๋ฒˆ์—ญ์€ ์ˆ˜๊ฐ•์ƒ์„ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. "DevOps ์‚ฌ๋ก€ ๋ฐ ๋„๊ตฌ".

Pulumi๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ”„๋ผ๋ฅผ ์ฝ”๋“œ๋กœ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. 2 ๋ถ€

๋ฐฐํฌ ํ…Œ์ŠคํŠธ

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

Pulumi ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” Go๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด์ „์— ๋…ผ์˜๋œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ™”์ดํŠธ ๋ฐ•์Šค ํ…Œ์ŠคํŠธ์— ๊ฐ€๊น์ง€๋งŒ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” ๋ธ”๋ž™ ๋ฐ•์Šค์ž…๋‹ˆ๋‹ค. (์—„๊ฒฉํ•œ ๋‚ด๋ถ€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์˜ต์…˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.) ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์™„์ „ํ•œ Pulumi ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ€์ ธ์™€์„œ ์ƒˆ ์Šคํƒ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐฐํฌํ•˜๊ณ  ๋ณ€ํ˜•์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ˆ˜๋ช…์ฃผ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. . ์ •๊ธฐ์ ์œผ๋กœ(์˜ˆ: ๋ฐค์—) ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

(์šฐ๋ฆฌ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค, ์œ ์‚ฌํ•œ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ์–ธ์–ด์˜ ๊ธฐ๋ณธ SDK์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pulumi ํ”„๋กœ๊ทธ๋žจ์ด ์ž‘์„ฑ๋œ ์–ธ์–ด์— ๊ด€๊ณ„์—†์ด Go ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๊ฐ€ ๊ตฌ๋ฌธ์ ์œผ๋กœ ์ •ํ™•ํ•˜๊ณ  ์˜ค๋ฅ˜ ์—†์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์Šคํƒ ๋ฐ ๋น„๋ฐ€ ๊ตฌ์„ฑ ์„ค์ •์ด ์ž‘๋™ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.
  • ๊ท€ํ•˜์˜ ํ”„๋กœ์ ํŠธ๋Š” ๊ท€ํ•˜๊ฐ€ ์„ ํƒํ•œ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์— ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กœ์ ํŠธ๋ฅผ ์ดˆ๊ธฐ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ N๊ฐœ ์ƒํƒœ๋กœ ์„ฑ๊ณต์ ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ํ๊ธฐ๋˜๊ณ  ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž์—์„œ ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณง ์‚ดํŽด๋ณด๊ฒ ์ง€๋งŒ ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ

์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ €์žฅ์†Œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. pulumi/examples, ์šฐ๋ฆฌ ํŒ€๊ณผ Pulumi ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์ฒด ํ’€ ์š”์ฒญ, ์ปค๋ฐ‹ ๋ฐ ์•ผ๊ฐ„ ๋นŒ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์šฐ๋ฆฌ์˜ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. S3 ๋ฒ„ํ‚ท ๋ฐ ๊ธฐํƒ€ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์˜ˆ:

example_test.go:

package test
 
import (
    "os"
    "path"
    "testing"
 
    "github.com/pulumi/pulumi/pkg/testing/integration"
)
 
func TestExamples(t *testing.T) {
    awsRegion := os.Getenv("AWS_REGION")
    if awsRegion == "" {
        awsRegion = "us-west-1"
    }
    cwd, _ := os.Getwd()
    integration.ProgramTest(t, &integration.ProgramTestOptions{
        Quick:       true,
        SkipRefresh: true,
        Dir:         path.Join(cwd, "..", "..", "aws-js-s3-folder"),
        Config: map[string]string{
            "aws:region": awsRegion,
        },
    })
}

์ด ํ…Œ์ŠคํŠธ๋Š” ํด๋”์˜ ์Šคํƒ์„ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋ณธ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. aws-js-s3-folder. ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๋ฅผ ๋ณด๊ณ ํ•˜๋Š” ๋ฐ ์•ฝ XNUMX๋ถ„ ์ •๋„ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

$ go test .
PASS
ok      ... 43.993s

์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ์˜ ๋™์ž‘์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์˜ต์…˜ ๋ชฉ๋ก์„ ํ™•์ธํ•˜์„ธ์š”. ๊ตฌ์กฐ์—์„œ ProgramTestOptions. ์˜ˆ๋ฅผ ๋“ค์–ด Jaeger ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(Tracing), ํ…Œ์ŠคํŠธ๊ฐ€ ์Œ์„ฑ์ธ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค(ExpectFailure), ์ˆœ์ฐจ์ ์ธ ์ƒํƒœ ์ „ํ™˜์„ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ์— ์ผ๋ จ์˜ "ํŽธ์ง‘"์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค(EditDirs) ๊ทธ๋ฆฌ๊ณ  ํ›จ์”ฌ ๋”. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค ์†์„ฑ ํ™•์ธ

์œ„์—์„œ ๋…ผ์˜ํ•œ ํ†ตํ•ฉ์€ ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์ด ์ถฉ๋Œํ•˜์ง€ ์•Š๊ณ  "์ž‘๋™"ํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ ์Šคํƒ์˜ ์†์„ฑ์„ ํ™•์ธํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ”„๋กœ๋น„์ €๋‹๋˜์—ˆ๊ฑฐ๋‚˜ ํ”„๋กœ๋น„์ €๋‹๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ํŠน์ • ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ ๋ณ€์ˆ˜ ExtraRuntimeValidation ์— ProgramTestOptions ์ด๋ฅผ ํ†ตํ•ด Pulumi๊ฐ€ ๊ธฐ๋กํ•œ ๋ฐฐํฌ ํ›„ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์—ฌ ์ถ”๊ฐ€ ํ™•์ธ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ตฌ์„ฑ, ๋‚ด๋ณด๋‚ธ ์ถœ๋ ฅ ๊ฐ’, ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์™€ ํ•ด๋‹น ์†์„ฑ ๊ฐ’, ๋ฆฌ์†Œ์Šค ๊ฐ„์˜ ๋ชจ๋“  ์ข…์†์„ฑ์„ ํฌํ•จํ•˜์—ฌ ๊ฒฐ๊ณผ ์Šคํƒ ์ƒํƒœ์˜ ์ „์ฒด ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์˜ˆ๋ฅผ ๋ณด๋ ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ํ•˜๋‚˜๋ฅผ ์ƒ์„ฑํ•˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. S3 ๋ฒ„ํ‚ท:

  integration.ProgramTest(t, &integration.ProgramTestOptions{
        // as before...
        ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
            var foundBuckets int
            for _, res := range stack.Deployment.Resources {
                if res.Type == "aws:s3/bucket:Bucket" {
                    foundBuckets++
                }
            }
            assert.Equal(t, 1, foundBuckets, "Expected to find a single AWS S3 Bucket")
        },
    })

์ด์ œ go ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ผ๋ จ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์น  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์Šคํƒ์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐฐํฌํ•œ ํ›„ ๊ฒฐ๊ณผ ์ƒํƒœ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ฒ€์‚ฌ๋„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„ ํ…Œ์ŠคํŠธ

์ง€๊ธˆ๊นŒ์ง€ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋Š” ์ˆœ์ „ํžˆ ๋ฐฐํฌ ๋™์ž‘๊ณผ Pulumi ๋ฆฌ์†Œ์Šค ๋ชจ๋ธ์— ๊ด€ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋น„์ €๋‹๋œ ์ธํ”„๋ผ๊ฐ€ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ€์ƒ ๋จธ์‹ ์ด ์‹คํ–‰ ์ค‘์ด๊ณ  S3 ๋ฒ„ํ‚ท์— ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ด๋ฏธ ์ง์ž‘ํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ต์…˜ ExtraRuntimeValidation ์— ProgramTestOptions - ์ด๊ฒƒ์€ ์ข‹์€ ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ํ”„๋กœ๊ทธ๋žจ ๋ฆฌ์†Œ์Šค์˜ ์ „์ฒด ์ƒํƒœ์— ์•ก์„ธ์Šคํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ Go ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒํƒœ์—๋Š” ๊ฐ€์ƒ ๋จธ์‹  IP ์ฃผ์†Œ, URL, ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ ํด๋ผ์šฐ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ์ธํ”„๋ผ์™€ ์‹ค์ œ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ ์†์„ฑ์„ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. webEndpoint ๋ฒ„ํ‚ท ํ˜ธ์ถœ๋จ websiteUrl, ๊ตฌ์„ฑ๋œ URL์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ „์ฒด URL์ž…๋‹ˆ๋‹ค. index document. ์ƒํƒœ ํŒŒ์ผ์„ ์ž์„ธํžˆ ์กฐ์‚ฌํ•˜์—ฌ ์ฐพ์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ bucket ํ•ด๋‹น ์†์„ฑ์„ ์ง์ ‘ ์ฝ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์Šคํƒ์€ ํ™•์ธ์— ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ์šฉํ•œ ์†์„ฑ์„ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

integration.ProgramTest(t, &integration.ProgramTestOptions{
            // as before ...
        ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
            url := "http://" + stack.Outputs["websiteUrl"].(string)
            resp, err := http.Get(url)
            if !assert.NoError(t, err) {
                return
            }
            if !assert.Equal(t, 200, resp.StatusCode) {
                return
            }
            defer resp.Body.Close()
            body, err := ioutil.ReadAll(resp.Body)
            if !assert.NoError(t, err) {
                return
            }
            assert.Contains(t, string(body), "Hello, Pulumi!")
        },
    })

์ด์ „ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ๊ฒ€์‚ฌ๋Š” ์Šคํƒ์„ ์˜ฌ๋ฆฐ ํ›„ ์ฆ‰์‹œ ์‹คํ–‰๋˜๋ฉฐ ๋ชจ๋‘ ๊ฐ„๋‹จํ•œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์‘๋‹ต์ž…๋‹ˆ๋‹ค. go test. ์ด๋Š” ๋น™์‚ฐ์˜ ์ผ๊ฐ์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  Go ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์†์ ์ธ ์ธํ”„๋ผ ํ†ตํ•ฉ

๋งŽ์€ ์ธํ”„๋ผ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ์ฝ”๋“œ ๊ฒ€ํ† ๋ฅผ ์œ„ํ•ด ์ œ์ถœํ•˜๊ธฐ ์ „์— ๋žฉํƒ‘์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์€ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ์™€ ๋งŽ์€ ๊ณ ๊ฐ์€ ๊ฐœ๋ฐœ ์ˆ˜๋ช… ์ฃผ๊ธฐ์˜ ๋‹ค์–‘ํ•œ ๋‹จ๊ณ„์—์„œ ์ธํ”„๋ผ๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณ‘ํ•ฉ ์ „ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๋ชจ๋“  ๊ณต๊ฐœ ํ’€ ์š”์ฒญ์—์„œ.
  • ๊ฐ ์ปค๋ฐ‹์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ณ‘ํ•ฉ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰๋˜์—ˆ๋Š”์ง€ ๋‹ค์‹œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋ฐค์ด๋‚˜ ๋งค์ฃผ ๋“ฑ ์ •๊ธฐ์ ์œผ๋กœ ์‹ค์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์žฅ๊ธฐ๊ฐ„์— ๊ฑธ์ณ ์‹คํ–‰๋˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐฐํฌํ•˜๋Š” ์„ฑ๋Šฅ ๋˜๋Š” ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

์ด๋“ค ๊ฐ๊ฐ์— ๋Œ€ํ•ด Pulumi๋Š” ๊ท€ํ•˜๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์ง€์†์  ํ†ตํ•ฉ ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ตํ•ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ง€์†์ ์ธ ํ†ตํ•ฉ์„ ํ†ตํ•ด ์ธํ”„๋ผ์— ๋Œ€ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œํ”„ํŠธ์›จ์–ด์™€ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ ๋ฒ”์œ„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Pulumi๋Š” ๊ณตํ†ต CI ์‹œ์Šคํ…œ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์— ๋Œ€ํ•œ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์—ฐ์† ๋ฐฐ๋‹ฌ.

์ž„์‹œ ํ™˜๊ฒฝ

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

GitHub๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Pulumi๋Š” ๋‹ค์Œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. GitHub ์•ฑ, CI ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด์—์„œ ์Šน์ธ ํ…Œ์ŠคํŠธ๋ฅผ ํ’€ ์š”์ฒญ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. GitHub ์ €์žฅ์†Œ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด Pulumi๊ฐ€ ์ธํ”„๋ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์—…๋ฐ์ดํŠธ ๋ฐ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ CI ๋ฐ ํ’€ ์š”์ฒญ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Pulumi๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ”„๋ผ๋ฅผ ์ฝ”๋“œ๋กœ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. 2 ๋ถ€

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

ํ•ฉ๊ณ„

์ด ๊ธฐ์‚ฌ์—์„œ ์šฐ๋ฆฌ๋Š” ๋ฒ”์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์œ ์šฉํ•œ ๋งŽ์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋ฐ ๊ด‘๋ฒ”์œ„ํ•œ ๋Ÿฐํƒ€์ž„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ์š”์ฒญ ์‹œ ๋˜๋Š” CI ์‹œ์Šคํ…œ์—์„œ ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ’€ ๋ฃจ๋ฏธ - ์˜คํ”ˆ ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด, ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์„ ํ˜ธํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ํด๋ผ์šฐ๋“œ์™€ ํ•จ๊ป˜ ์ž‘๋™ - ์˜ค๋Š˜ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”!

โ†’ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„

์ถœ์ฒ˜ : habr.com

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