なんだかんだでまたご無沙汰しておりますm(__)m
今日はCDK for TerraformでAWSリソースを構築する手順例をご紹介します。
(CDK for Terraformとは何かは後述)
CDK for Terraformを「Pythonでやったよ」という民間記事が極端に少ない(TypeScriptでやったのはそれなりにはある)ので、
自分の備忘録も兼ねてPythonの方法を残しておこうと思います(´・ω・`)
なお2024年6月時点の情報です。
もくじ
2.実行環境
3.インストール
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のドキュメント記載内容をそのまま利用できる。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs?lang=python
例えばVPCを作成したいなら、上記ドキュメントのうち、以下のページを参照することになる。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc?lang=python
ドキュメントには、ソースコード例(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か月、最近はブログ以外での勉強を進めているのと、
もうすぐ出産予定日なので、また投稿が鈍るかもしれません💦
どうぞ気長にお付き合いくださいませ。。