Open2

terraform import

ChiHaRuChiHaRu

手順

1. バージョン確認

# バージョンが1.5以上であることを確認
$ terraform -v

2. importブロックの作成

importブロックを記載したtfファイルの作成を作成する
ファイル名は任意でよい

import.tf
import {
  to = aws_s3_bucket.xxx
  id = "bucketName"
}

import {
  to = lambda_function.xxx
  id = "lambdaFunctionName"
}

※1: bucketName, lambdaFunctionNameは、コンソールのS3バケット一覧/Lambda関数一覧より確認できる名称

※2: Lambdaの場合、後続の作業実施前にソースの取得元の設定が必要
以下のページ参照
https://oji-cloud.net/2024/04/14/post-8218/

3. generate-config-out

2で作成したimportブロックより、ソースコードを生成

# generate-config-outする → importブロックの内容をもとにgenerated.tfファイルが生成される
$ terraform plan -generate-config-out=generated.tf

4. AWSへデプロイ

(1) 作業ディレクトリから反映する場合

作業ディレクトリ(ルートディレクトリ)で反映する場合

①以下のコマンドを実行

$ terraform plan
$ terraform apply -auto-approve

→ importブロックにより、stateへのimportも実施される

②管理対象のstateに存在するか確認

$ terraform statelist | grep xxx
# 以下、出力結果
aws_lambda_function.xxx
aws_s3_bucket.xxx 

(2) 別ディレクトリから反映する場合

例えば、以下のような構成のmodule.hogeに属するリソースを作成する場合

module "hoge" {
  source = "../../modules"
  ・・(省略)・・
}

①importブロックのコメントアウト

別階層で使いたい場合エラーになるので、importブロックをコメントアウトしておく

※以下実際に発生したエラー
その1: importブロックを別ディレクトリに移動させ、コメントアウトせずそのままterraform planした結果

│ Error: Invalid import configuration
│
│   on ../../modules/import.tf line 1:
│    1: import {
│
│ An import block was detected in "module.hoge". Import blocks are only allowed in the root module.

その2: import.tfのみ作業ディレクトリにおいて、generate-config-outしてできたファイルをmodulesディレクトリに移動してterraform planした結果

Error: Configuration for import target does not exist
│
│   on import_1.tf line 14, in import:
│   14:   to = aws_lambda_function.xxx
│
│ The configuration for the given import target aws_lambda_function.xxx does not exist. If you wish to automatically generate
│ config for this resource, use the -generate-config-out option within terraform plan. Otherwise, make sure the target resource
│ exists within your configuration. For example:
│
│   terraform plan -generate-config-out=generated.tf

②terraform import
①の操作により、importブロックがなしになるので、代わりにterraform importする

$ terraform import module.hoge.aws_lambda_function.xxx lambdaFunctionName
$ terraform import module.hoge.aws_s3_bucket.xxx bucketName

③AWSへデプロイ

# generate-config-outで作成したファイルの移動
$ mv generated.tf ../../modules/
# AWSへデプロイ
$ terraform plan
$ terraform apply -auto-approve

④管理対象のstateに存在するか確認

$ terraform statelist | grep xxx
# 以下、出力結果
module.hoge.aws_lambda_function.xxx
module.hoge.aws_s3_bucket.xxx 

参考

https://developer.hashicorp.com/terraform/language/import/generating-configuration
https://qiita.com/curlneko/items/9faf4e016a03af19d412