이 튜토리얼에서는 Workflows를 사용하여 일련의 서비스를 함께 연결하는 방법을 보여줍니다. Cloud Run 함수를 사용하는 두 공개 HTTP 서비스, 외부 REST API, 비공개 Cloud Run 서비스를 연결하면 유연한 서버리스 애플리케이션을 만들 수 있습니다.
목표
이 튜토리얼에서는 Google Cloud CLI를 사용하여 하나의 워크플로를 만들고 한 번에 하나의 서비스를 연결합니다.
- Cloud Run 함수 두 개를 배포합니다. 첫 번째 함수는 난수를 생성하여 이를 두 번째 함수에 전달합니다.
- Workflows를 사용하여 두 HTTP 함수를 함께 연결합니다. 워크플로를 실행하여 반환된 결과가 외부 API로 전달됩니다.
- 워크플로를 사용하여 지정된 숫자의
log
를 반환하는 외부 HTTP API를 연결합니다. 워크플로를 실행하여 반환된 결과가 Cloud Run 서비스로 전달됩니다. - 인증된 액세스만 허용하는 Cloud Run 서비스를 배포합니다. 이 서비스는 지정된 숫자의
math.floor
를 반환합니다. - Workflows를 사용하여 Cloud Run 서비스를 연결하고 전체 워크플로를 실행하고 최종 결과를 반환합니다.
다음 다이어그램은 프로세스의 개요와 최종 워크플로의 시각화를 모두 보여줍니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
조직에서 정의한 보안 제약조건으로 인해 다음 단계를 완료하지 못할 수 있습니다. 문제 해결 정보는 제한된 Google Cloud 환경에서 애플리케이션 개발을 참조하세요.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Run functions, Cloud Storage, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com run.googleapis.com cloudfunctions.googleapis.com storage.googleapis.com workflows.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Run functions, Cloud Storage, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com run.googleapis.com cloudfunctions.googleapis.com storage.googleapis.com workflows.googleapis.com - Google Cloud CLI 구성요소를 업데이트합니다.
gcloud components update
- Cloud Shell 내에서 명령어를 실행할 경우 gcloud CLI에 이미 인증된 상태입니다. 그렇지 않으면 해당 계정을 사용하여 로그인합니다.
gcloud auth login
- 이 튜토리얼에서 사용한 기본 위치를 설정합니다.
gcloud config set project PROJECT_ID export REGION=REGION gcloud config set functions/region ${REGION} gcloud config set run/region ${REGION} gcloud config set workflows/location ${REGION}
REGION
을 지원되는 Workflows 위치 중 원하는 위치로 바꿉니다. -
프로젝트 생성자에게는 기본 소유자 역할(
roles/owner
)이 부여됩니다. 기본적으로 Identity and Access Management(IAM) 역할에는 대부분의 Google Cloud 리소스에 대한 전체 액세스에 필요한 권한이 포함되며, 이 단계를 건너뛸 수 있습니다.프로젝트 생성자가 아니면 프로젝트에서 적합한 주 구성원에 대해 필수 권한을 부여해야 합니다. 예를 들어 주 구성원은 Google 계정(최종 사용자)이거나 서비스 계정(애플리케이션 및 컴퓨팅 워크로드)일 수 있습니다. 자세한 내용은 이벤트 대상의 역할 및 권한 페이지를 참조하세요.
필수 권한
튜토리얼을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
-
Cloud Build 편집자(
roles/cloudbuild.builds.editor
) -
Cloud Functions 개발자(
roles/cloudfunctions.developer
) -
Cloud Run 관리자(
roles/run.admin
) -
서비스 계정 만들기(
roles/iam.serviceAccountCreator
) -
프로젝트 IAM 관리자(
roles/resourcemanager.projectIamAdmin
) -
서비스 계정 사용자(
roles/iam.serviceAccountUser
) -
서비스 사용량 소비자(
roles/serviceusage.serviceUsageConsumer
) -
스토리지 관리자(
roles/storage.admin
) -
워크플로 편집자(
roles/workflows.editor
)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
-
Cloud Build 편집자(
- 워크플로를 배포할 때 지정된 서비스 계정과 연결합니다. Workflows를 사용할 서비스 계정을 만듭니다.
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
- 모든 Cloud Run 서비스는 기본적으로 비공개로 배포되며 프로젝트 소유자, 프로젝트 편집자, Cloud Run 관리자, Cloud Run 호출자만 호출할 수 있습니다. 서비스 계정이 인증된 Cloud Run 서비스를 호출하도록 허용하려면
run.invoker
역할을 Workflows 서비스 계정에 부여합니다.gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/run.invoker"
첫 번째 Cloud Run 함수 배포
HTTP 요청을 수신하면 이 HTTP 함수가 1에서 100 사이의 난수를 생성한 후 숫자를 JSON 형식으로 반환합니다.
randomgen
이라는 디렉터리를 만들어 변경합니다.mkdir ~/randomgen cd ~/randomgen
다음 Python 코드가 포함된
main.py
라는 파일 이름의 텍스트 파일을 만듭니다.HTTP 처리를 위해 Flask에 대한 종속 항목을 지원하려면 pip 패키지 관리자용 텍스트 파일을 만듭니다. 파일 이름을
requirements.txt
로 지정하고 다음을 추가합니다.HTTP 트리거를 사용하여 함수를 배포하고 인증되지 않은 액세스를 허용합니다.
gcloud functions deploy randomgen-function \ --gen2 \ --runtime python310 \ --entry-point=randomgen \ --trigger-http \ --allow-unauthenticated
함수를 배포하는 데 몇 분 정도 걸릴 수 있습니다. 또한 Google Cloud 콘솔에서 Cloud Run 함수 인터페이스를 사용하여 함수를 배포할 수 있습니다.
randomgen
함수가 배포되면httpsTrigger.url
속성을 확인할 수 있습니다.gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)"
URL을 저장합니다. 이후 실습에서 워크플로 소스 파일에 추가해야 합니다.
다음 curl 명령어를 통해 함수를 사용해 볼 수 있습니다.
curl $(gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)")
숫자가 무작위로 생성되어 반환됩니다.
두 번째 Cloud Run 함수 배포
HTTP 요청을 수신하면 이 HTTP 함수가 JSON 본문에서 input
을 추출하여 2를 곱한 후 결과를 JSON 형식으로 반환합니다.
홈 디렉터리로 다시 이동합니다.
cd ~
multiply
라는 디렉터리를 만들어 변경합니다.mkdir ~/multiply cd ~/multiply
다음 Python 코드가 포함된
main.py
라는 파일 이름의 텍스트 파일을 만듭니다.HTTP 처리를 위해 Flask에 대한 종속 항목을 지원하려면 pip 패키지 관리자용 텍스트 파일을 만듭니다. 파일 이름을
requirements.txt
로 지정하고 다음을 추가합니다.HTTP 트리거를 사용하여 함수를 배포하고 인증되지 않은 액세스를 허용합니다.
gcloud functions deploy multiply-function \ --gen2 \ --runtime python310 \ --entry-point=multiply \ --trigger-http \ --allow-unauthenticated
함수를 배포하는 데 몇 분 정도 걸릴 수 있습니다. 또한 Google Cloud 콘솔에서 Cloud Run 함수 인터페이스를 사용하여 함수를 배포할 수 있습니다.
multiply
함수가 배포되면httpsTrigger.url
속성을 확인할 수 있습니다.gcloud functions describe multiply-function \ --gen2\ --format="value(serviceConfig.uri)"
URL을 저장합니다. 이후 실습에서 워크플로 소스 파일에 추가해야 합니다.
다음 curl 명령어를 통해 함수를 사용해 볼 수 있습니다.
curl -X POST MULTIPLY_FUNCTION_URL \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ -H "Content-Type: application/json" \ -d '{"input": 5}'
숫자 10이 반환되어야 합니다.
워크플로에서 두 Cloud Run 함수 연결
워크플로 정의는 YAML 또는 JSON 형식으로 작성할 수 있는 Workflows 구문을 사용하여 기술되는 일련의 단계들로 구성됩니다. 이것이 워크플로의 정의입니다. 자세한 내용은 구문 참조 페이지를 확인하세요.
홈 디렉터리로 다시 이동합니다.
cd ~
다음 콘텐츠를 포함하며 파일 이름이
workflow.yaml
인 텍스트 파일을 만듭니다.- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - return_result: return: ${multiply_result}
RANDOMGEN_FUNCTION_URL
을randomgen
함수의 URL로 바꿉니다.MULTIPLY_FUNCTION_URL
을multiply
함수의 URL로 바꿉니다.
이 소스 파일에서는 두 HTTP 함수가 함께 연결되어 최종 결과가 반환됩니다.
워크플로를 만들면 배포할 수 있으므로 실행이 가능합니다.
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
WORKFLOW_NAME
을 워크플로의 이름으로 바꿉니다.워크플로를 실행합니다.
gcloud workflows run WORKFLOW_NAME
실행은 워크플로 정의에 포함된 논리의 단일 실행을 의미합니다. 모든 워크플로 실행은 독립적이며 Workflows의 빠른 확장 덕분에 다수의 동시 실행이 가능합니다.
워크플로가 실행되면 다음과 유사한 결과가 출력됩니다.
result: '{"body":{"multiplied":120},"code":200,"headers":{"Alt-Svc":"h3-29=\":443\"; ... startTime: '2021-05-05T14:17:39.135251700Z' state: SUCCEEDED ...
워크플로에서 공개 REST 서비스 연결
기존 워크플로를 업데이트하고 수학 표현식을 평가할 수 있는 공개 REST API(math.js)를 연결합니다. 예를 들면 curl https://api.mathjs.org/v4/?'expr=log(56)'
입니다.
워크플로를 배포했으므로 Google Cloud 콘솔의 Workflows 페이지를 통해 워크플로를 수정할 수도 있습니다.
워크플로의 소스 파일을 수정하여 다음 콘텐츠로 바꿉니다.
- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - return_result: return: ${log_result}
RANDOMGEN_FUNCTION_URL
을randomgen
함수의 URL로 바꿉니다.MULTIPLY_FUNCTION_URL
을multiply
함수의 URL로 바꿉니다.
이렇게 하면 외부 REST 서비스가 Cloud Run 함수에 연결되어 최종 결과가 반환됩니다.
수정된 워크플로를 배포합니다.
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
Cloud Run 서비스 배포
HTTP 요청을 수신하면 JSON 본문에서 input
을 추출하고 math.floor
를 계산하여 결과를 반환하는 Cloud Run 서비스를 배포합니다.
floor
라는 디렉터리를 만들어 변경합니다.mkdir ~/floor cd ~/floor
다음 Python 코드가 포함된
app.py
라는 파일 이름의 텍스트 파일을 만듭니다.같은 디렉터리에서 다음 콘텐츠로
Dockerfile
을 만듭니다.Docker 컨테이너 이미지를 저장할 수 있는 Artifact Registry 표준 저장소를 만듭니다.
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=${REGION}
REPOSITORY
를 저장소의 고유한 이름으로 바꿉니다.컨테이너 이미지를 빌드합니다.
export SERVICE_NAME=floor gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
Cloud Run에 컨테이너 이미지를 배포하여 인증된 호출만 수락하도록 합니다.
gcloud run deploy ${SERVICE_NAME} \ --image ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}:latest \ --no-allow-unauthenticated
서비스 URL이 표시되면 배포가 완료된 것입니다. 워크플로 정의를 업데이트하는 경우 해당 URL을 지정해야 합니다.
워크플로에서 Cloud Run 서비스 연결
기존 워크플로를 업데이트하고 Cloud Run 서비스의 URL을 지정합니다.
홈 디렉터리로 다시 이동합니다.
cd ~
워크플로의 소스 파일을 수정하여 다음 콘텐츠로 바꿉니다.
- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - floor_function: call: http.post args: url: CLOUD_RUN_SERVICE_URL auth: type: OIDC body: input: ${log_result.body} result: floor_result - create_output_map: assign: - outputMap: randomResult: ${randomgen_result} multiplyResult: ${multiply_result} logResult: ${log_result} floorResult: ${floor_result} - return_output: return: ${outputMap}
RANDOMGEN_FUNCTION_URL
을randomgen
함수의 URL로 바꿉니다.MULTIPLY_FUNCTION_URL
을multiply
함수의 URL로 바꿉니다.CLOUD_RUN_SERVICE_URL
을 Cloud Run 서비스 URL로 바꿉니다.
그러면 워크플로의 Cloud Run 서비스가 연결됩니다.
auth
키는 Cloud Run 서비스 호출 시 인증 토큰이 전달되도록 합니다. 자세한 내용은 워크플로에서 인증된 요청 수행을 참조하세요.수정된 워크플로를 배포합니다.
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
최종 워크플로를 실행합니다.
gcloud workflows run WORKFLOW_NAME
출력은 다음과 비슷하게 표시됩니다.
result: '{"floorResult":{"body":"4","code":200 ... "logResult":{"body":"4.02535169073515","code":200 ... "multiplyResult":{"body":{"multiplied":56},"code":200 ... "randomResult":{"body":{"random":28},"code":200 ... startTime: '2023-11-13T21:22:56.782669001Z' state: SUCCEEDED
수고하셨습니다 일련의 서비스를 연결하는 워크플로를 배포하고 실행했습니다.
표현식, 조건부 건너뛰기, Base64 인코딩 또는 디코딩, 하위 워크플로 등을 사용하는 더 복잡한 워크플로를 만들려면 워크플로 구문 참조 및 표준 라이브러리 개요를 참조하세요.
삭제
이 튜토리얼용으로 새 프로젝트를 만든 경우 이 프로젝트를 삭제합니다. 기존 프로젝트를 사용한 경우 이 튜토리얼에 추가된 변경사항은 제외하고 보존하려면 튜토리얼용으로 만든 리소스를 삭제합니다.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하려면 다음 안내를 따르세요.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
튜토리얼 리소스 삭제
이 튜토리얼에서 배포한 Cloud Run 서비스를 삭제합니다.
이 튜토리얼에서 만든 워크플로를 삭제합니다.
Artifact Registry에서 컨테이너 이미지를 삭제합니다.
튜토리얼 설정 중에 추가한 Google Cloud CLI 기본 구성을 삭제합니다.
gcloud config unset functions/region gcloud config unset run/region gcloud config unset workflows/location gcloud config unset project