AWS

TerraformでRDSインスタンスをimportしてみた

はじめに

こんにちは、ディーネットの牛山です。

久しぶりのブログ投稿となります。
Terraformのライセンス形態が MPL 2.0 (Mozilla Public License 2.0) から BSL (Business Source License) へ変更となり世間を賑わせました。

※前置きです本題は後に記載していますのでご注意ください。

ライセンスについて

真のオープンソースではなくなりましたが、Terraform バージョン 1.6 以前のライスセンス形態は永続的に MPL となりそのまま使い続けられます。

懸念として、サポート切れ等あるので最新バージョンを使うのが良いでしょう。

BSLライセンスでは、特定の条件下で使用が許諾され、HashiCorp製品を競合する製品に組み込んで提供しなければ引き続き使用が許可されます。


ここまでは、前置きです。
本題としては、Terraform v1.5.0で追加されたimportブロックを使用した既存リソースの取込みをやってみたという内容になります。

それでは、実際におこなってみましょう。

プロジェクトの準備

以下、過去記事より、「プロジェクト作成方法」を記載していますので、terraform init部分まで進めます。

また、一部、main.tf記述を以下へ修正します。

terraform {
    required_version = "1.5.0"
    required_providers {
      aws = {
          source = "hashicorp/aws"
          version = "~> 5.22.0"
      }
    }
}

variable "aws_access_key" {}
variable "aws_secret_key" {}
variable region {
  default     = "ap-northeast-1"
}

provider "aws" {
    access_key = var.aws_access_key
    secret_key = var.aws_secret_key
    region = var.region
}

RDSインスタンス作成

import元となるRDSインスタンスを事前に作成しておきます。
RDSインスタンス識別子は「terraform-import-rds」で作成しました。

※RDS作成は本題と外れますので省略しています。

importブロックを記述

プロジェクト直下で「rds.tf」内に以下を記述します。

import {
  to = aws_db_instance.test
  id = "terraform-import-rds"
}

terraform planを実行すると「インポートブロックターゲットが存在しません」となり、リソースの設定を自動生成したい場合、「terraform plan -generate-config-out=generated.tf」を実行することと出ますので実行しましょう。

※rds.tfは分かりやすい名前にしていますが、適当な名前でも構いません。

コマンド結果一部を抜粋。

aws_db_instance.test: Preparing import... [id=terraform-import-rds]
aws_db_instance.test: Refreshing state... [id=terraform-import-rds]

Terraform will perform the following actions:

  # aws_db_instance.test will be imported
  # (config will be generated)
    resource "aws_db_instance" "test" {
        address                               = "terraform-import-rds.cefaefyr6m5o.ap-northeast-1.rds.amazonaws.com"
        allocated_storage                     = 20
        arn                                   = "arn:aws:rds:ap-northeast-1:************:db:terraform-import-rds"
        auto_minor_version_upgrade            = true
        availability_zone                     = "ap-northeast-1d"
        backup_retention_period               = 0
        backup_target                         = "region"
・・・[中略]・・・
        username                              = "admin"
        vpc_security_group_ids                = [
            "sg-06fe2ff601b2b20d3",
        ]
    }

Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.
╷
x Warning: Config generation is experimental
x
x Generating configuration during import is currently experimental, and the generated configuration format may change in future versions.
╵

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

Terraform has generated configuration and written it to generated.tf. Please review the configuration and edit it as necessary before
adding it to version control.

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform
apply" now.

リソース確認

generated.tfファイルに対象RDSインスタンスのインフラ設定情報が自動生成され書き込まれています。

コマンドを実行した後にエラーが出ていなければ無事にimportが成功しています。

Terraform自身が正確に適用できるか保証できないため、「terraform apply」コマンドで「Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.」となり、正常に適用可能であることを確認します。

コマンド結果一部を抜粋。

・・・[中略]・・・
Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_db_instance.test: Importing... [id=terraform-import-rds]
aws_db_instance.test: Import complete [id=terraform-import-rds]

Apply complete! Resources: 1 imported, 0 added, 0 changed, 0 destroyed.

再度、applyを行うことで「No changes. Your infrastructure matches the configuration.」となり、AWS環境リソースと状態が一緒であることのメッセージが出ます。

おわりに

このimport機能は現環境の設定情報をハードコードしている状態になるため、一度、importしたリソースを削除するとapply時にエラーとなってしまうので注意です。

エラーを解消するには、importしたリソースでapply時のエラーをヒントにししらみつぶしにトライアンドエラーでapplyできるようにする必要があります。

もしくは、importしたリソースがTerraformリソースと依存していなければ記述を削除してしまっても良いかもしれません。

既存の環境を簡単にTerraformへ取り込むことが可能となり活用の幅が広がりました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA