terraformingとTerraformを使って、EC2をVPCからVPCへ移行を行う

2016.08.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチーハ、千葉です。

とある理由でVPCからVPCへ移行する機会がありました。セキュリティーグループは、piculet、Route53はroadworkerを利用しました。どちらのツールも、現在の構成をファイルにエクスポートでき、それを元にファイルを修正することで、かなりの工数削減 & 品質向上を行うことができました。

で、EC2はどうしようかなーと悩みましたが、terraformingで現在の構成をエクスポートし、Terraformでプロビジョニングすることにしました!!実践してみたのでブログを書いてみます。

そもそもTerraformとは?は、こちらの記事がとても分かりやすいです!AWSでTerraformに入門

インストール

terraformingのインストール

terraformingをインストールします。

ruby 2.1以上が必要です。私は、ruby 2.2で試しました。

$ ruby --version
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin15]

terraformingをインストールします。

$ gem install terafforming

AWSのクレデンシャルを登録します。今回は~/.aws/credentialsではなく、環境変数に設定しました。

export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_REGION=ap-northeast-1

Terraformのインストール

mac環境なので以下でインストールしました。

$ brew cask install terraform
$ terraform --version
Terraform v0.7.0

terraformingで構成情報をエクスポート

インストールが完了したので、現在のEC2構成情報をエクスポートします。形式は、Terraform独自の.tfとして出力されます。なので、基本的にはterraformingで出力される.tfファイルに対し、VPCやサブネットの情報を移行先VPCに変更するだけで構成ファイルを作成できます。

$ terraforming ec2 > ec2.tf
$ terraforming eip >> ec2 .tf

変更箇所

内容を確認したところ、UserDataIAMロール 等、terraformingで対応していないようでしたので、別途追加する必要がありそうです。

今回の私の環境(VPC作成済み、EIP割り当て済み)では、ハイライトしている箇所を修正しました。amiには移行元で取得したAMI IDを指定します。その他、VPCやEIPに関するパラメータを修正しています。また、root_block_deviceの項目自体を削除しています(gp2に対しiopsを指定しているためエラーになりました)。

resource "aws_instance" "terminal" {
    ami                         = "ami-XXXXXXXX"
    availability_zone           = "ap-northeast-1a"
    ebs_optimized               = false
    instance_type               = "t2.small"
    monitoring                  = false
    key_name                    = "chiba-key"
    subnet_id                   = "subnet-XXXXXXXX"
    vpc_security_group_ids      = ["sg-XXXXXXXX"]
    associate_public_ip_address = true
    private_ip                  = "xx.xx.xx.xx.xx"
    iam_instance_profile        = "xxx"
    source_dest_check           = true

#    root_block_device {
#        volume_type           = "gp2"
#        volume_size           = 30
#        iops                  = 100
#        delete_on_termination = true
#    }

    tags {
        "Name" = "terminal"
    }
}

resource "aws_eip_association" "eip_terminal" {
  instance_id = "${aws_instance.terminal.id}"
  allocation_id = "eipalloc-XXXXXXXX"
}

移行先のVPCでEC2を起動する

移行先のVPC、EIPの作成は事前に作成していることを前提としています。

それでは、EC2を起動してみます。terraform planで、反映内容を確認後に反映を実行します。

$ terraform plan
$ terraform apply

これで、EC2が新しいVPCで起動しています。

注意点ですが、LinuxはAMI作成時に、ホスト名や言語、タイムゾーンがcloud-initにより初期化されます。初期化したくない場合は、/etc/cloud/cloud.cfgの以下の項目をコメントアウトするといいかと思います。

  • set_hostname
  • update_hostname
  • sers-groups
  • ssh
  • locale

最後に

CloudFormationの場合は、CloudFormer(https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-using-cloudformer.html)にて現在の構成をエクスポートできますが、今回はterraforming + Terraformで行ってみました。Terraform、移行対象のEC2が多くても、シンプルに利用できていいなと思いました。

VPCからVPCへと移行する機会は少ないと思いますが、参考になれば嬉しいです。

参考