๋ฌธ์ œํ•ด๊ฒฐ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” Workflows๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Workflows ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋””๋ฒ„๊น…์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฐฐํฌ ์˜ค๋ฅ˜

์›Œํฌํ”Œ๋กœ๊ฐ€ ๋ฐฐํฌ๋  ๋•Œ Workflows๋Š” ์†Œ์Šค ์ฝ”๋“œ์— ์˜ค๋ฅ˜๊ฐ€ ์—†๊ณ  ์–ธ์–ด ๊ตฌ๋ฌธ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด Workflows๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ ์˜ค๋ฅ˜์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜, ๋‹จ๊ณ„ ๋˜๋Š” ํ•˜์œ„ ์›Œํฌํ”Œ๋กœ ์ฐธ์กฐ
  • ์ž˜๋ชป๋œ ๊ตฌ๋ฌธ
    • ์ž˜๋ชป๋œ ๋“ค์—ฌ์“ฐ๊ธฐ
    • ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ๋ถˆํ•„์š”ํ•œ {, }, ", -, :

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์†Œ์Šค ์ฝ”๋“œ๋Š” ๋ฐ˜ํ™˜ ๊ตฌ๋ฌธ์ด ์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ varC๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐํฌ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

- step1:
    assign:
    - varA: "Hello"
    - varB: "World"
- step2:
    return: ${varC + varB}

์ด ์ž˜๋ชป๋œ ์†Œ์Šค ์ฝ”๋“œ๋Š” ๋‹ค์Œ Google Cloud Console ๋ฐ gcloud CLI ์˜ˆ์‹œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฝ˜์†”

๋ฐฐํฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Workflows๊ฐ€ ์›Œํฌํ”Œ๋กœ ์ˆ˜์ • ํŽ˜์ด์ง€์˜ ๋ฐฐ๋„ˆ์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ ์˜ค๋ฅ˜ ์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ์†Œ์Šค ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋ฅผ ํ”Œ๋ž˜๊ทธ๋กœ ํ‘œ์‹œํ•˜๊ณ , ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ์›์ ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

Could not deploy workflow: failed to build: error in step step2: error
evaluating return value: symbol 'varC' is neither a variable nor a
sub-workflow name (Code: 3)

gcloud

gcloud workflows deploy ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฐฐํฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด Workflows๊ฐ€ ๋ช…๋ น์ค„์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ์†Œ์Šค ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜์˜ ์ถœ์ฒ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

ERROR: (gcloud.workflows.deploy) [INVALID_ARGUMENT] failed to build:
error in step step2: error evaluating return value: symbol 'varC' is neither
a variable nor a sub-workflow name

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์›Œํฌํ”Œ๋กœ์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ varC ๋Œ€์‹  varA๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

HTTP 403 ์„œ๋น„์Šค ๊ณ„์ • ๊ถŒํ•œ ์˜ค๋ฅ˜

HTTP ์„œ๋ฒ„๊ฐ€ 403 ์˜ค๋ฅ˜ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•˜๋ฉด ์›Œํฌํ”Œ๋กœ ์‹คํ–‰์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Permission 'iam.serviceaccounts.actAs' denied on service
account PROJECT_NUMBER-compute@developer.gserviceaccount.com (or it may not exist).

๋˜๋Š”

SERVICE_ACCOUNT does not have storage.objects.create access to the Google Cloud
Storage object. Permission 'storage.objects.create' denied on resource (or it may not exist).

๋ชจ๋“  ์›Œํฌํ”Œ๋กœ๋Š” ์›Œํฌํ”Œ๋กœ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ IAM ์„œ๋น„์Šค ๊ณ„์ •๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์›Œํฌํ”Œ๋กœ ๊ด€๋ฆฌ์— ํ•„์š”ํ•œ ์ตœ์†Œ ๊ถŒํ•œ์ด ํฌํ•จ๋œ ํ•˜๋‚˜ ์ด์ƒ์˜ IAM ์—ญํ• ์„ ์„œ๋น„์Šค ๊ณ„์ •์— ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์›Œํฌํ”Œ๋กœ์—์„œ Cloud Logging์œผ๋กœ ๋กœ๊ทธ๋ฅผ ์ „์†กํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ์›Œํฌํ”Œ๋กœ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์— logging.logEntries.create ๊ถŒํ•œ์ด ํฌํ•จ๋œ ์—ญํ• ์ด ๋ถ€์—ฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์›Œํฌํ”Œ๋กœ์— Google Cloud ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

HTTP 404 No such object ๋˜๋Š” Not found ์˜ค๋ฅ˜

