샘플 워크플로

이 페이지에서는 Workflows 구문과 일반적인 사용 패턴을 이해하는 데 도움이 되는 샘플 워크플로 정의를 제공합니다.

인증

다른 Google Cloud 리소스와 통신하는 모든 샘플의 경우 해당 리소스에 대해 충분한 액세스 권한이 있는 서비스 계정에 워크플로를 연결해야 합니다. 서비스 계정 역할 부여에 대해 자세히 알아보려면 리소스에 대한 액세스 권한 부여, 변경, 취소를 참조하세요. 워크플로에 연결된 서비스 계정을 변경하는 방법은 워크플로 업데이트를 참조하세요. 인증에 대한 자세한 내용은 워크플로 내에서 인증된 요청 수행을 참조하세요.

HTTP 요청

이 샘플은 HTTP 요청을 수행하는 방법을 보여줍니다.

외부 HTTP POST 요청 수행

이 샘플은 외부 HTTP 엔드포인트에 POST 요청을 수행합니다.

YAML

- getMessage:
    call: http.post
    args:
      url: https://www.example.com/endpoint
      body:
        someVal: "Hello World"
        anotherVal: 123
    result: theMessage
- returnValue:
    return: ${theMessage.body}

JSON

[
  {
    "getMessage": {
      "call": "http.post",
      "args": {
        "url": "https://www.example.com/endpoint",
        "body": {
          "someVal": "Hello World",
          "anotherVal": 123
        }
      },
      "result": "theMessage"
    }
  },
  {
    "returnValue": {
      "return": "${theMessage.body}"
    }
  }
]

헤더를 사용하여 외부 HTTP GET 요청 수행

이 샘플은 커스텀 헤더를 사용하여 HTTP GET 요청을 수행합니다. 다른 유형의 HTTP 요청을 수행할 때 커스텀 헤더 정의를 제공할 수도 있습니다.

YAML

- getMessage:
    call: http.get
    args:
      url: https://www.example.com/endpoint
      headers:
        Content-Type: "text/plain"
      query:
        someVal: "Hello World"
        anotherVal: 123
    result: theMessage
- returnValue:
    return: ${theMessage.body}

JSON

[
  {
    "getMessage": {
      "call": "http.get",
      "args": {
        "url": "https://www.example.com/endpoint",
        "headers": {
          "Content-Type": "text/plain"
        },
        "query": {
          "someVal": "Hello World",
          "anotherVal": 123
        }
      },
      "result": "theMessage"
    }
  },
  {
    "returnValue": {
      "return": "${theMessage.body}"
    }
  }
]

변수, 표현식, 런타임 인수

이 샘플은 변수 값 할당, 표현식 평가, 런타임 인수 액세스 방법을 보여줍니다.

변수 할당

이 샘플은 문자열 및 숫자 값을 변수에 할당합니다. 변수 할당은 순차적으로 실행됩니다.

YAML

- firstStep:
    assign:
      - SomeName: "Sherlock"
      - AnotherName: "Ada"
      - SomeIntegerNumber: 27
      - SomeDoubleNumber: 4.1

JSON

[
  {
    "firstStep": {
      "assign": [
        {
          "SomeName": "Sherlock"
        },
        {
          "AnotherName": "Ada"
        },
        {
          "SomeIntegerNumber": 27
        },
        {
          "SomeDoubleNumber": 4.1
        }
      ]
    }
  }
]

유형 Cast 변환으로 표현식 평가

이 샘플은 표현식을 사용하여 변수 값을 할당합니다. FullName 변수에는 그 위에 정의된 LastName 변수가 사용됩니다.

YAML

- getMessage:
    assign:
      - name: "Harsha"
      - lastName: "Kapoor"
      - fullName: ${name+" "+lastName}
      - temperatureC: 27
      - temperatureF: ${temperatureC * 9/5 + 32}
      - temperatureMsg: ${"Current temperature is "+string(temperatureF)+" F"}
