エラーの発生シナリオ新しい環境を構築したり、CI/CDパイプラインを調整したりする際に、この壁に突き当たることがあります。ワークスペースを初期化するコマンドを実行したものの、その名前がすでにステートファイルに登録されているため、Terraformがプロセスを停止してしまいます。
これは通常、次の2つの具体的なシナリオで発生します。
- 手動開発: 自分自身またはチームメンバーが以前にワークスペースを作成しており、それを忘れていた場合。- CI/CDパイプライン: GitHub Actions、Jenkinsジョブ、またはGitLabランナーが、プッシュのたびに
terraform workspace newを実行しようとする場合。最初の実行以降、ワークスペースは保持されるため、それ以降のデプロイは終了コード1で失敗します。``` $ terraform workspace new production Error: Workspace "production" already exists
## なぜこのエラーが発生するのか`workspace new` コマンドは「べき等(Idempotent)」ではありません。DevOpsの世界において、べき等な操作とは、何度実行しても最初の適用時以降に結果が変わらない操作のことを指します。Terraformは `new` を厳格な作成ステップとして扱います。その名前が `terraform.tfstate` や、DynamoDBロックを使用したS3バケットなどのリモートバックエンドに既に存在する場合、コマンドは即座に失敗します。
## クイックフィックス:手動での対応ローカルで作業している場合、解決策は簡単です。作成しようとするのをやめて、既存のワークスペースに切り替えるだけです。`select` コマンドを使用して、コンテキストを既存のワークスペースに移動します。
terraform workspace select production
状況によっては、一度すべてをリセットしたい場合もあるでしょう。古いステートを削除してやり直す必要がある場合は、再作成する前にワークスペースを削除する必要があります。ただし、これは管理されているインフラのリソース記録を破棄するため、注意して実行してください。
警告:これにより、この特定のワークスペースのステートが消去されます
terraform workspace delete production terraform workspace new production
## 恒久的な対策:自動化に適したスクリプトリソースがすでに存在するという理由だけでパイプラインがクラッシュすべきではありません。「ワークスペースがあればそれを使用し、なければ作成する」というロジックフローが必要です。
### オプション1:シンプルなワンライナーBashでこれを処理する最も効率的な方法は、`||`(OR演算子)を使用することです。これにより、最初のコマンドがエラーを返した場合にのみ、2番目のコマンドを実行するようにシェルに指示できます。
terraform workspace select production || terraform workspace new production
これはGitHub Actionsのステップにおける標準的なパターンです。これにより、最初のデプロイか50回目のデプロイかに関わらず、パイプラインを正常(グリーン)に保つことができます。
### オプション2:堅牢なシェルスクリプトログをきれいに保ちたい複雑なデプロイメントでは、まずワークスペースのリストを確認します。これにより、監視ツールに「Error」文字列が表示されるのを防ぎ、SREチームへの誤報を避けることができます。
#!/bin/bash
WORKSPACE="production"
リストから完全一致を検索
if terraform workspace list | grep -q "\b$WORKSPACE\b"; then echo "既存のワークスペースに切り替えています: $WORKSPACE" terraform workspace select "$WORKSPACE" else echo "新しいワークスペースを作成しています: $WORKSPACE" terraform workspace new "$WORKSPACE" fi
### オプション3:GitHub Actionsでの実装CI/CD環境では、`staging` や `prod` のような環境を定義するために変数を使用することがよくあります。以下は、YAMLワークフローで使用できる本番環境向けのコードスニペットです。
- name: Terraform Workspace Setup run: | terraform workspace select ${TF_ENV} || terraform workspace new ${TF_ENV} env: TF_ENV: production
## 検証:アクティブなコンテキストの確認修正を適用したら、現在のコンテキストを確認してください。誤って本番環境の変更をデフォルト(default)ワークスペースにデプロイしてしまわないよう、確認することを推奨します。
$ terraform workspace show production
また、`terraform workspace list` を実行して確認することもできます。アクティブなワークスペースにはアスタリスク(*)が表示され、正しい環境を対象としていることを確認できます。
## まとめTerraformがワークスペースがすでに存在すると警告する場合、それは単にステートが上書きされるのを防いでいるだけです。`select || new` パターンを使用することで、手動操作を必要とせず、初回セットアップと定期的な更新の両方に対応できる回復力の高い自動化を実現できます。

