AWS CDK Workshop 日本語版をやってみた

2022.11.16

はじめに

AWS CDK Workshopに日本語翻訳版ができていました。 英語版を試したときに、途中読み飛ばしていたところもあったので、日本語版であらためてやってみました。

AWS CDK Intro Workshop | AWS CDK Workshop. https://cdkworkshop.com/ja/

日本語版はサイドメニューの言語設定欄をEnglishから日本語に変えると、日本語版に変わります。

AWS CDKとは

コードでインフラを定義して、AWS CloudFormationを通してプロビジョニングをするフレームワークです。

詳しくは以下をご参照ください。 https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/home.html

AWS Workshopとは

AWSのサービスをハンズオン形式で学べるサイトです(基本は英語のみ)。 他にどのようなものがあるか、ご興味のある方は以下記事もご参照ください。

AWS CDK Workshopとは

AWS CDKを利用して、AWSのサービスをデプロイしていきます。 このWorkshopでは主に以下をハンズオンを通して体験できます。

  • CDKをデプロイ
  • URLにアクセスしたら"Hello,CDK"と表示されるアプリの作成
  • URLにアクセスしたら"Hello,CDK"と表示され、アクセス回数をカウントするアプリの作成
  • エラーが起きたときのログの見方
  • ユニットテスト
  • CDKのパイプラインを作り方

やってみた

TypeScript,Python,.NET,Java,Goがありましたが 今回、わたしはPythonを使いました。 AWS CDKを実行するローカル環境は以下の通りです。

  • OS:macOS Ventura 13.0
  • AWS CLI:2.8.9
  • Node.js:18.12.1
  • Python:3.9.11

セットアップ

このワークショプを行うためには、事前にインストールをしておくものがあるようです。以下をサクサクインストールしていきましょう。

  • AWS CLI. 最新バージョン推奨
  • AWS Account と IAM User
  • Node.js 2022年11月9日時点ではAWS CDKはNode.js 19はサポートされていないため homebrewでインストールする場合は、サポートされているバージョンを明示的に指定して、インストールしましょう。

  • IDE VSCodeを利用します。

  • AWS CDK Toolkit 以下コマンドを打ってCDKをインストールします。

 $npm install -g aws-cdk

とコマンドを打てばインストールできます。

  • 使用する言語 Pythonを利用します

初めての CDK プロジェクトを作成する

説明を読みながら、コードを実行しています。 日本語て書いてあるって素晴らしいですね。 Pythonのモジュールをインストールすると以下のようなファイル構成になります。

% tree cdk-workshop
cdk-workshop 
├── README.md
├── app.py
├── cdk.json
├── cdk_workshop
│   ├── __init__.py
│   └── cdk_workshop_stack.py
├── requirements-dev.txt
├── requirements.txt
├── source.bat
└── tests
    ├── __init__.py
    └── unit
        ├── __init__.py
        └── test_cdk_workshop_stack.py

初めての CDK プロジェクトを作成するの章が完了するCloudFormationのスタックが二つ出来上がります。

Hello,CDK

Hello、CDKはAPI GatewayとLambdaを利用して、URLにアクセスしたら"Hello,CDK"と表示されるアプリの作成します。 途中で各種コードの説明やホットスワップデプロイの説明をします。

まずLambda関数を作っていきます。 CDKのテンプレートはcdk_workshop_stack.pyを書き換えて ルートディレクトリ配下にLambdaのディレクトリの作成し、その配下にhello.pyを作成します。 デプロイ後にブラウザでURLにアクセスするとブラウザ画面に以下が表示されれば完了です。

Good Night, CDK! You have hit /

コンストラクトを書く

次に新しいコンストラクトを定義して、アクセス数をカウントしてDynamoDBに保存するアプリを作ります。 内容はファイルはモジュールを一つ(hitcounter.py)、Lambdaハンドラー(hitcount.py )を一つ追加して、cdk_workshop_stack.py を書き換えてデプロイするというものです。

ワークショップを進めていくと途中で以下のようにエラーコードが返ってくるところがあります。

 % curl -i https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/
HTTP/2 502
content-type: application/json
...

これはエラーが起きたときにどこでログを見ればいいか(CloudWatchログの見方)の解説するためにあえてエラーの状態にしています。 (個人的にここがハマりポイントで、ワークショップであえてエラーにするという認識がなくて、読み進めずに1時間くらいトラブルシューティングしてました。)

Wordkshopに沿って、コードを修正して、デプロイすると、アクセスができるようになります。

% curl -i https://xxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/
HTTP/2 200
...

DynamoDBで登録されていることも確認できます。

コンストラクトライブラリの利用

コンストラクトライブラリを利用して、エンドポイント経由でもDynamoDBのテーブルの中身が見れるようにしていきます。 デプロイ後に発行されてURLにアクセスすると以下のように表示されます。

アドバンスドトピック

ユニットテストとパイプラインを作成します。

ユニットテスト

ユニットテストでは、ローカルPC上でテストコードを書いて、 アサーションテストとバリデーションテストをします。

以下のような感じでPC上でユニットテストをしていきます。

% pytest
============================================================== test session starts ==============================================================
platform darwin -- Python 3.9.6, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: /Users/sakamoto.yuta/cdk-workshop
plugins: typeguard-2.13.3
collected 1 item

tests/unit/test_cdk_workshop.py .                                                                                                         [100%]

=============================================================== 1 passed in 2.58s ===============================================================

パイプラインの作成

CodeComitにリポジトリを作成し、CodePipelineを使ってパイプラインを作成します。CodePipelineもCDKで作ります。

リポジトリの作成で、以下コマンドがありますが、 ブランチ名を確認して、必要に応じて書き換えてください。

git push --set-upstream origin master

ちなみにわたしばブランチ名を見たら以下でした。

% git branch
* main

そのため、以下のように個、コマンドを書き換えました。

% git push --set-upstream origin main

他にも pipeline_stack.py でmaster ブランチを指定しているので、 ブランチがmainの方は必要に応じてpipeline_stack.pyを書き換えてください。

うまくいくと、こんな感じでCodePipelineが起動して、デプロイ後はgit addをすると自動でデプロイしてくれます。

終わりに

所要時間は調べたながら進めたので、トータルで8時間くらいかかったような気がします。

デプロイからパイプラインまで作成できて、CDKはどういうものかイメージすることができました。CodePipelineやCodeComitは使ったことがなかったので、大満足です。

気づきとしては翻訳でなんとかなると思っていたのですが、英語を翻訳して理解するのと 日本語を読むのでは、翻訳する工数が減る文理解度が高かったような気がしました。

今度はこれを応用して、パイプラインの中にユニットテストを入れてみようと思います。

このブログが誰かの参考になれば幸いです。