Google社が既存環境からTerraform
のtfファイルを生成するTerrafomer
という名前のツールを開発/公開しています↓
■GitHub - GoogleCloudPlatform/terraformer
https://github.com/GoogleCloudPlatform/terraformer
なんと、このTerrafomer
は、Google社が開発していますが、GCPだけではなくAWSなどの他クラウドにも対応しています。
今回、このTerraformer
を使用して既存のAWS環境を『Infrastructure as Code(IaC)』化してみたので、その際の内容を自分用のメモとしてまとめました。
実行環境の環境情報
OS/ソフトウェア | バージョン | 入手元 |
---|---|---|
Windows 10 pro | バージョン1803(April 2018 Update) | Microsoft Corporation |
aws-cli | 1.16.200 | https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html |
Go | 1.12.7 | https://golang.org/dl/ |
terraform | v0.12.6-dev | https://github.com/hashicorp/terraform |
terraformer | version v0.7.6 | https://github.com/GoogleCloudPlatform/terraformer |
1.事前準備
□手順 1-1: aws-cli
のインストール
AWS環境を対象にTerraformer
を実行するためにはaws-cli
をインストールしておく必要があります。
ここでは、aws-cli
のインストール手順は割愛しますが、管理者権限を持たないWindows環境にaws-cli
をインストール手順については↓に記載していますので参考にしてください。
[【#awscli】管理者権限を持たないWindows環境に「AWSコマンドラインインターフェイス(aws-cli)」をインストールする #AWS #jawsug #環境構築 #環境設定]
(https://qiita.com/kukita/items/6f19025ba9fea29f281c)
□手順 1-2: Go
のインストール
Terraformer
をインストールするためにGo
をインストールします。
ここでは、Go
のインストール手順は割愛しますが、管理者権限を持たないWindows環境にGo
をインストール手順については↓に記載していますので参考にしてください。
□手順 1-3: aws configure
コマンドを実行して認証情報などを記録させます
PS C:\> & aws configure
拡張子 .py のファイルの関連付けが見つかりません
AWS Access Key ID [None]: <My AWS Access Key>
AWS Secret Access Key [None]: <AWS Secret Access Key>
Default region name [None]: ap-northeast-1
Default output format [None]: json
--profile
オプションを付与することでプロファイルの作成も可能です
デフォルトのプロファイルには読み取り権限のみをもったアカウントを登録しておき変更可能な権限はDevOps
、Developers
などのプロファイルに紐付けておけば誤った変更などを避けられるので安全です
PS C:\> & aws configure --profile DevOps
拡張子 .py のファイルの関連付けが見つかりません
AWS Access Key ID [None]: <My AWS Access Key>
AWS Secret Access Key [None]: <AWS Secret Access Key>
Default region name [None]: ap-northeast-1
Default output format [None]: json
□手順 1-4: まずは go get
コマンドを使ってTerraform
をインストールします
PS C:\> & go get -v -u github.com/hashicorp/terraform
PS C:\> & terraform --version
Terraform v0.12.6-dev
□手順 1-5: 同様にgo get
コマンドを使ってTerraformer
をインストールします
PS C:\> & go get -v -u github.com/GoogleCloudPlatform/terraformer
PS C:\> & terraformer --version
version v0.7.6
2. Terraformer
による既存のAWS環境からのtfファイルの生成
□手順 2-1: tfファイルを生成するための作業フォルダを作成します(ここではMyAWSTerraformManifests
という名前のフォルダを使用します)
PS C:\> New-Item -ItemType Directory -Path $env:GOPATH\src\MyAWSTerraformManifests
ディレクトリ: C:\Users\xxxxxx\gocode\src
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- YYYY/MM/DD hh:mm MyAWSTerraformManifests
□手順 2-2: 任意のテキストエディタでinit.tf
ファイルを作成します
provider "aws" {
region = "ap-northeast-1"
}
□手順 2-3: terraform init
コマンドを実行します
次のように表示されれば成功です
PS C:\> cd $env:GOPATH\src\MyAWSTerraformManifests
PS C:\> & terraform init
Initializing provider plugins...
- Checking for available provider plugins on https://releases.hashicorp.com...
- Downloading plugin for provider "aws" (2.21.0)...
The following providers do not have any version constraints in configuration,
so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.
* provider.aws: version = "~> 2.21"
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
□手順 2-4: terraformer import aws ~
を実行します
terraformer import aws --regions=ap-northeast-1 --resources=ec2_instance
terraformer import aws --regions=ap-northeast-1 --resources=elb
terraformer import aws --regions=ap-northeast-1 --resources=iam
terraformer import aws --regions=ap-northeast-1 --resources=rds
terraformer import aws --regions=ap-northeast-1 --resources=route53
terraformer import aws --regions=ap-northeast-1 --resources=s3
terraformer import aws --regions=ap-northeast-1 --resources=sg
terraformer import aws --regions=ap-northeast-1 --resources=subnet
terraformer import aws --regions=ap-northeast-1 --resources=vpc
terraformer import aws --regions=ap-northeast-1 --resources=vpn_connection
terraformer import aws --regions=ap-northeast-1 --resources=vpn_gateway
□手順 2-5: generated
というフォルダ下に各種tfファイルが生成されます
PS C:> & tree /F
フォルダー パスの一覧: ボリューム Local Disk
ボリューム シリアル番号は XXXX-XXXX です
C:.
│ init.tf
│
├─.terraform
│ └─plugins
│ └─windows_amd64
│ lock.json
│ terraform-provider-aws_v2.20.0_x4.exe
│
└─generated
└─aws
├─ec2_instance
│ └─ap-northeast-1
│ instance.tf
│ outputs.tf
│ provider.tf
│ terraform.tfstate
│ variables.tf
│
├─elb
│ └─ap-northeast-1
│ elb.tf
│ outputs.tf
│ provider.tf
│ terraform.tfstate
│ variables.tf
│
├─iam
│ └─ap-northeast-1
│ iam_group.tf
│ iam_group_membership.tf
│ iam_policy.tf
│ iam_policy_attachment.tf
│ iam_role_policy.tf
│ iam_user.tf
│ outputs.tf
│ provider.tf
│ terraform.tfstate
│
├─rds
│ └─ap-northeast-1
│ db_instance.tf
│ db_option_group.tf
│ db_parameter_group.tf
│ db_subnet_group.tf
│ outputs.tf
│ provider.tf
│ terraform.tfstate
│ variables.tf
│
├─route53
│ └─ap-northeast-1
│ outputs.tf
│ provider.tf
│ route53_record.tf
│ route53_zone.tf
│ terraform.tfstate
│
├─s3
│ └─ap-northeast-1
│ outputs.tf
│ provider.tf
│ s3_bucket.tf
│ s3_bucket_policy.tf
│ terraform.tfstate
│
├─sg
│ └─ap-northeast-1
│ outputs.tf
│ provider.tf
│ security_group.tf
│ terraform.tfstate
│
├─subnet
│ └─ap-northeast-1
│ outputs.tf
│ provider.tf
│ subnet.tf
│ terraform.tfstate
│ variables.tf
│
├─vpc
│ └─ap-northeast-1
│ outputs.tf
│ provider.tf
│ terraform.tfstate
│ vpc.tf
│
├─vpn_connection
│ └─ap-northeast-1
│ outputs.tf
│ provider.tf
│ terraform.tfstate
│ variables.tf
│ vpn_connection.tf
│
└─vpn_gateway
└─ap-northeast-1
outputs.tf
provider.tf
terraform.tfstate
variables.tf
vpn_gateway.tf
3. 生成した tfファイルを HCL2 にアップグレードします
現時点のTerraformer
の最新バージョンv0.7.6
が生成するtfファイルは、Terraform 0.12
以降採用されたHCL2
に対応していないため、手動でアップグレードを行う必要があります
3-1. terraform 0.12upgrade
コマンドの実行
Get-ChildItem -Path ".\generated\aws\" | %{$path = $_.FullName + "\ap-northeast-1\"; echo $path; & terraform 0.12upgrade -yes -force $path}
3-2. terraform validate
コマンドによる確認
Get-ChildItem -Path ".\generated\aws\" | %{$path = $_.FullName + "\ap-northeast-1\"; echo $path; & terraform validate $path}
私の環境ではterraform validate
コマンドを実行した結果いくつかエラーが出力されてしまいました。Terraformer
側に未だいくつかの不具合があるようで、ある程度は手動で修正を行う必要がありそうです。
以上、Terraformer
を使用して既存のAWS環境からTerraform
のtfファイルを生成する手順でした。