Secret Manager 커넥터를 사용하여 민감한 정보 보호 및 저장

Secret Manager는 API 키, 비밀번호, 인증서, 기타 민감한 정보를 위한 안전하고 편리한 스토리지 시스템입니다. Secret Manager는 Google Cloud에서 보안 비밀을 관리, 액세스, 감사하는 중앙의 단일 정보 소스를 제공합니다.

Workflows의 Secret Manager API용 커넥터를 사용하여 워크플로 내에서 Secret Manager에 액세스할 수 있습니다. 이렇게 하면 커넥터가 요청 형식을 처리하고 Secret Manager API의 세부정보를 알 필요가 없도록 메서드와 인수를 제공하므로 통합이 간소화됩니다. 또한 커넥터에는 재시도 및 장기 실행 작업 처리를 위한 기본 제공 동작이 설정되어 있습니다. Workflows 커넥터 사용에 대한 상세 설명은 커넥터 이해를 참조하세요.

Workflows 서비스 계정에 Secret Manager 액세스 권한 부여

Secret Manager는 액세스 제어에 Identity and Access Management(IAM)를 사용합니다. 보안 비밀 만들기, 관리, 나열, 액세스를 위해서는 프로젝트 수준 및 개별 리소스 수준에서 적절한 IAM 권한을 부여해야 합니다. 자세한 내용은 IAM으로 액세스 제어를 참조하세요.

Workflows는 서비스 계정을 사용하여 워크플로에 Google Cloud 리소스에 대한 액세스 권한을 부여합니다. 보안 비밀 버전에 액세스하려면 서비스 계정에 보안 비밀, 프로젝트, 폴더 또는 조직에 대한 Secret Manager 보안 비밀 접근자 역할(roles/secretmanager.secretAccessor)을 부여해야 합니다. 사용자 관리 서비스 계정으로 워크플로 배포에 대해 자세히 알아보세요.

API 사용 설정

Secret Manager API에 대해 Workflows 커넥터를 사용하기 전에 Secret Manager 및 Workflows API를 사용 설정합니다.

콘솔

API 사용 설정

gcloud

  gcloud services enable secretmanager.googleapis.com workflows.googleapis.com

커넥터 호출

HTTP 엔드포인트를 호출하는 것과 마찬가지로 커넥터 호출에는 callargs 필드가 필요합니다. 자세한 내용은 커넥터 호출을 참조하세요.

호출 단계를 사용하는 것 외에도 다음과 같은 표현식에서 도우미 메서드를 호출할 수 있습니다.

${googleapis.secretmanager.v1.projects.secrets.versions.accessString(secret_id, version, project_id)}

예를 들어 도우미 메서드 accessString을 사용하여 보안 비밀 데이터를 문자열로 검색할 수 있습니다. 보안 비밀 데이터가 문자열 형식으로 자동으로 디코딩되므로 access API를 사용하는 것보다 간단합니다.

또한 도우미 메서드 addVersionString을 사용하여 기존 보안 비밀에 새 보안 비밀 값을 추가할 수 있습니다. 보안 비밀 데이터가 addVersion에 필요한 base-64 문자열로 자동으로 인코딩되므로 addVersion API를 사용하는 것보다 간단합니다.

Secret Manager 커넥터를 사용하여 보안 비밀 검색

다음 워크플로는 Secret Manager 커넥터를 사용하여 보안 비밀을 검색하는 방법을 설명합니다.

YAML

# This workflow demonstrates how to use the Secret Manager connector:
# Retrieve a secret using three different methods
# Expected output: the secret data (thrice)
- init:
    assign:
      - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
      - secret_id: "test-secret"  # Make sure you have this secret and it has a version of 1.
      - version: "1"
# Add data to an existing secret without base-64 encoding
- add_version_string:
    call: googleapis.secretmanager.v1.projects.secrets.addVersionString
    args:
      secret_id: ${secret_id}
      project_id: ${project_id}
      data: "a new secret"
# Retrieve the secret in string format without base-64 decoding and assume
# that the secret data is a valid UTF-8 string; if not, raise an error
- access_string_secret:
    call: googleapis.secretmanager.v1.projects.secrets.versions.accessString
    args:
      secret_id: ${secret_id}
      version: ${version}  # if not set, "latest" is used
      project_id: ${project_id}
    result: str_secret
# Retrieve the secret in string format without base-64 decoding
- access_secret:
    call: googleapis.secretmanager.v1.projects.secrets.versions.access
    args:
      name: ${"projects/" + project_id + "/secrets/" + secret_id + "/versions/" + version}
    result: base64_encoded_secret
# Retrieve the secret using positional arguments in an expression
- expression:
    assign:
      - secret_str_from_exp: ${googleapis.secretmanager.v1.projects.secrets.versions.accessString(secret_id, version, project_id)}
- the_end:
    return:
      - ${str_secret}
      - ${text.decode(base64.decode(base64_encoded_secret.payload.data))}
      - ${secret_str_from_exp}

JSON

[
  {
    "init": {
      "assign": [
        {
          "project_id": "${sys.get_env(\"GOOGLE_CLOUD_PROJECT_ID\")}"
        },
        {
          "secret_id": "test-secret"
        },
        {
          "version": "1"
        }
      ]
    }
  },
  {
    "add_version_string": {
      "call": "googleapis.secretmanager.v1.projects.secrets.addVersionString",
      "args": {
        "secret_id": "${secret_id}",
        "project_id": "${project_id}",
        "data": "a new secret"
      }
    }
  },
  {
    "access_string_secret": {
      "call": "googleapis.secretmanager.v1.projects.secrets.versions.accessString",
      "args": {
        "secret_id": "${secret_id}",
        "version": "${version}",
        "project_id": "${project_id}"
      },
      "result": "str_secret"
    }
  },
  {
    "access_secret": {
      "call": "googleapis.secretmanager.v1.projects.secrets.versions.access",
      "args": {
        "name": "${\"projects/\" + project_id + \"/secrets/\" + secret_id + \"/versions/\" + version}"
      },
      "result": "base64_encoded_secret"
    }
  },
  {
    "expression": {
      "assign": [
        {
          "secret_str_from_exp": "${googleapis.secretmanager.v1.projects.secrets.versions.accessString(secret_id, version, project_id)}"
        }
      ]
    }
  },
  {
    "the_end": {
      "return": [
        "${str_secret}",
        "${text.decode(base64.decode(base64_encoded_secret.payload.data))}",
        "${secret_str_from_exp}"
      ]
    }
  }
]

다음 단계