- returnValue:
    return: ${temperatureMsg}

JSON

[
  {
    "getMessage": {
      "assign": [
        {
          "name": "Harsha"
        },
        {
          "lastName": "Kapoor"
        },
        {
          "fullName": "${name+\" \"+lastName}"
        },
        {
          "temperatureC": 27
        },
        {
          "temperatureF": "${temperatureC * 9/5 + 32}"
        },
        {
          "temperatureMsg": "${\"Current temperature is \"+string(temperatureF)+\" F\"}"
        }
      ]
    }
  },
  {
    "returnValue": {
      "return": "${temperatureMsg}"
    }
  }
]

런타임 인수 액세스

이 샘플은 실행 요청 중에 워크플로에 전달된 런타임 인수에 액세스합니다. 모든 인수는 동일한 사전에 저장되며, 기본 워크플로의 매개변수로 선언됩니다.

이 워크플로를 실행할 때 다음 형식을 사용하여 런타임 인수를 전달합니다.

{"firstName":"Sherlock", "lastName":"Holmes"}

YAML

main:
  params: [args]
  steps:
  - step1:
      assign:
        - outputVar: ${"Hello " + args.firstName + " " + args.lastName}
  - step2:
      return: ${outputVar}

JSON

{
  "main": {
    "params": [
      "args"
    ],
    "steps": [
      {
        "step1": {
          "assign": [
            {
              "outputVar": "${\"Hello \" + args.firstName + \" \" + args.lastName}"
            }
          ]
        }
      },
      {
        "step2": {
          "return": "${outputVar}"
        }
      }
    ]
  }
}

사전 및 배열 선언

이 샘플은 사전과 몇 개의 배열을 모두 정의합니다. 배열 정의는 대괄호를 사용하여 인라인으로 만들거나 항목이 한 줄에 하나씩 포함된 목록으로 만들 수 있습니다.

YAML

- firstStep:
    assign:
      - myDictionary:
          name: Lila
          lastName: Barton
          birthYear: 1990
      - myArray1: [1, 2, 3]
      - myArray2:
          - 1
          - 2
          - 3
      - myArray3: ["Grzegorz", "Irina", "Yufei"]

JSON

[
  {
    "firstStep": {
      "assign": [
        {
          "myDictionary": {
            "name": "Lila",
            "lastName": "Barton",
            "birthYear": 1990
          }
        },
        {
          "myArray1": [
            1,
            2,
            3
          ]
        },
        {
          "myArray2": [
            1,
            2,
            3
          ]
        },
        {
          "myArray3": [
            "Grzegorz",
            "Irina",
            "Yufei"
          ]
        }
      ]
    }
  }
]

배열을 통해 반복

이 샘플은 문자열 배열을 반복하고 이를 하나로 연결합니다. 이 워크플로 정의를 수정하여 다른 배열을 처리할 수 있습니다.

YAML

- define:
    assign:
      - array: ["foo", "ba", "r"]
      - result: ""
      - i: 0
- check_condition:
    switch:
      - condition: ${len(array) > i}
        next: iterate
    next: exit_loop
- iterate:
    assign:
      - result: ${result + array[i]}
      - i: ${i+1}
    next: check_condition
- exit_loop:
    return:
        concat_result: ${result}

JSON

[
  {
    "define": {
      "assign": [
        {
          "array": [
            "foo",
            "ba",
            "r"
          ]
        },
        {
          "result": ""
        },
        {
          "i": 0
        }
      ]
    }
  },
  {
    "check_condition": {
      "switch": [
        {
          "condition": "${len(array) > i}",
          "next": "iterate"
        }
      ],
      "next": "exit_loop"
    }
  },
  {
    "iterate": {
      "assign": [
        {
          "result": "${result + array[i]}"
        },
        {
          "i": "${i+1}"
        }
      ],
      "next": "check_condition"
    }
  },
  {
    "exit_loop": {
      "return": {
        "concat_result": "${result}"
      }
    }
  }
]

