はじめに
こんにちは
私事ですが、エンジニアという名を受けて働き始めてから、はや2年弱となってしまいました...。
今まではPL/Iというアセンブラ言語での開発を少しと、モバイルアプリのテスターとしての役割を担って活動していますが、コーディングに関する知識を持たぬまま、目標となるSAや設計といった役割をこのまま担うのには、今後のキャリアやエンジニアのステップとしては不健全なのではと考えました。(個人の感想です)
そのため、本記事で取り組むCDKのようなIaCや、今後取り組む可能性のある機械学習のようなトレンドで活躍するプログラミング言語であるPythonの学習を開始しています。
紀伊國屋で下記のPython本を購入し、ウキウキで学習を始めたのはいいのですが、型の取り扱いのような基礎的な部分であくびが出始め、学習の継続に不安を感じる結果となっています..。
(変数への代入やprintを用いた出力ハンズオンも大事なのは重々承知してはいますが、コードに関する知識は少しだけあったので、やや退屈になってしまいました)
今まで培ってきたAWSに関する知識を活かせるとともに、プログラミングの基礎を理解したうえでのプラクティスは無いかと考えたところ、AWS CDKに出会いました。
AWS CDKについて
AWS CDKとは簡単に言うと、「コードでインフラを定義し、構築できる」ツールを指します。
CDKのもとでコードを実行するとCloudFormationを作成し、テンプレートをもとにしたAWSリソースを作成することができるようです。
下記はCDKの仕組みを表しており、画像下に添付しているリンク(AWS BlackBeltより)より引用しております。リンク先のスライドではCDKの仕組みや、CDKが作られることになった経緯、CDKの具体的なコンセプト説明もあるため、CDKに対して持っているイメージが曖昧な方はぜひ読んでいただきたいです。

(画像抜粋:https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS-CDK-Basic-1-Overview_0731_v1.pdf)
実際に始めてみる
つべこべ言わずに始めます。
今回の目的は、「CDKによるリソースの生成を確認する」ことで、Python構文の基礎を身に着けつつ、AWSアカウントとの疎通確認を実施していきます。
リソースとしてはVPCのみを作成する予定で、マルチAZ等のベストプラクティスは本テーマのスコープ外としております。
0.必要なもの
必要なものは以下の3点です。
- お好みのIDE(私はVSCodeを使います)
- Python、AWSCLIのインストール(pipも必要です)
- アクセスキー、シークレットアクセスキーを発行したIAMユーザー
1.プロジェクトを作成する
コードを記述するプロジェクトを作成します。
空っぽのディレクトリのもとでcdk initを呼び出すことで、AWS CDKプロジェクトを作成できます。
今回はPythonを使用するため、--languageオプションでpythonを指定して実行します。
cdk init --language python
コマンドの実行に成功すると、CDKの実行に必要なテンプレートが生成されます。
(画像左にあるファイルは全て自動生成されたものです)
スタックのリソース定義など、CDKの根幹となるファイルは[~stack.py]という名前です。
コメントでAmazon SQSのリソース定義の例文が書かれており、とても参考になります。
2.~stack.pyにリソースを定義する
initコマンドが正常実行した後は、~stack.pyにリソースを定義します。
AWSドキュメントのチュートリアルやCDKライブラリ等を参考にし、構文エラーを修正した結果、下記のような記述になりました。
1つのVPC、1つのAZに、パブリックとプライベートのサブネットが作成される想定です。
vpc = ec2.Vpc(
self,
"MyVpc",
max_azs=1,
nat_gateways=0,
subnet_configuration=[
ec2.subnetConfiguration(
name = "Test_Public_Instance",
subnet_type=ec2.SubnetType.PUBLIC,
cidr_mask=24,
),
ec2.subnetConfiguration(
name="Test_Private_Instance",
subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS,
cidr_mask=24,
)
],
)
3.CloudFormationのスタックを作成する
リソースの定義を終えたら、スタック作成の準備をするため、synthコマンドを実行します。
cdk synth
エラー警告文がなかったり、下記のように長いログが流れ始めたら成功だと思います。
Wabis@Wabisabi_PC_V1 MINGW64 ~/LearningPython_withAWS (master)
$ cdk synth
Resources:
MyVpcF9F0CA6F:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsHostnames: true
EnableDnsSupport: true
InstanceTenancy: default
Tags:
- Key: Name
Value: LearningPythonWithAwsStack/MyVpc
(いろいろなログ)
If you don’t want to see a notice anymore, use "cdk acknowledge <id>". For example, "cdk acknowledge 34892".
(.venv)
cdk synthにおいて、構文不正のエラー失敗した場合、解決策はログに記載されていたので問題ないと思われます。(不正の行と文字列に対してDid you mean ~?と出てくる)
一方で、仮想環境にモジュールをインストールしていないことによるエラーが出ました。
Wabis@Wabisabi_PC_V1 MINGW64 ~/LearningPython_withAWS (master)
$ cdk synth
Traceback (most recent call last):
File "C:\Users\Wabis\LearningPython_withAWS\app.py", line 4, in <module>
import aws_cdk as cdk
ModuleNotFoundError: No module named 'aws_cdk'
NOTICES (What's this? https://github.com/aws/aws-cdk/wiki/CLI-Notices)
34892 CDK CLI will collect telemetry data on command usage starting at version 2.1100.0 (unless opted out)
Overview: We do not collect customer content and we anonymize the
telemetry we do collect. See the attached issue for more
information on what data is collected, why, and how to
opt-out. Telemetry will NOT be collected for any CDK CLI
version prior to version 2.1100.0 - regardless of
opt-in/out. You can also preview the telemetry we will start
collecting by logging it to a local file, by adding
--unstable=telemetry --telemetry-file=my/local/file to any
cdk command.
Affected versions: cli: ^2.0.0
More information at: https://github.com/aws/aws-cdk/issues/34892
If you don’t want to see a notice anymore, use "cdk acknowledge <id>". For example, "cdk acknowledge 34892".
python app.py: Subprocess exited with error 1
(.venv)
対処法としては、依存パッケージのインストールをする必要があります。
cdk initを正常に実行できていれば、[requirements.txt]は自動で生成されているはずです。
pip install -r requirements.txt
その後、再度synthコマンドを実行すれば正常に完了できると思われます。
(それか構文エラーが発生する)
cdk synth
4.準備が整ったのでdeployする
cdk synthが無事完了したら、デプロイが可能になります。
cdk deploy
デプロイに成功する場合、作成されるCloudFormationスタックがログに流れてきて、見るからに成功という記述が流れ、実行を終了します。


実際にマネジメントコンソール上から確認してみると、CloudFormationスタックやVPCが作成されていることを確認できます。
5.後片付け
CDKとAWSアカウントとの疎通確認が取れたため、一旦テンプレートによって生成されたリソースを削除します。
(リソースが存在している場合に、cdkを更新後デプロイするとどのような挙動を取るかは次の学習で確認します)
cdk destroy
上記のコマンドを実行後、再度見るからに成功の文言が確認でき、マネジメントコンソール上でもCloudFormationからスタックが削除されていることが確認できます。
参考資料








