5
4

More than 3 years have passed since last update.

初めてTerraform Import をやってみた!AWS/CloudFront

Posted at

Terraformとは

HashiCorp社が開発しているインフラストラクチャ定義ツールです。

詳しくはこちら↓
https://qiita.com/Chanmoro/items/55bf0da3aaf37dc26f73#terraform-%E3%81%A8%E3%81%AF

Terraform Importとは

Terraform Importを使うと、既にあるインフラリソースをTerraformにインポートできます。
他の方法で作成したリソースを、Terraformの管理下に置くことができます。

Terraform Import Command の使い方

Usage: terraform import [options] ADDRESS ID

2019/10/09 時点では、一度に1つのリソースのみをインポートできます。
例えば、AWS VPCなど、一つのくくりを対象に全部のリソースを一度にインポートすることはできないということです。
Terraformの将来のバージョンで改善される予定だそうです!

■ファイルの作成

まずはファイルを作成して、入れ物、枠だけ作って上げるイメージです。
ファイル名は instance.tf 等、リソースの種類毎にわけてつけてあげると、わかりやすいと思います!

resource "aws_instance" "example" {
}

■importコマンド使用例
リソースタイプ"aws_instance"、リソースネーム"example"に加えて、インポートしたいインスタンスのIDをつけることでインポートできます!

$ terraform import aws_instance.example i-abcd1234

stateファイルに、対象のリソースがインポートされます。
terraform plan を実行してコードとリソースの差分を確認して、手動でファイルを修正していきます。
実際にやってみたものをこれから紹介していきます!

Terraform ImportでCloudFrontのリソースをImportしてみた

terraform version:v0.12.7
provider aws version : ~> 2.14.0
投稿日:2019/10/09

これ以降は、terraformを利用している前提になります!

今回は下記のような既にあるCloudFrontのリソースをimportしていきたいと思います!
リソースネームとIDは適宜置き換えてください。

リソースタイプ:aws_cloudfront_distribution(CloudFront)
リソースネーム:example
CloudFrontのID:XXXXXXXXXXXXX

terraform import をとりあえず打ってみた

先程も書きましたが、まずはファイルを作成し、枠だけ書いておく必要があります。
エラーメッセージで言われている通りにファイルを作っていきましょう。

[terraform/envs/aws/workspace]
$ terraform import aws_cloudfront_distribution.example XXXXXXXXXXXXX
Error: resource address "aws_cloudfront_distribution.example" does not exist in the configuration.

Before importing this resource, please create its configuration in the root module. For example:

resource "aws_cloudfront_distribution" "example" {
  # (resource arguments)
}

ファイルを作成し、枠となる部分だけ書く

[terraform/envs/aws/workspace]
$ vim cloudfront_distribution.tf
[terraform/envs/aws/workspace]
$ cat cloudfront_distribution.tf
resource "aws_cloudfront_distribution" "example" {
  # (resource arguments)
}

改めてterraform import

[terraform/envs/aws/workspace]
$ terraform import aws_cloudfront_distribution.example XXXXXXXXXXXXX
aws_cloudfront_distribution.example: Importing from ID "XXXXXXXXXXXXX"...
aws_cloudfront_distribution.example: Import prepared!
  Prepared aws_cloudfront_distribution for import
aws_cloudfront_distribution.example: Refreshing state... [id=XXXXXXXXXXXXX]

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 plan で差分を確認

planを打ってみると、
requiredのblocksがいろいろない
enabledは必要
と言われました。

[terraform/envs/aws/workspace]
$ terraform plan

Error: Insufficient viewer_certificate blocks

  on  line 0:
  (source code not available)

At least 1 "viewer_certificate" blocks are required.


Error: Insufficient default_cache_behavior blocks

  on  line 0:
  (source code not available)

At least 1 "default_cache_behavior" blocks are required.


Error: Insufficient restrictions blocks

  on  line 0:
  (source code not available)

At least 1 "restrictions" blocks are required.


Error: Insufficient origin blocks

  on  line 0:
  (source code not available)

At least 1 "origin" blocks are required.


Error: Missing required argument

  on cloudfront_distribution.tf line 1, in resource "aws_cloudfront_distribution" "example":
   1: resource "aws_cloudfront_distribution" "example" {

The argument "enabled" is required, but no definition was found.

エラーメッセージに従って必須項目を用意

順番にやっていこうと思ったのでエラーメッセージで言われたもののみの作成にとどめてみました!

[terraform/envs/aws/workspace]
$ cat cloudfront_distribution.tf
resource "aws_cloudfront_distribution" "example" {
  # (resource arguments)

  enabled             = true

  origin {

  }


  default_cache_behavior {

  }

  restrictions {

  }

  viewer_certificate {

  }

}

terraform plan2回目

見ていくと、
blocksの中でblocksがまだ必要なパターンと、
The argumentで必要なものがあるパターンが出てきました。

[/terraform/envs/aws/workspace]
$ terraform plan

Error: Insufficient geo_restriction blocks

  on  line 0:
  (source code not available)

At least 1 "geo_restriction" blocks are required.


Error: Insufficient forwarded_values blocks

  on  line 0:
  (source code not available)

At least 1 "forwarded_values" blocks are required.


Error: Missing required argument

  on cloudfront_distribution.tf line 6, in resource "aws_cloudfront_distribution" "example":
   6:   origin {

The argument "domain_name" is required, but no definition was found.


Error: Missing required argument

  on cloudfront_distribution.tf line 6, in resource "aws_cloudfront_distribution" "example":
   6:   origin {

The argument "origin_id" is required, but no definition was found.


Error: Missing required argument

  on cloudfront_distribution.tf line 17, in resource "aws_cloudfront_distribution" "example":
  17:   default_cache_behavior {

The argument "cached_methods" is required, but no definition was found.


Error: Missing required argument

  on cloudfront_distribution.tf line 17, in resource "aws_cloudfront_distribution" "example":
  17:   default_cache_behavior {

The argument "viewer_protocol_policy" is required, but no definition was
found.


Error: Missing required argument

  on cloudfront_distribution.tf line 17, in resource "aws_cloudfront_distribution" "example":
  17:   default_cache_behavior {

The argument "allowed_methods" is required, but no definition was found.


Error: Missing required argument

  on cloudfront_distribution.tf line 17, in resource "aws_cloudfront_distribution" "example":
  17:   default_cache_behavior {

The argument "target_origin_id" is required, but no definition was found.


このような感じの繰り返しになります!

terraform plan → エラーメッセージを読む → エラーで言われた通りにファイルに記述

この手順を繰り返して、既にあるインフラリソースとコードを同じ状態にしていきます。

まとめ

①枠だけつくる。
②importする。
③plan error 記述 の繰り返し

import機能は現時点でめちゃめちゃ便利!とは言い難いです。エラーメッセージもたくさんみるし、地道な修正作業を繰り返すことになります。
しかし、逆に言えばエラーメッセージさえ読めれば、怖くないと思うので、まだコード化できていないインフラリソースがある人は是非やってみてください!
やってみると、当初の想像より、かなり単純な作業に感じました!

最後までお読みいただきありがとうございました!

参考リンク

Terraformはupdateを活発にしてくれるので、公式の情報をしっかり追うようにしましょう!

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4