단계 순서

암시적 단계 순서

이 샘플은 워크플로 내의 암시적 단계 순서를 보여줍니다. 기본적으로 워크플로 단계는 워크플로 정의에 표시된 순서로 실행됩니다.

YAML

- firstStep:
    call: http.get
    args:
      url: https://www.example.com/callA
- secondStep:
    call: http.get
    args:
      url: https://www.example.com/callB
- thirdStep:
    call: http.get
    args:
      url: https://www.example.com/callC

JSON

[
  {
    "firstStep": {
      "call": "http.get",
      "args": {
        "url": "https://www.example.com/callA"
      }
    }
  },
  {
    "secondStep": {
      "call": "http.get",
      "args": {
        "url": "https://www.example.com/callB"
      }
    }
  },
  {
    "thirdStep": {
      "call": "http.get",
      "args": {
        "url": "https://www.example.com/callC"
      }
    }
  }
]

점프를 사용한 명시적인 단계 순서 지정

이 샘플은 next: 명령어를 사용하여 워크플로 단계의 순서를 명시적으로 정의합니다. 이 예시에서 단계는 워크플로 정의에 표시되는 것과 다른 순서로 실행됩니다.

YAML

- firstStep:
    call: http.get
    args:
      url: https://www.somewhere.com/callA
    next: secondStep
- thirdStep:
    call: http.get
    args:
      url: https://www.somewhere.com/callB
    next: end
- secondStep:
    call: http.get
    args:
      url: https://www.somewhere.com/callC
    next: thirdStep

JSON

[
  {
    "firstStep": {
      "call": "http.get",
      "args": {
        "url": "https://www.somewhere.com/callA"
      },
      "next": "secondStep"
    }
  },
  {
    "thirdStep": {
      "call": "http.get",
      "args": {
        "url": "https://www.somewhere.com/callB"
      },
      "next": "end"
    }
  },
  {
    "secondStep": {
      "call": "http.get",
      "args": {
        "url": "https://www.somewhere.com/callC"
      },
      "next": "thirdStep"
    }
  }
]

next를 사용하여 단계 순서를 제어하는 방법에 대한 자세한 내용은 워크플로에서 실행 순서 제어를 참조하세요.

조건부 점프

경우에 따라 조건이 충족되면 워크플로를 특정 단계로 점프해야 할 수 있습니다. 이 샘플은 워크플로의 첫 번째 단계에서 반환된 값에 따라 small, medium, large 단계로 점프합니다.

YAML

- firstStep:
    call: http.get
    args:
      url: https://www.example.com/callA
    result: firstResult
- whereToJump:
    switch:
      - condition: ${firstResult.body.SomeField < 10}
        next: small
      - condition: ${firstResult.body.SomeField < 100}
        next: medium
    next: large
- small:
    call: http.get
    args:
      url: https://www.example.com/SmallFunc
    next: end
- medium:
    call: http.get
    args:
      url: https://www.example.com/MediumFunc
    next: end
- large:
    call: http.get
    args:
      url: https://www.example.com/LargeFunc
    next: end

JSON

[
  {
    "firstStep": {
      "call": "http.get",
      "args": {
        "url": "https://www.example.com/callA"
      },
      "result": "firstResult"
    }
  },
  {
    "whereToJump": {
      "switch": [
        {
          "condition": "${firstResult.body.SomeField < 10}",
          "next": "small"
        },
        {
          "condition": "${firstResult.body.SomeField < 100}",
          "next": "medium"
        }
      ],
      "next": "large"
    }
  },
  {
    "small": {
      "call": "http.get",
      "args": {
        "url": "https://www.example.com/SmallFunc"
      },
      "next": "end"
    }
  },
  {
    "medium": {
      "call": "http.get",
      "args": {
        "url": "https://www.example.com/MediumFunc"
      },
      "next": "end"
    }
  },
  {
    "large": {
      "call": "http.get",
      "args": {
        "url": "https://www.example.com/LargeFunc"
      },
      "next": "end"
    }
  }
]

