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を活発にしてくれるので、公式の情報をしっかり追うようにしましょう!