CDK for TerraformでAWSリソースを構築する(Python編) | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

なんだかんだでまたご無沙汰しておりますm(__)m
 

今日はCDK for TerraformでAWSリソースを構築する手順例をご紹介します。

(CDK for Terraformとは何かは後述)

 

CDK for Terraformを「Pythonでやったよ」という民間記事が極端に少ない(TypeScriptでやったのはそれなりにはある)ので、

自分の備忘録も兼ねてPythonの方法を残しておこうと思います(´・ω・`)

 

なお2024年6月時点の情報です。

 

もくじ

1.CDK for Terraformとは

2.実行環境

3.インストール

4.ソースコード作成時の参考ドキュメント

5.ソースコードの書き方解説

6.実行

 

1.CDK for Terraformとは

<IaCとは>

CDK for Terraform(CDKTF)の説明に入る前に。

IaC(Infrastructure as Code)とは、

ITシステムのインフラ構築処理をプログラムコードに表し、管理・構築自動化する手法である。

一度コードを作ってしまえば、同じ環境を何度でも構築できるため、

インフラの設定やプロビジョニングが効率化され、管理しやすくなる利点がある。

 

このIaCの考え方を実現するツールの1つが、今回テーマとしているCDK for Terraformである。

 

<CDK for Terraformとは>

CDK for Terraformは、Terraformの設定をプログラムコードで記述するためのツールである。

 

そもそもTerraformは、IaCを実現するOSSツールの1つとして有名である。

通常、Terraformでは、独自言語であるHCL(HashiCorp Configuration Language)を使用して、インフラ構築コードを記述する。つまりHCLの学習コストが必要となる。

 

一方で、CDK for Terraformでは、一般的なプログラミング言語(例:TypeScript、Python、Javaなど)を利用して記述する。

CDK for Terraformの利用により、開発者は馴染みのある言語を使用し、学習コストを低く抑えたうえで、より複雑で動的なインフラストラクチャを構築・管理しやすくなる。

 

 

今回のブログ記事は、CDK for Terraformを利用して、

AWSのリソース構築をプログラミングコードで記述し、実行してみることが主旨となる。

 

2.実行環境

今回はAWSのクラウド上で実行できる統合開発環境(IDE)サービスである、Cloud9を利用する。

環境は適宜読み替えてほしい。

(Cloud9の作成過程は割愛しますm(__)m)

 

<Cloud9環境詳細>

・プラットフォーム:Amazon Linux 2023

・インスタンスタイプ:t3.large(メモリ8GiB、2vCPU)

・VPCのパブリックサブネットに配置

 

※インスタンスタイプのスペックが低すぎると、

CDK for Terraformのインストール処理に耐えきれないので注意!

 

<注意点>

Cloud9環境を実行するユーザまたはロールについて、以下のIAM権限を割り当てておく必要がある。

 ・Cloud9の実行権限

 ・CDK for Terraformで作成したいAWSリソースの作成権限(EC2を作成したいならEC2の作成権限)

 

Cloud9の実行権限は言うまでもないが、

リソースの作成権限がないと、CDK for Terraformの実行時に権限エラーとなるため注意が必要である。

 

 

3.インストール

2.実行環境で示したCloud9環境へは、以下の手順でインストールできる。(2024年6月現在)

 

①Terraformのインストール
CDK for Terraformの利用には、前提としてTerraformがインストールされている必要があるためインストールする。

Amazon Linuxの場合は以下のコマンドでインストールする。

# インストール
$ sudo yum install -y yum-utils shadow-utils
$ sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
$ sudo yum -y install terraform

# バージョン確認
$ terraform --version

 

※Amazon Linux以外のOSでのインストールコマンドも以下に記載あり。

https://developer.hashicorp.com/terraform/install

 

インストール実行結果は以下の通り。

2024年6月現在の最新版1.8.5がインストールされた。

$ terraform --version
Terraform v1.8.5
on linux_amd64

 

②pipenvのインストール

Pythonを利用する場合、pipenvのインストールも必須となる。

(なおCloud9の場合、Pythonは最初からインストールされている)

# インストール
$ pip install pipenv

# バージョン確認
$ pipenv --version
pipenv, version 2024.0.0

 

③cdktf-cliのインストール

# インストール(けっこう時間かかる)
$ npm install --global cdktf-cli@latest

# バージョン確認
$ cdktf --version
0.20.7

 

④CDK for Terraformの初期化

初期化処理により、CDK for Terraformのプロジェクトが作成される。

そのため事前に、プロジェクトを作成したいディレクトリを作成し、当該ディレクトリに移動しておく必要がある。

今回は"~/test"ディレクトリ配下にCDK for Terraformのプロジェクトを作るものとする。

 

$ mkdir ~/test && cd ~/test

# 初期化実施。言語(今回はPython指定)やプロバイダーのバージョンは適宜読み替えてください
$ cdktf init --providers="aws@~>4.0" --template=python --local

 

initをすると、いくつか質問されるが、特にこだわりのない限り、以下のように答えれば良い。

? Project Name
→test(デフォルト値のまま)
? Project Description
→A simple getting started project for cdktf.(デフォルト値のまま)
? Do you want to send crash reports to the CDKTF team?
→no("n"と答えればOK)

 

初期化(init)には少し時間がかかるが、これでインストールおよび初期化作業は完了である。

初期化後、以下のようなディレクトリ・ファイルが~/testディレクトリ配下に作成されている。

~/test $ ls -l
total 28
-rw-r--r--. 1 ec2-user ec2-user  152 Jun 10 04:19 Pipfile
-rw-r--r--. 1 ec2-user ec2-user 6639 Jun 10 04:19 Pipfile.lock
-rw-r--r--. 1 ec2-user ec2-user  282 Jun 10 04:19 cdktf.json
-rw-r--r--. 1 ec2-user ec2-user 1437 Jun 10 04:19 help
drwxr-xr-x. 3 ec2-user ec2-user   62 Jun 10 04:23 imports
-rw-r--r--. 1 ec2-user ec2-user  817 Jun 10 04:19 main-test.py
-rwx------. 1 ec2-user ec2-user  294 Jun 10 04:19 main.py

 

 

4.ソースコード作成時の参考ドキュメント

利用しているのはCDK for Terraformであり、Terraformではないものの、

Terraformのドキュメント記載内容をそのまま利用できる。

 

例えばVPCを作成したいなら、上記ドキュメントのうち、以下のページを参照することになる。

 

 

ドキュメントには、ソースコード例(Example Usage)の他、

引数の一覧(Argument Reference)や、実際のリソース作成により自動割り当てされる属性の一覧(Attribute Reference/例えばARNとか)も書かれている。

 

CDK for Terraformは公式ドキュメント以外の情報が乏しいこともあり、基本的にはドキュメントを参照しながらソースコードを作っていくことになると思う。

 

5.ソースコードの書き方解説

VPCのドキュメントに記載のあるソースコード例をもとに、

私なりにコードを追記(追記箇所は赤字)・解説を入れると…

from constructs import Construct
from cdktf import TerraformStack, App
from imports.aws.vpc import Vpc
from imports.aws.provider import AwsProvider

class MyConvertedCode(TerraformStack):
    def __init__(self, scope, name):
        super().__init__(scope, name)
        AwsProvider(self, "aws",
            region = "ap-northeast-1"
        )
        Vpc(self, "main",
            cidr_block="10.0.0.0/16"
        )
app=App()
MyConvertedCode(app, "vpc")
app.synth()

 

↓各コードの意味の解説

<インポート文の部分>

from constructs import Construct
from cdktf import TerraformStack, App
from imports.aws.vpc import Vpc
from imports.aws.provider import AwsProvider

上2つのインポート文はTerraform実行に必要なため、決まり文句のようなものとして必ず入れておく必要がある。(追加したAppについては後述)

3つ目は作成するAWSリソースによって変わってくる。今回はVPCを作成するためのソースコード例のため、VPCをインポートしている。

 

そして4つ目は、AWSリソースをCDK for Terraformで作成するために必須となるインポートとなる。

こちらも決まり文句として必ず入れておく。

 

<クラス、コンストラクタメソッド部分>

class MyConvertedCode(TerraformStack):
    def __init__(self, scope, name):
        super().__init__(scope, name)

ここもお決まり。(クラス名は任意)

もしかしたらメソッドの引数は一部いじって良いかもだが、検証はしていない。

 

<AWSプロバイダー指定>

        AwsProvider(self, "aws",
            region = "ap-northeast-1"
        )

CDK for TerraformのリソースプロバイダとしてAWSを、

リソースを作りたい先としてリージョンを指定する。

今回は東京リージョン(ap-northeast-1)を指定した。

 

<リソース作成の本体部分>

        Vpc(self, "main",
            cidr_block="10.0.0.0/16"
        )

CDKTFでは、作成したいAWSリソースのオブジェクト(例ではVPCのオブジェクト)を生成することによって、
該当のリソースがTerraformにより生成される仕組みになっている。

 

各引数について、
第1引数のself, 第2引数の"main"にあたる部分(リソースの定義名。任意の値でOKだが他のリソースと被らないようにする必要あり)は必須である。

第3引数以降で、ドキュメントの「Argument Reference」にある各パラメータを指定する。このパラメータ値をもとに、VPCの設定が決まってくる。

 

<CDKTF実行部分>

app=App()
MyConvertedCode(app, "vpc")
app.synth()

上記のように記述することで、CDK for Terraformに対して、AWSリソースの作成実行が命令される。

お決まり文句みたいなものだと考えればOK(だと思う)。

なお、上記コードの追加に伴い、インポート部分にAppを追加している。

 

 

6.実行

5.ソースコードの書き方解説に示したソースコードを実行してみる。

3.インストールで構築したCDK for Terraformを利用する。

 

実行はとても簡単。

(今回はmain.pyで処理を実行させるものとする)

 

①main.pyのあるディレクトリに移動する。

今回は~/testというディレクトリを、3.インストールで作成済なので、

~/testディレクトリに移動する。

 

②main.pyを編集する。

5.ソースコードの書き方解説に示したPythonコードに変える。

 

③以下のコマンドを実行する。(引数などは不要)

cdktf deploy
vpc  Initializing the backend...
(長いので中略)

(↓途中で、リソース作成内容に問題ないか聞かれるので、approveを指定しリソース作成実行)     
     Do you want to perform these actions?
       Terraform will perform the actions described above.
       Only 'yes' will be accepted to approve.
vpc  Enter a value: yes
vpc
vpc  aws_vpc.main: Creating...
vpc  aws_vpc.main: Creation complete after 1s [id=vpc-01ca7a55cca2a6c67]
vpc  
     Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

 

④VPCリソースが生成される。

③の実行結果からリソース生成の結果が確認できる他、
マネジメントコンソールからも、作成したVPCを確認できる。

 

⑤リソースを削除したい場合は、以下のコマンドで削除できる。

cdktf destroy

 

<補足>

実際はmain.pyに全ての処理を書くことはなく、

VPC作成処理をvpc.pyに書き、vpc.pyをmain.pyから呼び出すといった構成になると思う。

その場合は、例えば以下のようにソースを作成すると良い。(main.pyとvpc.pyを同じディレクトリに配置する場合)

ソース作成後の実行手順は、上記に示したものと同様になる。

 

main.py

from vpc import MyConvertedCode
app=App()
MyConvertedCode(app, "vpc")
app.synth()

 

vpc.py

from cdktf import TerraformStack
from imports.aws.vpc import Vpc
from imports.aws.provider import AwsProvider

class MyConvertedCode(TerraformStack):
    def __init__(self, scope, name):
        super().__init__(scope, name)
        AwsProvider(self, "aws",
            region = "ap-northeast-1"
        )
        Vpc(self, "main",
            cidr_block="10.0.0.0/16"
        )

 

今回は以上!

 

 

なお、第二子の産休に入り早1か月、最近はブログ以外での勉強を進めているのと、

もうすぐ出産予定日なので、また投稿が鈍るかもしれません💦

どうぞ気長にお付き合いくださいませ。。