스위치 사용에 대한 자세한 내용은 조건부 점프를 참조하세요.

내장 단계가 있는 전환 구조

조건이 충족되었을 때 다른 단계로 점프하지 않고 직접 단계 실행을 지원하도록 전환 구조를 사용할 수도 있습니다. 이렇게 하면 워크플로 정의에 포함되는 단계 수가 줄어 워크플로 가독성이 향상됩니다.

YAML

- step1:
    assign:
      - a: 1
- step2:
    switch:
      - condition: ${a==1}
        steps:
          - stepA:
              assign:
                - a: ${a+7}
          - stepB:
              return: ${"increase a to:"+string(a)}
- step3:
    return: ${"default a="+string(a)}

JSON

[
  {
    "step1": {
      "assign": [
        {
          "a": 1
        }
      ]
    }
  },
  {
    "step2": {
      "switch": [
        {
          "condition": "${a==1}",
          "steps": [
            {
              "stepA": {
                "assign": [
                  {
                    "a": "${a+7}"
                  }
                ]
              }
            },
            {
              "stepB": {
                "return": "${\"increase a to:\"+string(a)}"
              }
            }
          ]
        }
      ]
    }
  },
  {
    "step3": {
      "return": "${\"default a=\"+string(a)}"
    }
  }
]

스위치 사용에 대한 자세한 내용은 조건부 점프를 참조하세요.

간단한 하위 워크플로

이 샘플은 간단한 하위 워크플로를 구현합니다. 워크플로에 하위 워크플로가 있으면 기본 워크플로를 main 블록에 배치해야 합니다. 하위 워크플로는 항상 워크플로 정의의 기본 본문 뒤에 정의됩니다.

YAML

main:
  steps:
    - first:
        call: hello
        args:
          input: "Kristof"
        result: someOutput
    - second:
        return: ${someOutput}

hello:
  params: [input]
  steps:
    - first:
        return: ${"Hello "+input}

JSON

{
  "main": {
    "steps": [
      {
        "first": {
          "call": "hello",
          "args": {
            "input": "Kristof"
          },
          "result": "someOutput"
        }
      },
      {
        "second": {
          "return": "${someOutput}"
        }
      }
    ]
  },
  "hello": {
    "params": [
      "input"
    ],
    "steps": [
      {
        "first": {
          "return": "${\"Hello \"+input}"
        }
      }
    ]
  }
}

하위 워크플로 사용에 대한 자세한 내용은 하위 워크플로 만들기 및 사용을 참조하세요.

오류 처리

이 샘플은 예외를 포착하고 단계를 재시도하는 방법을 보여줍니다. 자세한 내용은 구문 참조 페이지의 오류 처리 섹션을 참조하세요.

HTTP 요청 오류 포착 및 처리

이 샘플은 GET 요청으로 반환된 HTTP 상태 코드를 기반으로 하는 커스텀 예외 핸들러를 구현합니다. 이 워크플로는 잠재적인 예외를 포착하고 사전 정의된 오류 메시지를 반환합니다. 예외가 인식되지 않으면 워크플로 실행이 실패하고 GET 요청으로 반환되는 대로 예외가 발생합니다.

같은 패턴을 사용하여 Cloud Run 또는 Cloud Functions 워크로드에서 발생하는 예외도 포착할 수 있습니다.

YAML

- readItem:
    try:
      call: http.get
      args:
        url: https://example.com/someapi
        auth:
          type: OIDC
      result: APIResponse
    except:
      as: e
      steps:
        - knownErrors:
            switch:
              - condition: ${not("HttpError" in e.tags)}
                next: connectionProblem
              - condition: ${e.code == 404}
                next: urlNotFound
              - condition: ${e.code == 403}
                next: authProblem
        - UnhandledException:
            raise: ${e}