Cloud Storage ์ปค๋„ฅํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ HTTP ์„œ๋ฒ„๊ฐ€ 404 ์˜ค๋ฅ˜ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•˜๋ฉด ์›Œํฌํ”Œ๋กœ ์‹คํ–‰์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

HTTP server responded with error code 404
in step "read_input_file", routine "main", line: 13
{
  "body": "Not Found",
  "code": 404,
  ...
}

๊ฒฝ๋กœ์˜ ์•ˆ์ „์„ฑ์„ ์œ„ํ•ด ๊ฐ์ฒด ์ด๋ฆ„์„ URL๋กœ ์ธ์ฝ”๋”ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. url_encode ๋ฐ url_encode_plus ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ URL์˜ ๊ฐ์ฒด ์ด๋ฆ„ ๋˜๋Š” ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์— ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ ์ด๋ฅผ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

- init:
    assign:
        - source_bucket: "my-bucket"
        - file_name: "my-folder/my-file.json"
- list_objects:
    call: googleapis.storage.v1.objects.get
    args:
        bucket: ${source_bucket}
        object: ${text.url_encode(file_name)}
        alt: media
    result: r
- returnStep:
    return: ${r}

๊ฐ์ฒด ์ด๋ฆ„์„ URL ์ธ์ฝ”๋”ฉํ•˜์ง€ ์•Š๊ณ  ์Šคํ† ๋ฆฌ์ง€ ๋ฒ„ํ‚ท์— ํด๋”๊ฐ€ ์žˆ์œผ๋ฉด ์š”์ฒญ์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ URL ๊ฒฝ๋กœ ๋ถ€๋ถ„ ์ธ์ฝ”๋”ฉ ๋ฐ Cloud Storage ์ด๋ฆ„ ์ง€์ • ๊ณ ๋ ค์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

HTTP 429 Too many requests ์˜ค๋ฅ˜

ํ™œ์„ฑ ์›Œํฌํ”Œ๋กœ ์‹คํ–‰์ด ๋™์‹œ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ฐœ์ˆ˜๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ํ• ๋‹น๋Ÿ‰์ด ์†Œ์ง„๋˜๊ณ  ์‹คํ–‰ ๋ฐฑ๋กœ๊ทธ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ง€๋˜์—ˆ๊ฑฐ๋‚˜ ๋ฐฑ๋กœ๊ทธ๋œ ์‹คํ–‰์˜ ํ• ๋‹น๋Ÿ‰์— ๋„๋‹ฌํ•˜๋ฉด ์ƒˆ ์‹คํ–‰์€ HTTP 429 Too many requests ์ƒํƒœ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ๋ฐฑ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์‹œ ์‹คํ–‰ ํ• ๋‹น๋Ÿ‰์— ๋„๋‹ฌํ•œ ํ›„ ์›Œํฌํ”Œ๋กœ ์‹คํ–‰์„ ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ ๋ฐฑ๋กœ๊น…์€ ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ์š”์ฒญ(Cloud Tasks์—์„œ ํŠธ๋ฆฌ๊ฑฐ๋œ ์š”์ฒญ ํฌํ•จ)์— ๋Œ€ํ•ด ์‚ฌ์šฉ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

  • ์›Œํฌํ”Œ๋กœ์—์„œ executions.run ๋˜๋Š” executions.create ์ปค๋„ฅํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰์„ ๋งŒ๋“ค ๋•Œ ์‹คํ–‰ ๋ฐฑ๋กœ๊ทธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰์˜ disableConcurrencyQuotaOverflowBuffering ํ•„๋“œ๋ฅผ false๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Pub/Sub์—์„œ ํŠธ๋ฆฌ๊ฑฐ๋œ ์‹คํ–‰์˜ ๊ฒฝ์šฐ ์‹คํ–‰ ๋ฐฑ๋กœ๊ทธ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ง€๋˜๋ฉฐ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹คํ–‰ ๋ฐฑ๋กœ๊ทธ ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์†๋„๋กœ Cloud Tasks ํ์—์„œ ํ•˜์œ„ ์›Œํฌํ”Œ๋กœ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ณ  ์‹คํ–‰ ์†๋„๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ช…์‹œ์ ์œผ๋กœ ์‹คํ–‰ ๋ฐฑ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ฐ„ ์„œ๋น„์Šค ๊ณ„์ • ๊ถŒํ•œ ์˜ค๋ฅ˜

