[ AWS ] Terraform v0.7がリリースされたので、import 機能を試してみた

[ AWS ] Terraform v0.7がリリースされたので、import 機能を試してみた

はじめに

先日、Terraform のバージョン0.7 がリリースされました。

大きく分けて、4つの機能が実装されたのですが、個人的に注目していた、import 機能を利用して、
これまで Terraform 単体ではできなかった、既存AWSインフラリソースをコード化してterraformの管理下にしたいと思います。

注意事項

本記事は、検証環境下での手順内容となりますので万が一、事故やトラブル等があっても一切の責任を負いかねますので予めご了承下さい。
※バージョン0.7ではtfstateのみの生成で、tfファイルは生成されません。この状態で、 terraform apply を実行すると既存のリソースが削除される場合もあるので、取り扱いにはご注意ください。

Terraformとは

Vagrant , Packer 等、アプリケーションの開発・デプロイ・運用に関するツールを開発する HashiCorp社 が手がける、インフラ構築や設定をテンプレートファイルにコードを記述して、デプロイ等を自動で行ってくれるツールです。
自動で行うことで、オペレーションミスの撲滅や、作業の効率化が図れます。
また、テンプレートファイルは git 等のバージョン管理ツールを利用する事も可能です。

AWS / Azure / GCE / Azure / Docker 等、複数のプロバイダに対応しています。

Terraform by HashiCorp
GitHub – hashicorp/terraform

事前準備

  • AWSリソースの利用権限があるIAMアカウント
  • Terraform の動作環境( mac / Windows )

Terraformのインストール

筆者の環境では、既に mac 環境で利用していますので、brew コマンドにてアップデートします。
これからインストールする場合はコチラのページより、インストールが可能です。

$ brew upgrade terraform
$ terraform -v
Terraform v0.7.0

インストール後はクレデンシャル情報の設定が必要になりますので、 以前の記事をご参照ください。

EC2リソースのインポート

それでは、インポートを行って見ましょう。
以下のコマンドの末尾にインスタンスIDを入力します。
インスタンスIDが不明の場合は、マネジメントコンソール上から確認するか、AWS CLI上から確認を行ってください。

# terraform import ${リソース名} ${インスタンスID}

# terraform import aws_ec2-instance.dev i-0*******
aws_ec2-instance.dev: Importing from ID "i-0*******"...
aws_ec2-instance.dev: Import complete!
  Imported aws_instance (ID: i-0*******)
aws_ec2-instance.dev: Refreshing state... (ID: i-0*******)

Import success! The resources imported are shown above. These are
now in your Terraform state. Import does not currently generate
configuration, so you must do this next. If you do not create configuration
for the above resources, then the next `terraform plan` will mark
them for destruction.

インポートが成功しました。
カレントディレクトリ上に、 .tfstate ファイルが生成されています。

# ls
terraform.tfstate

EC2リソースの確認

生成された .tfstate ファイルの中身を確認してみます。
.tfstate ファイルは JSON形式でリソースを管理する形式となります。

# cat terraform.tfstate
{
    "version": 3,
    "terraform_version": "0.7.0",
    "serial": 0,
    "lineage": "0*******-f***-4***-9***-0**************",
    "modules": [
        {
            "path": [
                "root"
            ],
            "outputs": {},
            "resources": {
                "aws_ec2-instance.dev": {
                    "type": "aws_instance",
                    "primary": {
                        "id": "i-0*******",
                        "attributes": {
                            "ami": "ami-*******",
                            "availability_zone": "ap-southeast-1a",
                            "disable_api_termination": "false",
                            "ebs_block_device.#": "0",
                            "ebs_optimized": "false",
                            "ephemeral_block_device.#": "0",
                            "iam_instance_profile": "",
                            "id": "i-0*******",
                            "instance_state": "running",
                            "instance_type": "t2.micro",
                            "key_name": "dev_leaparrows",
                            "monitoring": "false",
                            "network_interface_id": "eni-*******",
                            "private_dns": "ip-10-10-**-**.ap-southeast-1.compute.internal",
                            "private_ip": "10.10.**.**",
                            "public_dns": "",
                            "public_ip": "**.**.**.**",
                            "root_block_device.#": "1",
                            "root_block_device.0.delete_on_termination": "true",
                            "root_block_device.0.iops": "100",
                            "root_block_device.0.volume_size": "20",
                            "root_block_device.0.volume_type": "gp2",
                            "security_groups.#": "0",
                            "source_dest_check": "true",
                            "subnet_id": "subnet-**********",
                            "tags.%": "1",
                            "tags.Name": "web-dev",
                            "tenancy": "default",
                            "vpc_security_group_ids.#": "1",
                            "vpc_security_group_ids.********": "sg-********"
                        },
                        "meta": {
                            "schema_version": "1"
                        }
                    },
                    "provider": "aws"
                }
            }
        }
    ]
}

JSON形式ではなく、可読性を良くするには、以下のコマンドを実行すると更に良くなります。

# terraform state show aws_ec2-instance.dev
id                                        = i-0*******
ami                                       = ami-*******
availability_zone                         = ap-southeast-1a
disable_api_termination                   = false
ebs_block_device.#                        = 0
ebs_optimized                             = false
ephemeral_block_device.#                  = 0
iam_instance_profile                      =
instance_state                            = running
instance_type                             = t2.micro
key_name                                  = dev_leaparrows
monitoring                                = false
network_interface_id                      = eni-*******
private_dns                               = ip-10-10-**-**.ap-southeast-1.compute.internal
private_ip                                = 10.10.**.**
public_dns                                =
public_ip                                 = **.**.**.**
root_block_device.#                       = 1
root_block_device.0.delete_on_termination = true
root_block_device.0.iops                  = 100
root_block_device.0.volume_size           = 20
root_block_device.0.volume_type           = gp2
security_groups.#                         = 0
source_dest_check                         = true
subnet_id                                 = subnet-**********
tags.%                                    = 1
tags.Name                                 = web-dev
tenancy                                   = default
vpc_security_group_ids.#                  = 1
vpc_security_group_ids.********           = sg-********

まとめ

Terraform で既存AWSリソースのインポートする事ができました。
現時点のバージョンでは、.tf ファイルが生成されないので、まだメンテナンスしやすい状態とは言えません。
.tf ファイルの生成にはサードパーティ製のツールを併用することが必要でしたが、次のバージョンでは .tf ファイルも生成してくれると、よりAWSリソースが管理しやすくなります。

現場からは以上です。

参考文献

Terraform 0.7 | HashiCorp
Import: Usage – Terraform by HashiCorp