- urlFound:
    return: ${APIResponse.body}
- connectionProblem:
    return: "Connection problem; check URL"
- urlNotFound:
    return: "Sorry, URL wasn't found"
- authProblem:
    return: "Authentication error"

JSON

[
  {
    "readItem": {
      "try": {
        "call": "http.get",
        "args": {
          "url": "https://example.com/someapi",
          "auth": {
            "type": "OIDC"
          }
        },
        "result": "APIResponse"
      },
      "except": {
        "as": "e",
        "steps": [
          {
            "knownErrors": {
              "switch": [
                {
                  "condition": "${not(\"HttpError\" in e.tags)}",
                  "next": "connectionProblem"
                },
                {
                  "condition": "${e.code == 404}",
                  "next": "urlNotFound"
                },
                {
                  "condition": "${e.code == 403}",
                  "next": "authProblem"
                }
              ]
            }
          },
          {
            "UnhandledException": {
              "raise": "${e}"
            }
          }
        ]
      }
    }
  },
  {
    "urlFound": {
      "return": "${APIResponse.body}"
    }
  },
  {
    "connectionProblem": {
      "return": "Connection problem; check URL"
    }
  },
  {
    "urlNotFound": {
      "return": "Sorry, URL wasn't found"
    }
  },
  {
    "authProblem": {
      "return": "Authentication error"
    }
  }
]

기본 재시도 정책을 사용하는 단계 재시도

Workflows에는 기본 제공되는 재시도 정책이 포함되어 있습니다. 이 샘플은 HTTP 요청에 대해 기본 제공되는 재시도 정책을 사용합니다.

커스텀 구성으로 단계 재시도

이 샘플은 커스텀 재시도 구성을 사용하여 HTTP 요청을 수행합니다. 이 예시에서는 표준 재시도 조건자를 사용하여 재시도를 수행할 시기, 재시도에 대한 커스텀 최대 횟수, 백오프 매개변수를 결정합니다.

YAML

- readItem:
    try:
      call: http.get
      args:
        url: https://example.com/someapi
      result: apiResponse
    retry:
      predicate: ${http.default_retry_predicate}
      max_retries: 5
      backoff:
        initial_delay: 2
        max_delay: 60
        multiplier: 2

JSON

[
  {
    "readItem": {
      "try": {
        "call": "http.get",
        "args": {
          "url": "https://example.com/someapi"
        },
        "result": "apiResponse"
      },
      "retry": {
        "predicate": "${http.default_retry_predicate}",
        "max_retries": 5,
        "backoff": {
          "initial_delay": 2,
          "max_delay": 60,
          "multiplier": 2
        }
      }
    }
  }
]

커스텀 조건자를 사용한 오류 처리

이 샘플은 커스텀 조건자 및 커스텀 백오프 매개변수를 포함하여 커스텀 오류 핸들러를 정의합니다. 조건자는 단일 매개변수를 예외 정의를 저장하는 데 사용되는 사전으로 사용하는 하위 워크플로로 정의됩니다.

YAML

main:
  steps:
    - readItem:
        try:
          call: http.get
          args:
            url: https://example.com/someapi
          result: apiResponse
        retry:
          predicate: ${myOwnPredicate}
          max_retries: 5
          backoff:
            initial_delay: 2
            max_delay: 60
            multiplier: 2
    - LastStep:
        return: "OK"

myOwnPredicate:
  params: [e]
  steps:
    - whatToRepeat:
        switch:
          - condition: "df"
            return: True
    - otherwise:
        return: False

JSON

