既存AWS環境をTerraformで素早く複製する2019.08.262,541Kayu基幹クラウド運用保守AWSDevOpsTerraformこんにちは。皆さんあるある話だとは思いますが、最近複数の案件で既に構築済みのProduction環境からStaging環境をすぐ作って!PerformanceTest環境もよろしく!という話が多数ありました。プラットフォームはどれもAWSなので、最初からCloudFormationやTerraformでデプロイしてるからすぐできます!なら楽なのですが、実際のプロジェクトだとGUI、CLIで構築しているケースはまだまだ多く、パパっとデプロイできない・・・一からGUIで作るか・・・と地道な作業となることも。今後もさらに複製環境が増える場合や、一度作って削除してを繰り返す場合も考えられます。そこで、本記事ではインフラ構成管理ツールであるTerraform+terraformingでProduction環境をインポート、コード化して複製したStaging環境を提供してみます。実際に作業する前に少し用語の説明を。TerraformとはHashiCorp社が開発している、インフラ構成管理ツールです。ググればいろんな方が説明されているので、ポイントだけ。・構築するインフラの定義ファイル(.tfファイル)を記述していく。・定義ファイルを記述後、いざデプロイすると記述通りのインフラが出来上がる。・構築されたインフラの状態は、状態ファイル(tfstateファイル)に記述されている。terraformingとはdtan4さんがメンテナンスされている、Terraformの定義ファイル(.tfファイル)を自動で作成してくれるツールです。terraformingを使うのか実は、Terraformには公式で提供するimportというコマンドがあります。importコマンドを使うことで、既に構築済みのインフラをimportしTerraformの管理対象とすることが可能です。ここで問題なのが、importコマンドは定義ファイル(.tfファイル)を作成してくれないということです。importコマンドは状態ファイル(tfstateファイル)に現在の状態を記述してくれるのですが、そこから定義ファイルを作成する部分が手動になってしまいます。そこで、定義ファイルも自動で作成してくれるterraformingの出番!ということですね。事前準備Production環境の複製を始める前に、作業環境を整えます。Terraform、terraformingのインストールTerraformのパッケージマネージャーであるtfenvを使ってインストールします。今回はバージョン0.12.6をインストールしています。0.12.6terraformingをgemでインストールします。terraformingここで、作業ディレクトリも作成しておきます。Production環境とStaging環境でフォルダを分けました。Production環境のインポートを行うので、prodディレクトリに移動します。tfdemo/prodCredentialsの指定AWSのAPIをコールするため、Credentialsを環境変数にセットします。今回はAdministratorAccess権限をもったIAMユーザを使用しています。リージョンはフランクフルトを指定しました。AWS_DEFAULT_REGION=eu-central-1構築済みインフラ環境の確認インポート作業をする前に、インポートする環境(仮想のProduction環境)を構築しておきます。作業手順は割愛しますが、下記環境を構築しました。ALBでhttpsアクセスを受けてEC2上の静的コンテンツを返すだけのWebサイトです。SubnetのEC2にhttpでルーティングする構成になっています。ただのテキストですが、、アクセスするとこんなページが表示されます。Production環境のインポートそれでは、事前準備が終わりましたので、terraformingでProduction環境をインポートし、.tfファイルを作成します。初めにvpcを指定してインポートしてみます。terraformingでは以下のようにサービスを指定すると、リージョン内の情報を一括で定義ファイル(.tfファイル)形式で出力します。}}同じようにSubnetやSecurityGroupも定義ファイル化し、作業ディレクトリ配下はこのようになりました。vpc.tf上記で元となる.tfファイルの作成が完了しました。今回Production環境はTerraform管理下におかず、複製環境のみコード化します。Staging環境用のフォルダに上記ファイルを全てコピーします。stgStaging環境のデプロイStaging環境用に..tfファイルを修正し、Terraformでデプロイします。TFSTATEファイルの管理場所指定.tfファイルを修正する前に、tfstateファイルの管理場所を指定しておきます。tfstateファイルをローカル管理にしてしまうと、複数人で共有することができなくなります。そこで今回はS3バケットを指定しました。}}作業ディレクトリ直下に上記ファイルを作成後、以下コマンドを実行し、tfstateファイルの保管先を認識させます。表示されれば完了です。.tfファイルの修正terraformingで作成した.tfファイルは、Production環境の各リソースid等ユニークな値が入っています。そこで、それらを変数に修正しました。例としてsubnet.tfファイルを以下のように修正しています。}}他のリソースも同様に修正します。Staging環境のデプロイが完了すると同時に、stg-www.example.comへアクセスできるよう、route53.tfファイルでALIASレコードを追加しています。他の.tfファイルの修正が完了したら、デプロイする前に実行計画を確認します。createになっています。実行計画を確認しましたので、デプロイを実行します。destroyed.デプロイが無事完了しました!では、stg-www.example.comへアクセスしてみます。想定通り、ページが表示されました!デプロイするEC2のuserdataで、コンテンツを差し替えていたので、ページの内容もStaging環境用に変更されています。Subnet等も、もちろん自動で作成されています。今回デプロイしたStaging環境を図示すると、下記のようになります。赤枠部分がデプロイした箇所です。まとめTerraform+terraformingを使って既存のProduction環境からStaging環境をデプロイしました。複製する環境用に一から.tfファイルを書いてもよいのですが、terraformingを使うことで、.tfファイルの作成を短縮化しました。一度作成してしまえば、今後同様に他の環境を作りたい!となったときも、少し修正するだけですぐにデプロイできてしまいますね。実行すれば一式削除できますので、デプロイ&削除を繰り替えすような環境にも最適です。CDKを使えば自作できそうなので、今後検証してみます。関連サービス:クラウド・SAPシステム運用保守サービス日々変わり続けるクラウドの最新技術やトレンドを取り込み、貴社に最適な基幹クラウド向け運用保守サービスを提供します。Blogのエントリにご質問が御座いましたらお気軽にお問合せください。