ํ”„๋กœ์ ํŠธ ๊ฐ„ ์„œ๋น„์Šค ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ๋ฅผ ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ PERMISSION_DENIED ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์— iam.disableCrossProjectServiceAccountUsage ๋ถ€์šธ ์ œ์•ฝ์กฐ๊ฑด์ด ์ ์šฉ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ์„œ๋น„์Šค ๊ณ„์ •์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ”„๋กœ์ ํŠธ ๊ฐ„ ์„œ๋น„์Šค ๊ณ„์ •์œผ๋กœ ์›Œํฌํ”Œ๋กœ ๋ฐฐํฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฆฌ์†Œ์Šค ์ด๋ฆ„์€ RFC 1123์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

HTTP ์„œ๋ฒ„๊ฐ€ 400 ์˜ค๋ฅ˜ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•˜๋ฉด ์›Œํฌํ”Œ๋กœ ์‹คํ–‰์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"description": "must conform to RFC 1123: only lowercase, digits, hyphens,
and periods are allowed, must begin and end with letter or digit, and less
than 64 characters."

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์ด RFC 1123์— ์ •์˜๋œ ๋Œ€๋กœ DNS ๋ผ๋ฒจ ํ‘œ์ค€์„ ๋”ฐ๋ฅด๊ณ  ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•  ๋•Œ ๋ฌธ์ž์—ด ๋ฐ ํ‘œํ˜„์‹์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด - string: hello-${world}์™€ ๊ฐ™์ด ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

YAML

  - assign_vars:
      assign:
          - string: "hello"
          - string: ${string+" "+"world"}

JSON

  [
    {
      "assign_vars": {
        "assign": [
          {
            "string": "hello"
          },
          {
            "string": "${string+" "+"world"}"
          },
        ]
      }
    }
  ]

์ฝœ๋ก ์ด ํฌํ•จ๋œ ํ‘œํ˜„์‹

YAML์—์„œ ์ฝœ๋ก ์ด ํฌํ•จ๋œ ํ‘œํ˜„์‹์˜ ๊ฒฝ์šฐ ์ฝœ๋ก ์ด ๋งต ์ •์˜๋กœ ํ•ด์„๋˜๋ฉด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›Œํฌํ”Œ๋กœ๋ฅผ ๋ฐฐํฌ ๋ฐ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ถœ๋ ฅ์ด ์˜ˆ์ƒํ•œ ๋Œ€๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ Google Cloud ์ฝ˜์†”์—์„œ ์›Œํฌํ”Œ๋กœ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›Œํฌํ”Œ๋กœ ์ƒ์„ฑ ๊ฒฝ๊ณ 

YAML ํ‘œํ˜„์‹์„ ์ž‘์€๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์œผ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ถŒ์žฅ: '${"a: " +string(a)}'

๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ: ${"a: " +string(a)}

์˜์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค ๋งคํ•‘

์˜์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž(์˜ˆ: "special!key": value์˜ ๋А๋‚Œํ‘œ)๋กœ ๋งต ํ‚ค์— ์•ก์„ธ์Šคํ•  ๋•Œ๋Š” ํ‚ค ์ด๋ฆ„์„ ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค ์ด๋ฆ„์„ ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์ง€ ์•Š์œผ๋ฉด ์›Œํฌํ”Œ๋กœ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•˜๋ฉด token recognition error๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

- init:
    assign:
    - var:
        key:
            "special!key": bar
- returnOutput:
    return: '${"foo" + var.key[special!key]}'

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

'${"foo" + var.key["special!key"]}'

๋ชฉ๋ก์—์„œ ์—ฌ๋Ÿฌ ํ‘œํ˜„์‹

๋‹ค์Œ ๋ฐ˜๋ณต ๋ฒ”์œ„ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ๋ชฉ๋ก ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์œ ํšจํ•œ YAML์ด ์•„๋‹™๋‹ˆ๋‹ค.

[${rangeStart}, ${rangeEnd}])

๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชฉ๋ก์„ ํ‘œํ˜„์‹ ๋‚ด์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

    ${[rangeStart, rangeEnd]}

  • ๊ฐ ํ‘œํ˜„์‹์„ ์ž‘์€๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค.

    ['${rangeStart}', '${rangeEnd}']

๊ทธ๋Ÿฌ๋ฉด ๊ฒฐ๊ณผ๋Š” ์˜ˆ์ƒ๋Œ€๋กœ ๋‘ ๊ฐ’ ๋ชฉ๋ก์ด ๋ฉ๋‹ˆ๋‹ค.

๊ณ ๊ฐ ๊ด€๋ฆฌ ์•”ํ˜ธํ™” ํ‚ค(CMEK)

