terraformingとTerraformを使って、EC2をVPCからVPCへ移行を行う
コンニチーハ、千葉です。
とある理由で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
変更箇所
内容を確認したところ、UserData 、IAMロール 等、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へと移行する機会は少ないと思いますが、参考になれば嬉しいです。