【Terraform】terraform importコマンドで既存の環境との差分を取り込む手順

まっさらな状態でゼロから Terraform で構築するならいいですが、大体は途中から Terraform を使用することになると思います。

また、Terraform を導入した初期段階では Terraform に慣れてなくて、取り急ぎ AWS 管理コンソールから手動で構築してしまうこともあると思います。

障害対応時に Terraform のソースコードを書いて動作検証をしてデプロイしてなどとやっている余裕はありません。

しかし落ち着いた後に現在のリソースの状態を Terraform に取り込む必要あります。

 

Terraform の場合は terraform import コマンドがあり、このコマンドを実行することで手動で構築した環境を Terraform で管理されている tfstate ファイルに手動で構築した設定をインポートして、以後 Terraform で管理されるようになります。

 

今回は terraform import コマンドを使用してインポートする手順について解説します。

環境は AWS で実施します。

 

 

全体の作業の流れ

全体の作業の流れは以下のようになります。

 

障害対応などで手動でリソースを追加した場合

  1. 障害や何かのイベントが発生して手動で設定を入れる。
  2. .tf ファイルに手動で追加したリソースを追加する。
  3. terraform import コマンドを実行し tfstate に反映させる。
  4. terraform plan を実行し差分が吸収されていることを確認する。

 

原因不明であるが実際のリソースと tfstate ファイルに差分が発生した場合

原因不明であるが実際のリソースと tfstate ファイルに差分が発生した場合もありますが、こちらは正直判断に困ります。

実際のリソースが正しい場合は、誤って実際のリソースを変更してしまった場合があるからです。

CloudTrail で調査していつ誰が変更したのか確認できればいいですが、すべてを把握することは不可能です。

しかし実際のリソースと tfstate ファイルに差分が発生した場合(実際のリソースと Terraform で管理している構成情報が異なる場合)で、実際のリソースを「正」として Terraform に取り込む場合は以下のようになります。

 

  1. terraform plan を実行すると差分(.tf に記述していない)が発生していることを確認する。
  2. 実際のリソースと .tf ファイルを比較し、terraform で管理しているリソースに手動で変更が加わっていることを確認する。
  3. 実際のリソースを .tf ファイルに反映させる
  4. terraform import で tfstate に反映させる。
  5. terraform plan を実行し実際のリソースと差分がなくなったことを確認する

いずれも「terraform plan」を実行して差分がない状態に持っていくことがゴールとなります。

 

 

AWS 管理画面などから手動でリソースを新規追加した場合

今まで存在していないリソースが手動で追加された状態で Terraform の管理下に入っていない状態です。

その場合は、最低限の .tf ファイルを作成して terraform import コマンドを実行し tfstate ファイルを見ながら .tf ファイルに反映していくという作業が必要になります。

 

 

■terraform importコマンド

$ terraform import [tfファイルのtypeとName] [対象リソース]

 

 

【例】Redshift Serverless をインポートする

例として Redshift Serverless を手動で作成した後に Terraform にインポートします。

 

■Redshift Serverless 用の tf ファイルを作成する

手動で作成した Redshift Serverless のネームスペース名が「demo-redshift」とします。

$ vi redshift_serverless.tf
resource “aws_redshiftserverless_namespace” “redshiftserverless” {
  namespace_name = “demo-redshift”
}

 

 

 

■terraform import コマンドを実行する

terraform import aws_redshiftserverless_namespace.redshiftserverless demo-redshift 
aws_redshiftserverless_namespace.redshiftserverless: Importing from ID “demo-redshift”… 
aws_redshiftserverless_namespace.redshiftserverless: Import prepared! 
  Prepared aws_redshiftserverless_namespace for import 
aws_redshiftserverless_namespace.redshiftserverless: Refreshing state… [id=demo-redshift] 
 
Import successful! 
 
The resources that were imported are shown above. These resources are now in 
your Terraform state and will henceforth be managed by Terraform. 

 

 

terraform import コマンドを実行すると tfstate ファイルが作成されます。

 

次に tfstate ファイルの中身を確認しながら tf ファイルを作り上げます。

 

■terraform.tfstate ファイルの中身


  “version”: 4, 
  “terraform_version”: “1.2.5”, 
  “serial”: 0, 
  “lineage”: “xxxxxxxxxxxxxxxxxx”, 
  “outputs”: {}, 
  “resources”: [ 
    { 
      “mode”: “managed”, 
      “type”: “aws_redshiftserverless_namespace”, 
      “name”: “redshiftserverless”, 
      “provider”: “provider[\”registry.terraform.io/hashicorp/aws\”]”, 
      “instances”: [ 
        { 
          “schema_version”: 0, 
          “attributes”: { 
            “admin_user_password”: null, 
            “admin_username”: “admin”, 
            “arn”: “arn:aws:redshift-serverless:ap-northeast-1:xxxxxxxxxxx:namespace/xxxxxxxxxxxxxxxxx”, 
            “db_name”: “test”, 
            “default_iam_role_arn”: “”, 
            “iam_roles”: [], 
            “id”: “demo-redshift”, 
            “kms_key_id”: “AWS_OWNED_KMS_KEY”, 
            “log_exports”: [ 
              “connectionlog”, 
              “useractivitylog”, 
              “userlog” 
            ], 
            “namespace_id”: “xxxxxxxxxxxxxxxxx”, 
            “namespace_name”: “demo-redshift”, 
            “tags”: {}, 
            “tags_all”: {} 
          }, 
          “sensitive_attributes”: [], 
          “private”: “xxxxxxxxxxxxxxx==” 
        } 
      ] 
    } 
  ] 

 

上記 tfstate ファイルを見て tf ファイルにない設定を tf ファイルに取り込んでいって最終的に terraform plan コマンドを実行した際に「No Changed」になるようにします。

 

 

 

■redshift_serverless.tfファイル

cat redshift_serverless.tf  
resource “aws_redshiftserverless_namespace” “redshiftserverless” { 
  namespace_name = “demo-redshift” 
  admin_username = “admin” 
  db_name        = “test” 
  log_exports    = [ 
          “connectionlog”, 
          “useractivitylog”, 
          “userlog”, 
        ] 

 

 

上記のように tfstate ファイルを参考に tf ファイルに設定を入れたら「terraform plan」コマンドを実行します。

 

 

■terraform plan コマンドを実行する

$ terraform plan
aws_redshiftserverless_namespace.redshiftserverless: Refreshing state… [id=demo-redshift]

 

No changes. Your infrastructure matches the configuration.

 

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.

 

 

以上で説明した環境では一発で「No changes.」になりましたが、実際には何度も tf ファイルを修正しては「terraform plan」コマンドを実行して差分を見つけては tf ファイルを修正して、ということを繰り返していっちさせt

 

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

AlphaOmega Captcha Medica  –  What Do You See?
     
 

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください