# コマンドラインからのワークフローシークレットの設定

ワークフローでは、特定のTreasure APIキーやPostgreSQL認証情報を使用する必要があることがよくあります。

Treasure APIキー、データベース認証情報、およびその他のオブジェクトは、潜在的に機密性の高いビジネスデータへのアクセスに使用できるため、安全に取り扱うことが重要です。

Treasure ワークフローは、通常のワークフローパラメータとは別に認証情報を安全に管理できる、セキュアなシークレット管理システムを提供しています。

## 制限事項

* セキュリティ上の理由から、Treasure ワークフローサービスにアップロードされたシークレットをダウンロードすることはできません。
* シークレットは主にtd_loadでYAMLに認証情報を展開するために使用されます。SQL変数、演算子のパラメータなどとしては使用できません。


## デフォルトのワークフロー権限

ワークフローがTreasure ワークフローにプッシュされると、ワークフローをプッシュしたユーザーの権限が自動的に使用されます。

別のユーザーの権限でワークフローを実行するには、`td wf secrets`コマンドを使用して別のキーをTreasure ワークフローサービスにアップロードします。特定のTreasure APIキーを使用してワークフローを設定します。

## APIキーの設定、変更、および元に戻す

以下のコマンドを実行して使用するAPIキーをアップロードし、プロンプトが表示されたらAPIキーを入力します。APIキーはターミナルに表示されません。その後、Enterキーを押します。


```bash
td wf secrets \
--project nasdaq_analysis \
--set td.apikey
```

これで、このプロジェクト内のすべてのワークフローがそのAPIキーを使用します。ワークフローを開始して試してみてください。


```bash
td wf start nasdaq_analysis \
nasdaq_analysis \
--session now
```

指定されたAPIキーはワークフローログに表示されませんが、ワークフローは正常に実行されるはずです。無効なAPIキーが指定された場合、実行は失敗します。

APIキーを変更するには、secretsのsetコマンドを再度実行し、別のAPIキーを指定します。

デフォルトのAPIキーの使用に戻すには、アップロードしたAPIキーを削除します。


```bash
td wf secrets \
--project nasdaq_analysis \
--delete td.apikey
```

## 複数のAPIキーを使用するワークフローの設定

ワークフロー内のタスクを、異なるTreasure アカウントにアクセスするために異なるAPIキーを使用するように設定したい場合があります。

ワークフローを正常に実行するには、一時ファイルがまだ存在しない場合、2つのそれぞれのAPIキーのアカウントにデータベースworkflow_tempを作成する必要がある場合があります。

2つの異なるAPIキーをアップロードします。


```bash
td wf secrets --project nasdaq_analysis --set apikey1

td wf secrets --project nasdaq_analysis --set apikey2
```

2つのタスクが2つの異なるAPIキーを使用するように設定します。


```yaml nasdaq_analysis.dig
timezone: UTC

schedule:
  daily>: 07:00:00

_export:
  td:
    database: workflow_temp

+task1:
  _secrets:
    td:
      apikey: apikey1
  td>: queries/daily_open.sql
  create_table: daily_open

+task2:
  _secrets:
    td:
      apikey: apikey2
  td>: queries/monthly_open.sql
  create_table: monthly_open
```

ワークフローを開始し、正常に実行されることを確認します。


```bash
td wf start nasdaq_analysis \
nasdaq_analysis \
--session now
```

## PostgreSQL認証情報の安全な設定

このセクションでは、`pg>`演算子を使用するワークフローがすでにあることを前提としています。

PostgreSQLのユーザーとパスワードを安全に設定するには、`td wf secrets`コマンドを使用してTreasure ワークフローにアップロードします。


```bash
td wf secrets --project my_project --set pg.user

td wf secrets --project my_project --set pg.password
```

ワークフローファイルに`pg.user`と`pg.password`が存在する場合は、必ず削除してください。

このプロジェクト内のすべてのワークフローは、`pg>`演算子を実行する際に指定されたユーザーとパスワードを使用します。他のいくつかの演算子設定オプションも安全に定義できます。これには以下が含まれます：

* `host`
* `port`
* `user`
* `password`
* `database`
* `ssl`
* `connect_timeout`
* `socket_timeout`
* `schema`


さまざまな設定オプションの詳細については、[Digdagドキュメント](http://docs.digdag.io/)を参照してください。

ワークフロープロジェクト内で異なるPostgreSQL認証情報のセットを使用するには、異なる名前でアップロードします。


```bash
td wf secrets --project my_project --set db1.pg.user

td wf secrets --project my_project --set db1.pg.password

td wf secrets --project my_project --set db2.pg.user

td wf secrets --project my_project --set db2.pg.password
```

次に、それぞれ`db1`と`db2`の名前を使用して認証情報を参照します。

名前は自由に選択できます。


```yaml
+task1:
  _secrets:
    pg: db1
  pg>: query1.sql

+task2:
  _secrets:
    pg: db2
  pg>: query2.sql
```

これで、`task1`は`db1`の認証情報を使用し、`task2`は`db2`の認証情報を使用します。

## ファイルからのシークレットのアップロード

複数の認証情報セットを管理する場合、ファイルを使用して一度にすべてをアップロードする方が便利な場合があります。YAMLおよびJSON形式のサンプルを以下に示します。

### YAML形式

1. 認証情報のキーと値のペアを含むファイルを作成します。



```yaml credentials.yaml
db1.pg.user: user1
db1.pg.password: pw1
db2.pg.user: user2
db2.pg.password: pw2
db3.pg.user: user3
db3.pg.password: pw3
```

1. 認証情報をTreasure ワークフローにアップロードします



```bash
td wf secrets --project my_project --set @credentials.yml
```

### JSON形式

1. 認証情報のキーと値のペアを含むファイルを作成します。



```json credentials.json
{
  "db1.pg.user": "user1",
  "db1.pg.password": "pw1",
  "db2.pg.user": "user2",
  "db2.pg.password": "pw2",
  "db3.pg.user": "user3",
  "db3.pg.password": "pw3"
}
```

1. 認証情報をTreasure ワークフローにアップロードします



```bash
td wf secrets \
--project my_project \
--set @credentials.json
```

## シークレットの一覧表示

プロジェクトにアップロードされたシークレットを一覧表示するには、secretsコマンドを実行する際に`--set`オプションを省略します。


```bash
td wf secrets --project my_project
```

## ローカルシークレット

ローカルモードでシークレットを使用するには、secretsコマンドを実行する際に`--project`の代わりに`--local`オプションを使用します。


```bash
td wf secrets --local --set @credentials.yml
```

## シークレットの削除

プロジェクトにアップロードされた認証情報を削除するには、`--delete`オプションを使用し、削除する1つ以上のシークレットを指定します。


```bash
td wf secrets \
--project my_project \
--delete db2.pg.user db2.pg.password
```