{
  "main": {
    "steps": [
      {
        "readItem": {
          "try": {
            "call": "http.get",
            "args": {
              "url": "https://example.com/someapi"
            },
            "result": "apiResponse"
          },
          "retry": {
            "predicate": "${myOwnPredicate}",
            "max_retries": 5,
            "backoff": {
              "initial_delay": 2,
              "max_delay": 60,
              "multiplier": 2
            }
          }
        }
      },
      {
        "LastStep": {
          "return": "OK"
        }
      }
    ]
  },
  "myOwnPredicate": {
    "params": [
      "e"
    ],
    "steps": [
      {
        "whatToRepeat": {
          "switch": [
            {
              "condition": "df",
              "return": true
            }
          ]
        }
      },
      {
        "otherwise": {
          "return": false
        }
      }
    ]
  }
}

다른 Google Cloud 서비스와 연결

이 샘플은 Workflows가 다른 Google Cloud 서비스와 상호작용하는 방법을 보여줍니다.

인증을 사용한 Cloud Functions에 대한 POST 요청

이 샘플은 인증된 호출만 허용하는 Cloud Functions 함수에 POST 요청을 수행합니다.

YAML

- callMyFunction:
    call: http.post
    args:
      url: https://us-central1-myproject123.cloudfunctions.net/myfunc1
      auth:
        type: OIDC
      body:
        someVal: "Hello World"
        anotherVal: 123
    result: theMessage
- returnValue:
    return: ${theMessage.body}

JSON

[
  {
    "callMyFunction": {
      "call": "http.post",
      "args": {
        "url": "https://us-central1-myproject123.cloudfunctions.net/myfunc1",
        "auth": {
          "type": "OIDC"
        },
        "body": {
          "someVal": "Hello World",
          "anotherVal": 123
        }
      },
      "result": "theMessage"
    }
  },
  {
    "returnValue": {
      "return": "${theMessage.body}"
    }
  }
]

워크플로 내에서 리소스에 인증을 수행하는 방법에 대한 자세한 내용은 워크플로 내에서 인증된 요청 수행을 참조하세요.

인증을 사용한 Cloud Run에 대한 GET 요청

이 샘플은 인증이 필요한 Cloud Run 워크로드를 호출합니다.

YAML

- callMyFunction:
    call: http.get
    args:
      url: https://example-12345-ew.a.run.app
      auth:
        type: OIDC
      query:
        someVal: "Hello World"
        anotherVal: 123
    result: theMessage
- returnValue:
    return: ${theMessage.body}

JSON

[
  {
    "callMyFunction": {
      "call": "http.get",
      "args": {
        "url": "https://example-12345-ew.a.run.app",
        "auth": {
          "type": "OIDC"
        },
        "query": {
          "someVal": "Hello World",
          "anotherVal": 123
        }
      },
      "result": "theMessage"
    }
  },
  {
    "returnValue": {
      "return": "${theMessage.body}"
    }
  }
]

워크플로 내에서 리소스에 인증을 수행하는 방법에 대한 자세한 내용은 워크플로 내에서 인증된 요청 수행을 참조하세요.

Compute Engine 가상 머신 중지

이 샘플은 Compute Engine API를 호출하여 가상 머신을 중지합니다. 프로젝트 ID는 기본 제공되는 환경 변수에서 캡처되며, 소스 코드 이동성을 돕기 위해 워크플로와 동일한 프로젝트를 가리킵니다.

roles/compute.instanceAdmin.v1 역할과 같이 가상 머신을 중지할 수 있는 충분한 권한이 있는 서비스 계정에 워크플로를 연결해야 합니다. 서비스 계정 역할 부여에 대해 자세히 알아보려면 리소스에 대한 액세스 권한 부여, 변경, 취소를 참조하세요.

YAML

