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 にワークフローのコネクタを使用する前に、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 Cloud Secret Manager connector to.
# retrieve a secret.
# Expected successful output: the secret data.

- 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"
# We provide a helper method to add a secret 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"
# We provide a helper method to access the secret in string format without base-64 decoding.
# To compare the usage between accessRaw() and access(), we list two demo steps to retrieve
# the same secret below.
#
# accessString assumes the secret data is a valid UTF-8 string and if it detects non-UTF-8
# bytes, an error will be raised.
- access_string_secret:
    call: googleapis.secretmanager.v1.projects.secrets.versions.accessString
    args:
      secret_id: ${secret_id}
      version: ${version}  # If not set, "latest" will be used.
      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
# Secret can also be retrieved by 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}
      - ${secret_str_from_exp}
      - ${text.decode(base64.decode(base64_encoded_secret.payload.data))}

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}",
        "${secret_str_from_exp}",
        "${text.decode(base64.decode(base64_encoded_secret.payload.data))}"
      ]
    }
  }
]

次のステップ