Skip to main content

Terraformで手動変更によるドリフトを管理する3つのヒント

著者
Headshot of Stephane Jourdan

Stephane Jourdan

feature synk iac terraform magenta

2020年5月22日

0 分で読めます

編集者注: この記事は当初 CloudSkiff.comに掲載されました。 CloudSkiffは 2021年10月にSnykに加わりました。‹

Terraformで手動変更によるドリフトを管理するには、どうすればよいでしょうか?インフラに手動で変更が加えられた場合、Terraformではどのように対処し、次回のTerraform planをどう実行すればよいでしょうか。Terraformでインフラに加えられた手動変更によるドリフトを管理する方法は、状況によって異なります。

ここでは、3つの方法をご紹介します。

  • コードを手動で変更してStateを更新する

  • ツールを使って、既存環境からTerraformコードを生成する

  • Terraform importサブコマンドで、新しいコードの特定部分をインポートする

1. コードを手動で変更してStateを更新する

まずは例から始めるのが簡単です。たとえば、チームメンバーがセキュリティグループを手動で変更し、特定のサブネットにHTTPポートを開放したとします。そして次のterraform applyで、この変更に気づいたとしましょう。(これは簡単なケースです。)

この変更の後、(CI上でもノートパソコン上でも)terraform outputに差分が表示されます。この差分をコードのスニペットとしてTerraformコードに直接追加し、適用できます。つまり、デプロイ後にコードを手動で追加すればよいのです。次にterraform applyを実行すると、TerraformはStateにこの新しい項目(この例では、サブネットワークでHTTPを許可する設定)が含まれていないことを検知し、クラウドプロバイダー(たとえばAWS)に適用を要求します。するとAWSは「すでに設定されています」と応答します。

この簡単なケースでは、差分はTFstateファイルに表示されるだけなので、手動で解決できます。git mergeの競合を修正するのに少し似ています。

手順は次のとおりです。

  • 不足しているコードを書く

  • プッシュする

  • 適用する

  • 差分がなくなる

  • Stateファイルの最終状態が更新される

2. 既存環境からTerraformコードを生成する

VM全体、あるいはもっと複雑なケースとして、10,000ノードのKubernetes環境全体を手動で実行している場合などは、先ほどの簡単なケースのようにコードを手作業で書こうとは思わないでしょう。TerraformerやTerraformingのようなツールの利用をおすすめします。

この種のツールは、クラウドプロバイダーのアカウントをスキャンし、リソースやパラメーターを取得します。ツールがすべてのパラメーター(たとえばVMのハードディスク、IPアドレス、OSの種類など)を取得すると、それらを有効なTerraformコードに変換し、そのコードからTFStateを作成します。

Terraformerは、テルアビブにあるGoogleのWaze SREチームから生まれました。作業の約80%を実行してくれるため、あとは必要な箇所を少し調整するだけです。

このツールを使うと、次の3つが得られます。

  • 抽出したコード

  • 既存の手動デプロイ環境

  • Stateファイル

ここで問題になるのは、これらが既存のインフラリポジトリにまだ統合されていないことです。次に取り上げるのは、何をインポートするかを選ぶ方法です。

3. Terraform importサブコマンドで、新しいコードの特定部分をインポートする

コードを用意できたら、terraform importサブコマンドを使って、インポートする対象を細かく指定できます。

たとえば、古いロードバランサー用に特定のIPアドレスを手動で割り当てたとします。本番環境ではこのIPアドレスを維持する必要があり、Terraformで管理できるようにしたい場合、対応するTerraformコードを書き、AWS上の該当IDをインポートできます。

コードをプッシュして適用し、反映されるかどうかを確認するだけの場合とは、かなり異なります。コードが手元にあり、今実行すれば重複が発生するとわかっています。この例では、名前付きのIPアドレスが何百個も存在する可能性があるためです。前のセキュリティグループの例のように、80番ポートを1つだけ開けられるケースとは異なります。

この例では、Terraformerのようなインポートツールを使って、この特定のIPアドレスを定義し、既存のコードにコピー&ペーストします。そのコードを直接適用するのではなく、terraform importサブコマンドでインポートします。

terraform importコマンドの実行例を見てみましょう。

Terraformの`import --help`コマンドと使用可能なオプションを表示したターミナルのスクリーンショット。
`import --help`コマンド
Terraformのインポートに関するヘルプテキストと、既存のインフラをstateにインポートするコマンドが表示された、拡大されたターミナル画面。
拡大表示

Terraformで手動変更によるドリフトを管理するためのまとめ

状況に応じて、Terraformでインフラへの手動変更を管理するには、次の3つの方法がおすすめです。

  1. 再インポートが不要な小さな変更は、コードを書いて適用すれば、Stateファイルと自動的に整合します。

  2. Terraformerのようなツールを使って新しい環境をインポートし、Terraformコードを生成する。

  3. または、Terraform importサブコマンドを使って、必要な部分だけを手動でインポートする。

Terraformコードをセキュアに

Snyk IaCは、Terraformの設定(Kubernetes、CloudFormation、ARMテンプレートも対象)をコーディング中に保護し、修正方法もガイドします。安心してマージし、次の作業に進めます。記述しながらテストできるほか、gitリポジトリの変更を監視し、デプロイ前にビルドパイプラインでテストを自動化できます。無料プランなら数分で始められますが、IaCの設定ミスによる侵害は長く影響を及ぼす可能性があります。以下から登録して、設定の保護を始めましょう。設定ドリフトの検出と防止について、詳しくはこちらの記事をご覧ください。

ソースコードの段階からインフラを保護

Snykはワークフロー内のIaCセキュリティとコンプライアンスを自動化し、構成ドリフトや不足しているリソースを検出します。