メインコンテンツまでスキップ

開発者ワークフロー

このガイドでは、ローカル開発から本番デプロイまで、secretctl がシークレット管理を効率化する一般的な開発シナリオを説明します。

ローカル開発

散在する .env ファイルの置き換え

問題: プロジェクト全体に散在する .env ファイル、誤ってコミットしやすい、同期を保つのが難しい。

解決策: シークレットを secretctl Vault に一元化。

# 複数の .env ファイルを管理する代わりに
# シークレットを Vault に一度保存
echo "sk-abc123" | secretctl set OPENAI_API_KEY
echo "postgres://user:pass@localhost/db" | secretctl set DATABASE_URL

# シークレットを注入してアプリを実行
secretctl run -k OPENAI_API_KEY -k DATABASE_URL -- npm start

プロジェクト固有のシークレット

階層的なキーを使用してプロジェクトごとにシークレットを整理:

# プロジェクト A のシークレット
echo "key-a" | secretctl set projectA/api_key
echo "db-a" | secretctl set projectA/database_url

# プロジェクト B のシークレット
echo "key-b" | secretctl set projectB/api_key
echo "db-b" | secretctl set projectB/database_url

# プロジェクト固有のシークレットで実行
secretctl run -k "projectA/*" -- ./run-project-a.sh
secretctl run -k "projectB/*" -- ./run-project-b.sh

複数環境

環境エイリアスを使用してシームレスに環境を切り替え:

# ~/.secretctl/mcp-policy.yaml
env_aliases:
dev:
- pattern: "db/*"
target: "dev/db/*"
prod:
- pattern: "db/*"
target: "prod/db/*"
# 同じコマンドで異なる環境
secretctl run --env=dev -k "db/*" -- ./app
secretctl run --env=prod -k "db/*" -- ./app

CI/CD 連携

GitHub Actions

GitHub Actions ワークフローにシークレットを注入:

# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install secretctl
run: |
curl -fsSL https://github.com/forest6511/secretctl/releases/latest/download/secretctl-linux-amd64 -o secretctl
chmod +x secretctl
sudo mv secretctl /usr/local/bin/

- name: Initialize vault
env:
SECRETCTL_PASSWORD: ${{ secrets.SECRETCTL_PASSWORD }}
run: |
# セキュアストレージから Vault を復元または初期化
secretctl init

- name: Deploy with secrets
env:
SECRETCTL_PASSWORD: ${{ secrets.SECRETCTL_PASSWORD }}
run: |
secretctl run -k DEPLOY_TOKEN -k AWS_ACCESS_KEY -- ./deploy.sh

GitLab CI

# .gitlab-ci.yml
deploy:
stage: deploy
script:
- curl -fsSL https://github.com/forest6511/secretctl/releases/latest/download/secretctl-linux-amd64 -o secretctl
- chmod +x secretctl && mv secretctl /usr/local/bin/
- secretctl run -k "deploy/*" -- ./deploy.sh
variables:
SECRETCTL_PASSWORD: $SECRETCTL_PASSWORD

Jenkins

// Jenkinsfile
pipeline {
agent any
environment {
SECRETCTL_PASSWORD = credentials('secretctl-password')
}
stages {
stage('Deploy') {
steps {
sh '''
secretctl run -k DEPLOY_TOKEN -- ./deploy.sh
'''
}
}
}
}

Docker ワークフロー

Docker Compose での開発

Docker Compose 用に .env を生成:

# Docker Compose 用にシークレットをエクスポート
secretctl export -k "docker/*" -o .env

# または docker-compose を直接実行
secretctl run -k "docker/*" -- docker-compose up
# docker-compose.yml
services:
app:
build: .
env_file:
- .env

Docker ビルド引数

ビルド引数としてシークレットを安全に渡す:

# Dockerfile にシークレットを埋め込まない
# 代わりにビルド時に渡す
secretctl run -k GITHUB_TOKEN -- docker build \
--build-arg GITHUB_TOKEN=$GITHUB_TOKEN \
-t myapp .

Docker Run

ランタイムでシークレットを注入:

secretctl run -k "app/*" -- docker run \
-e API_KEY=$API_KEY \
-e DATABASE_URL=$DATABASE_URL \
myapp

データベース接続

PostgreSQL

# データベース認証情報を保存
echo "prod-db.example.com" | secretctl set db/host
echo "myuser" | secretctl set db/user
echo "secret123" | secretctl set db/password

# psql で接続
secretctl run -k "db/*" -- psql "postgresql://$DB_USER:$DB_PASSWORD@$DB_HOST/mydb"

MySQL

secretctl run -k "mysql/*" -- mysql \
-h $MYSQL_HOST \
-u $MYSQL_USER \
-p$MYSQL_PASSWORD \
mydb

