Secret Manager コネクタを使用してセンシティブ データを保護し、保存する

Secret Manager は、API キー、パスワード、証明書、その他の機密データを保存するための安全で便利なストレージ システムです。これは、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 API と Workflows API が有効になっていることを確認してください。

コンソール

API を有効にする

gcloud

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

コネクタ コールを呼び出す

HTTP エンドポイントの呼び出しと同様に、コネクタ呼び出しには call フィールドと args フィールドが必要です。詳細については、コネクタ コールを呼び出すをご覧ください。

呼び出しステップを使用するだけでなく、次のような式でヘルパー メソッドを呼び出すこともできます。

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

たとえば、ヘルパー メソッド accessString を使用してシークレット データを文字列として取得できます。これは、access API を使用するよりも簡単です。シークレット データは自動的に文字列形式にデコードされるためです。

ヘルパー メソッド addVersionString を使用して、既存のシークレットに新しいシークレット値を追加することもできます。シークレット データは base64 文字列に自動的にエンコードされるため、addVersion API を使用するよりも簡単です(addVersion で必要)。

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}"
      ]
    }
  }
]

次のステップ