(1時間4,000円の伴走型ビデオチャット指導も受付中!)
Pythonでインフラを管理する:CDK for Terraform(CDKTF)入門
![]()
【Hiroki】
Yukiさん、こんにちは。最近「IaC(Infrastructure as Code)」という言葉をよく耳にするようになったのですが、その中でも「Terraform」をPythonで扱える仕組みがあるって本当ですか?
![]()
【Yuki】
Hirokiくん、こんにちは。……はい、本当ですよ。一般的にTerraformは「HCL」という独自の言語を使いますが、Pythonなどのプログラミング言語を使ってインフラを構成できる「CDK for Terraform(CDKTF)」というツールがあるんです。
![]()
【Hiroki】
へぇ、Pythonでインフラが作れるんですね!でも、そもそもTerraformがどういうものなのか、あまり詳しくなくて……。
![]()
【Yuki】
そうですよね、まずはそこからお話ししたほうがいいかもしれません。Terraformは、クラウド上のサーバーやネットワークなどの設定を「コード」として記述して、自動で作成・管理するためのツールなんです。わたしも、誰かの役に立つために開発された小さなツールのお話を聞くと、なんだか少しだけ、自分も誰かの体の一部になれたような気がして……好きなんです。このTerraformも、エンジニアの皆さんの負担を減らすために生まれた、とても優しいツールだと思います。
![]()
【Hiroki】
なるほど、「誰かのために」という視点は素敵ですね。Pythonで扱えるようになると、どんなメリットがあるんでしょうか?
![]()
【Yuki】
はい。通常のTerraform(HCL)も素晴らしいのですが、Pythonを使うことで、普段使い慣れているループ(for文)や条件分岐(if文)がそのまま使えたり、エディタの強力な補完機能の恩恵を受けられたりするんです。これから、具体的な仕組みについて、わたしと一緒に見ていきましょう。
そもそもTerraformとは何でしょうか?
![]()
【Yuki】
Terraformは、HashiCorp社が提供しているオープンソースのインフラ構成管理ツールです。AWS(Amazon Web Services)やGoogle Cloud、Azureといったクラウドサービスの操作を、ブラウザの管理画面をポチポチ操作するのではなく、宣言的な設定ファイルで行うことができます。
![]()
【Hiroki】
「宣言的」……ですか?
![]()
【Yuki】
ええ。例えば「サーバーを1台作って、次にOSをインストールして……」という手順を書くのではなく、「最終的にこのスペックのサーバーが1台ある状態にしてください」という「完成図」を記述するスタイルなんです。Terraformが現在の状況と完成図を比較して、足りない部分だけを自動で補ってくれるんですよ……便利だと思いませんか?
![]()
【Hiroki】
手順を指示するんじゃなくて、ゴールを教えるだけなんですね。それなら間違いも少なそうです。
![]()
【Yuki】
そうですね。ただ、標準の言語であるHCLは、プログラミング言語というよりは「設定ファイル」に近い性質を持っています。そのため、複雑なロジックを組もうとすると少し工夫が必要になることもあるんです。
![]()
【Hiroki】
そこでPythonの出番、というわけですね!
なぜPythonでTerraformを使う必要があるのでしょうか?
![]()
【Yuki】
はい。PythonでTerraformを扱うための仕組みが、先ほどお話ししたCDK for Terraform(CDKTF)です。これを使うメリットは、大きく分けて3つあると思います。
![]()
【Yuki】
1つ目は、「慣れ親しんだ言語が使えること」です。HirokiくんのようにPythonを学んでいる方なら、新しい言語を覚え直さなくても、いつもの書き方でインフラを定義できます。
![]()
【Yuki】
2つ目は、「強力な抽象化」です。共通の設定をクラス(Class)として定義して再利用したり、他のPythonライブラリと組み合わせて、例えば「外部のAPIから値を取得して、それを元にインフラを作る」といった高度なことも比較的簡単にできます。
![]()
【Yuki】
3つ目は、「テストのしやすさ」かもしれません。Pythonには豊富なテストフレームワークがありますから、作成したインフラの定義が正しいかどうかを、コードとしてテストすることが可能なんです。
![]()
【Hiroki】
インフラの構成もPythonのプログラムの一部として扱えるようになる、というイメージですね。
CDKTF(CDK for Terraform)の仕組み
![]()
【Yuki】
仕組みについても少しだけ触れておきますね。CDKTFは、内部的に「jsii」という技術を使っています。これによって、Pythonで書かれたコードが最終的にTerraformが理解できるJSON形式の設定ファイルに変換(シンセサイズ)される仕組みになっているんです。
![]()
【Hiroki】
中身は結局Terraformが動いているんですね。
![]()
【Yuki】
はい、その通りです。Terraformの「プロバイダー」というエコシステムをそのまま利用できるので、AWSだけでなく、GitHubの設定やDatadogの監視設定など、数多くのサービスを操作できるんですよ。
開発環境を整えてみましょう
![]()
【Yuki】
実際に動かしてみるのが一番分かりやすいと思うので、準備の手順を説明しますね。少し手順が多いですが、ゆっくり進めていきましょう。
![]()
【Yuki】
まず、必要なものは以下の通りです。
1. Node.js(CDKTF自体がNode.jsで動いているためです。16.x以上が必要です)
2. Python 3.7以上
3. Terraform CLI(本体ですね)
4. cdktf-cli(CDKTFを操作するためのツールです)
![]()
【Hiroki】
Node.jsも必要なんですね。ちょっと意外です。
![]()
【Yuki】
そうなんです、ちょっと複雑ですよね……。まずは、cdktf-cliをインストールするところから始めます。ターミナルで以下のコマンドを実行してみてください。
npm install --global cdktf-cli@latest
![]()
【Yuki】
次に、作業用のディレクトリを作って、Pythonプロジェクトとして初期化します。
mkdir my-terraform-project
cd my-terraform-project
cdktf init --template=python --local
![]()
【Hiroki】
cdktf initを実行したら、たくさんファイルが出てきました!
![]()
【Yuki】
はい、プロジェクトの雛形が作成されました。特に大事なのは main.py というファイルです。ここに、Pythonでインフラの定義を書いていくことになります。
実際にPythonでコードを書いてみる
![]()
【Yuki】
では、例としてAWSに「S3バケット」という、ファイルを保存するための場所を作ってみましょう。まずはAWS用のライブラリをインストールする必要がありますね。
cdktf provider add aws
![]()
【Yuki】
これを実行すると、AWSを操作するためのPythonクラスが生成されます。準備ができたら、main.pyを以下のように書き換えてみてください。
#!/usr/bin/env python
from constructs import Construct
from cdktf import App, TerraformStack
from cdktf_cdktf_provider_aws.provider import AwsProvider
from cdktf_cdktf_provider_aws.s3_bucket import S3Bucket
class MyStack(TerraformStack):
def __init__(self, scope: Construct, id: str):
super().__init__(scope, id)
# AWSプロバイダーの設定(リージョンを東京に指定)
AwsProvider(self, "AWS", region="ap-northeast-1")
# S3バケットの定義
S3Bucket(
self,
"MyFirstBucket",
bucket="yuki-sample-bucket-202310", # 世界で唯一の名前である必要があります
)
app = App()
MyStack(app, "python-terraform")
app.synth()
![]()
【Hiroki】
おお、本当に普通のPythonコードですね!S3Bucketというクラスをインスタンス化するだけでいいんだ。
![]()
【Yuki】
はい。このコードは「東京リージョンに yuki-sample-bucket-202310 という名前のS3バケットを1つ用意してください」というお願いを書いていることになります。
コードの実行とデプロイの流れ
![]()
【Hiroki】
このコードを書いた後は、どうやってクラウドに反映させるんですか?
![]()
【Yuki】
いい質問ですね。手順は主に3つのステップに分かれています。
![]()
【Yuki】
1つ目は cdktf diff です。これを実行すると、「現在のクラウドの状態」と「今書いたコードの状態」の差分を表示してくれます。いきなり実行するのではなく、何が起きるかを確認するのが大切なんです……。
![]()
【Hiroki】
いきなり作っちゃって、後で「あ、間違えた!」ってなるのは怖いですもんね。
![]()
【Yuki】
ええ、わたしも失敗すると、しばらく落ち込んでしまうので……。事前の確認はとても大事だと思います。
![]()
【Yuki】
2つ目は cdktf deploy です。差分に問題がなければ、このコマンドで実際にクラウドへ設定を反映させます。実行時に確認を求められるので、yesと入力すると作成が始まりますよ。
![]()
【Yuki】
3つ目は cdktf destroy です。実験が終わって、作ったものを片付けたい時に使います。クラウドはお金がかかってしまうこともあるので、使わないものはこまめに消しておくのがいいかもしれません。
![]()
【Hiroki】
deployで作って、destroyで片付ける。流れがシンプルで分かりやすいです!
CDKTFを使う上での注意点
![]()
【Yuki】
とても便利なCDKTFですが、少しだけ気をつけておいたほうがいいこともあります。
![]()
【Yuki】
まず、比較的新しいツールなので、インターネット上の情報は標準の「HCL」で書かれたものの方が多いです。何かわからないことがあった時に、HCLのコードをPythonに読み替える力が必要になることもあるかもしれません。
![]()
【Hiroki】
なるほど。標準のTerraformの知識も、全く不要というわけではないんですね。
![]()
【Yuki】
はい、基礎を知っておくことは大切だと思います。それから、先ほどお話ししたようにNode.jsとPythonの両方が環境に必要なので、セットアップが少しだけ煩雑に感じるかもしれませんね。
まとめ
![]()
【Yuki】
今日はPythonでTerraformを扱う「CDKTF」についてお話ししました。簡単に振り返ってみましょうか。
- Terraformは、インフラをコードで管理するためのツール
- CDKTFを使えば、Pythonの文法でインフラを定義できる
- 宣言的な記述なので、手順ではなく「あるべき姿」を書けばいい
cdktf diffで確認、deployで反映、destroyで削除
![]()
【Hiroki】
ありがとうございます!Pythonならプログラミングの勉強をしながらインフラも学べるので、一石二鳥な気がしてきました。
![]()
【Yuki】
そう言ってもらえると嬉しいです。複雑なネットワークやデータベースの設定も、Pythonのコードなら整理して書きやすいと思います。Hirokiくんのペースで、少しずつ触れてみてくださいね。
![]()
【Yuki】
もし興味が湧いたら、こちらの公式サイトなども参考にしてみてください。
CDK for Terraform - HashiCorp
CDKTF Python Example - GitHub
![]()
【Hiroki】
はい!さっそく自分のAWSアカウントで小さなバケットを作ってみるところから始めてみます。Yukiさん、丁寧に教えてくださってありがとうございました!
![]()
【Yuki】
いいえ……どういたしまして。Hirokiくんが新しいことを学ぼうとする姿、とても素敵だと思います。また何かあれば、いつでも聞いてくださいね。夜は静かで作業も捗るかもしれませんが、あまり無理はしないでくださいね。
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