- initialize:
    assign:
    - project: ${sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER")}
    - zone: "us-central1-a"
    - vmToStop: "examplevm"
- stopInstance:
    call: http.post
    args:
      url: ${"https://compute.googleapis.com/compute/v1/projects/"+project+"/zones/"+zone+"/instances/"+vmToStop+"/stop"}
      auth:
        type: OAuth2
    result: stopResult

JSON

[
  {
    "initialize": {
      "assign": [
        {
          "project": "${sys.get_env(\"GOOGLE_CLOUD_PROJECT_NUMBER\")}"
        },
        {
          "zone": "us-central1-a"
        },
        {
          "vmToStop": "examplevm"
        }
      ]
    }
  },
  {
    "stopInstance": {
      "call": "http.post",
      "args": {
        "url": "${\"https://compute.googleapis.com/compute/v1/projects/\"+project+\"/zones/\"+zone+\"/instances/\"+vmToStop+\"/stop\"}",
        "auth": {
          "type": "OAuth2"
        }
      },
      "result": "stopResult"
    }
  }
]

워크플로 내에서 리소스에 인증을 수행하는 방법에 대한 자세한 내용은 워크플로 내에서 인증된 요청 수행을 참조하세요.

Firestore에서 읽기

이 샘플은 항목을 읽기 위해 Firestore API에 요청을 수행하는 방법을 보여줍니다. 이 워크플로는 변수를 초기화하여 프로젝트 ID, 컬렉션 이름, initialize 단계에서 검색할 문서를 설정합니다.

이 워크플로는 roles/datastore.viewer 역할과 같이 Firestore에서 읽기를 수행하는 데 충분한 권한이 있는 서비스 계정과 연결되어야 합니다. 서비스 계정 역할 부여에 대해 자세히 알아보려면 리소스에 대한 액세스 권한 부여, 변경, 취소를 참조하세요.

YAML

- initialize:
    assign:
    - project: "myproject123"
    - collection: "myEntries"
    - document: "Report"
- readItem:
    try:
      call: http.get
      args:
        url: ${"https://firestore.googleapis.com/v1/projects/"+project+"/databases/(default)/documents/"+collection+"/"+document}
        auth:
          type: OAuth2
      result: documentValue
    except:
      as: e
      steps:
      - isTheKeyFound:
          switch:
          - condition: ${e.code == 404}
            next: documentNotFound
          - condition: ${e.code == 403}
            next: authError
    next: documentFound
- documentNotFound:
    return: "Document not found."
- authError:
    return: "Authentication error."
- documentFound:
    return: ${documentValue.body.fields.LastName.stringValue}

JSON

[
  {
    "initialize": {
      "assign": [
        {
          "project": "myproject123"
        },
        {
          "collection": "myEntries"
        },
        {
          "document": "Report"
        }
      ]
    }
  },
  {
    "readItem": {
      "try": {
        "call": "http.get",
        "args": {
          "url": "${\"https://firestore.googleapis.com/v1/projects/\"+project+\"/databases/(default)/documents/\"+collection+\"/\"+document}",
          "auth": {
            "type": "OAuth2"
          }
        },
        "result": "documentValue"
      },
      "except": {
        "as": "e",
        "steps": [
          {
            "isTheKeyFound": {
              "switch": [
                {
                  "condition": "${e.code == 404}",
                  "next": "documentNotFound"
                },
                {
                  "condition": "${e.code == 403}",
                  "next": "authError"
                }
              ]
            }
          }
        ]
      },
      "next": "documentFound"
    }
  },
  {
    "documentNotFound": {
      "return": "Document not found."
    }
  },
  {
    "authError": {
      "return": "Authentication error."
    }
  },
  {
    "documentFound": {
      "return": "${documentValue.body.fields.LastName.stringValue}"
    }
  }
]

워크플로 내에서 리소스에 인증을 수행하는 방법에 대한 자세한 내용은 워크플로 내에서 인증된 요청 수행을 참조하세요.

Firestore에 쓰기

이 샘플은 항목을 쓰기 위해 Firestore API에 요청을 수행합니다. 이 워크플로는 변수를 초기화하여 프로젝트 ID, 컬렉션 이름, initialize 단계에서 검색할 문서를 설정합니다.

이 워크플로는 roles/datastore.user 역할과 같이 Firestore에서 읽기를 수행하는 데 충분한 권한이 있는 서비스 계정과 연결되어야 합니다. 서비스 계정 역할 부여에 대해 자세히 알아보려면 리소스에 대한 액세스 권한 부여, 변경, 취소를 참조하세요.

YAML

- initialize:
    assign:
    - project: "myproject123"
    - collection: "myEntries"
    - document: "Visits"
- writeItem:
    call: http.request
    args:
      url: ${"https://firestore.googleapis.com/v1/projects/"+project+"/databases/(default)/documents/"+collection+"/"+document}
      auth:
        type: OAuth2
      method: PATCH
      body:
        name: ${"projects/"+project+"/databases/(default)/documents/"+collection+"/"+document}
        fields:
          Counter:
            integerValue: 7

JSON

[
  {
    "initialize": {
      "assign": [
        {
          "project": "myproject123"
        },
        {
          "collection": "myEntries"
        },
        {
          "document": "Visits"
        }
      ]
    }
  },
  {
    "writeItem": {
      "call": "http.request",
      "args": {
        "url": "${\"https://firestore.googleapis.com/v1/projects/\"+project+\"/databases/(default)/documents/\"+collection+\"/\"+document}",
        "auth": {
          "type": "OAuth2"
        },
        "method": "PATCH",
        "body": {
          "name": "${\"projects/\"+project+\"/databases/(default)/documents/\"+collection+\"/\"+document}",
          "fields": {
            "Counter": {
              "integerValue": 7
            }
          }
        }
      }
    }
  }
]

워크플로 내에서 또 다른 리소스에 인증을 수행하는 방법에 대한 자세한 내용은 워크플로 내에서 인증된 요청 수행을 참조하세요.

Cloud Translation API를 사용하여 영어를 러시아어로 번역

이 샘플은 런타임 인수 문자열을 영어에서 러시아어로 번역하기 위해 Cloud Translation API에 요청을 수행합니다.

이 워크플로는 roles/cloudtranslate.user 역할과 같이 Cloud Translation API에 요청을 전송하는 데 충분한 권한이 있는 서비스 계정과 연결되어야 합니다. 서비스 계정 역할 부여에 대해 자세히 알아보려면 리소스에 대한 액세스 권한 부여, 변경, 취소를 참조하세요.

이 워크플로를 실행할 때는 다음 형식으로 런타임 인수를 전달합니다.

{"textToTranslate":"Hello world!"}

YAML

main:
  params: [args]
  steps:
    - newTranslation:
        call: http.post
        args:
          url: ${"https://translation.googleapis.com/v3/projects/"+sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER")+":translateText"}
          auth:
            type: OAuth2
          body:
            contents: ${args.textToTranslate}
            sourceLanguageCode: "en-US"
            targetLanguageCode: "ru-RU"
        result: translateResponse
    - assignTranslation:
        assign:
          - translationResult: ${translateResponse.body.translations[0].translatedText}
    - returnResult:
        return: ${translationResult}

JSON

{
  "main": {
    "params": [
      "args"
    ],
    "steps": [
      {
        "newTranslation": {
          "call": "http.post",
          "args": {
            "url": "${\"https://translation.googleapis.com/v3/projects/\"+sys.get_env(\"GOOGLE_CLOUD_PROJECT_NUMBER\")+\":translateText\"}",
            "auth": {
              "type": "OAuth2"
            },
            "body": {
              "contents": "${args.textToTranslate}",
              "sourceLanguageCode": "en-US",
              "targetLanguageCode": "ru-RU"
            }
          },
          "result": "translateResponse"
        }
      },
      {
        "assignTranslation": {
          "assign": [
            {
              "translationResult": "${translateResponse.body.translations[0].translatedText}"
            }
          ]
        }
      },
      {
        "returnResult": {
          "return": "${translationResult}"
        }
      }
    ]
  }
}

다음 단계