データベースマイグレーション

# データベース認証情報でマイグレーションを実行
secretctl run -k DATABASE_URL -- npx prisma migrate deploy
secretctl run -k DATABASE_URL -- rails db:migrate
secretctl run -k "db/*" -- flyway migrate

クラウドプロバイダー CLI

AWS CLI

# AWS 認証情報を保存
echo "AKIAIOSFODNN7EXAMPLE" | secretctl set aws/access_key_id
echo "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" | secretctl set aws/secret_access_key

# AWS コマンドを実行
secretctl run -k "aws/*" -- aws s3 ls
secretctl run -k "aws/*" -- aws ec2 describe-instances

Google Cloud

# サービスアカウントキーパスまたは認証情報を保存
echo "/path/to/service-account.json" | secretctl set gcp/credentials_file

# gcloud コマンドを実行
secretctl run -k "gcp/*" -- gcloud compute instances list

Azure CLI

# Azure 認証情報を保存
echo "your-client-id" | secretctl set azure/client_id
echo "your-client-secret" | secretctl set azure/client_secret

secretctl run -k "azure/*" -- az vm list

API 開発

curl での API テスト

# API キーを保存
echo "sk-live-xxx" | secretctl set stripe/api_key
echo "Bearer xxx" | secretctl set github/token

# 認証済みリクエストを実行
secretctl run -k "stripe/*" -- curl -u $STRIPE_API_KEY: https://api.stripe.com/v1/charges

secretctl run -k "github/*" -- curl -H "Authorization: $GITHUB_TOKEN" https://api.github.com/user

Postman/Insomnia

API テストツール用にシークレットをエクスポート:

# インポート用に JSON でエクスポート
secretctl export -k "api/*" --format=json -o api-secrets.json

Kubernetes ワークフロー

Kubernetes Secrets の作成

# エクスポートして k8s secret を作成
secretctl export -k "app/*" --format=json | \
kubectl create secret generic app-secrets --from-env-file=/dev/stdin

# または個別のキーを使用
secretctl run -k "k8s/*" -- kubectl create secret generic db-creds \
--from-literal=username=$DB_USER \
--from-literal=password=$DB_PASSWORD

Helm デプロイメント

# Helm にシークレットを渡す
secretctl run -k "helm/*" -- helm upgrade myapp ./chart \
--set database.password=$DB_PASSWORD \
--set api.key=$API_KEY

Terraform ワークフロー

環境変数

# Terraform は TF_VAR_* 環境変数を読み取る
secretctl run -k "terraform/*" -- terraform apply

# シークレットは以下のように保存:
# terraform/TF_VAR_db_password -> TF_VAR_DB_PASSWORD

バックエンド設定

# リモート state バックエンドを設定
secretctl run -k AWS_ACCESS_KEY -k AWS_SECRET_KEY -- terraform init

ベストプラクティス

命名規則

シークレットを一貫して整理:

# サービス別
aws/access_key
aws/secret_key
stripe/api_key
stripe/webhook_secret

# 環境別
dev/database_url
staging/database_url
prod/database_url

# プロジェクト別
projectA/api_key
projectB/api_key

ローテーションワークフロー

# 新しいパスワードを生成
NEW_PASS=$(secretctl generate -l 32)

# シークレットを更新
echo "$NEW_PASS" | secretctl set db/password \
--notes="Rotated on $(date +%Y-%m-%d)"

# サービスを再起動
secretctl run -k "db/*" -- ./restart-services.sh

チームオンボーディング

# 新しいチームメンバー用に必要なシークレットを文書化
secretctl list > required-secrets.txt

# 新メンバーは自分の Vault を作成してシークレットを追加
secretctl init
echo "my-api-key" | secretctl set API_KEY

監査証跡

# アクセスパターンをレビュー
secretctl audit export --format=json -o audit-$(date +%Y%m%d).json

# 異常なアクセスをチェック
secretctl audit export | jq '.[] | select(.source == "mcp")'

トラブルシューティング

シークレットが見つからない

# シークレットの存在を確認
secretctl list | grep API_KEY

# 正確なキー名を確認(大文字小文字を区別)
secretctl get API_KEY

環境変数が設定されない

# デバッグ: 注入された変数を出力
secretctl run -k "api/*" -- env | grep API

# ワイルドカードパターンがマッチするか確認
secretctl list | grep "api/"

CI/CD パスワードの問題

# SECRETCTL_PASSWORD が設定されていることを確認
if [ -z "$SECRETCTL_PASSWORD" ]; then
echo "Error: SECRETCTL_PASSWORD not set"
exit 1
fi

次のステップ