Workflows์—์„œ Cloud KMS๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํ‘œ๋Š” ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ์„ค๋ช…
cloudkms.cryptoKeyVersions.useToEncrypt ๊ถŒํ•œ์ด ๊ฑฐ๋ถ€๋จ ์ œ๊ณต๋œ Cloud KMS ํ‚ค๊ฐ€ ์—†๊ฑฐ๋‚˜ ๊ถŒํ•œ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜:

ํ‚ค ๋ฒ„์ „์ด ์‚ฌ์šฉ ์„ค์ •๋˜์ง€ ์•Š์Œ ์ œ๊ณต๋œ Cloud KMS ํ‚ค๊ฐ€ ์‚ฌ์šฉ ์ค‘์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜: Cloud KMS ํ‚ค ๋ฒ„์ „์„ ๋‹ค์‹œ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค๋ง ๋ฆฌ์ „์ด ๋ณดํ˜ธํ•  ๋ฆฌ์†Œ์Šค์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ ์ œ๊ณต๋œ KMS ํ‚ค๋ง ๋ฆฌ์ „์€ ์›Œํฌํ”Œ๋กœ์˜ ๋ฆฌ์ „๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜ ๋™์ผํ•œ ๋ฆฌ์ „์—์„œ Cloud KMS ํ‚ค๋ง๊ณผ ๋ณดํ˜ธ๋œ ์›Œํฌํ”Œ๋กœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud KMS ์œ„์น˜ ๋ฐ Workflows ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Cloud KMS ํ• ๋‹น๋Ÿ‰ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•จ Cloud KMS ์š”์ฒญ์˜ ํ• ๋‹น๋Ÿ‰ ํ•œ๋„์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜: Cloud KMS ํ˜ธ์ถœ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๊ฑฐ๋‚˜ ํ• ๋‹น๋Ÿ‰ ํ•œ๋„๋ฅผ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud KMS ํ• ๋‹น๋Ÿ‰์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Cloud Run ์ปค๋„ฅํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์š”์ฒญ๋œ ํ•ญ๋ชฉ์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ

googleapis.run.v1.namespaces.jobs.create ์ปค๋„ฅํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ๋•Œ HTTP ์„œ๋ฒ„๊ฐ€ 404 ์˜ค๋ฅ˜ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•˜๋ฉด ์›Œํฌํ”Œ๋กœ ์‹คํ–‰์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด HTTP ์—”๋“œํฌ์ธํŠธ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด us-central1 ๋˜๋Š” asia-southeast1์ž…๋‹ˆ๋‹ค. ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ „์—ญ ์—”๋“œํฌ์ธํŠธ https://run.googleapis.com์ด ์‚ฌ์šฉ๋˜์ง€๋งŒ ์ด ์œ„์น˜๋Š” list ๋ฉ”์„œ๋“œ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์ปค๋„ฅํ„ฐ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ location ์ธ์ˆ˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Cloud Run Admin API ์œ„์น˜ ์˜ต์…˜์€ ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฆฌ์†Œ์Šค ํ•œ๋„

๋ฆฌ์†Œ์Šค ์ œํ•œ ๋˜๋Š” ResourceLimitError, MemoryLimitExceededError, ResultSizeLimitExceededError์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ณ€์ˆ˜๋ฅผ ์‚ญ์ œํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋น„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ›„์† ๋‹จ๊ณ„์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๊ด€์‹ฌ ์—†๋Š” ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จ๋œ ํ˜ธ์ถœ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

YAML ๋“ค์—ฌ์“ฐ๊ธฐ

YAML ๋“ค์—ฌ์“ฐ๊ธฐ๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋“ค์—ฌ์“ฐ๊ธฐ ์ˆ˜์ค€๋‹น ์ตœ์†Œ 2๊ฐœ ์ด์ƒ์˜ ๊ณต๋ฐฑ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒˆ ์ˆ˜์ค€์€ ์ด์ „ ์ค„์˜ ํ…์ŠคํŠธ ์‹œ์ž‘๋ถ€ํ„ฐ ์ตœ์†Œ 2๊ฐœ ์ด์ƒ์˜ ๊ณต๋ฐฑ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์€ stepName ๋ฐ call ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๋งต์ด ํฌํ•จ๋œ ๋ชฉ๋ก ํ•ญ๋ชฉ์„ ์ž˜๋ชป ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

- stepName:
  call: sys.log

๋Œ€์‹  ํ›„์† ์ค„์„ ๊ณต๋ฐฑ 2๊ฐœ๋กœ ๋“ค์—ฌ์จ stepName ๋‚ด์—์„œ call์„ ์ค‘์ฒฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

- stepName:
    call: sys.log

ํƒญ ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ๊ณต๋ฐฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค„์„ ๋“ค์—ฌ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„