【AWSワークショップ】TypeScriptで始めるAWS CDK Workshop(第1回)
こんにちは、大石(@se-o-chan)です。
「AWS CDKでIaCデビューしてみたいけど、インフラ屋にコーディングはハードル高い・・・」
「AWS CDKを使うならTypeScriptがメインっぽいけど、触ったことない・・・」
この記事ではそんな方に向けて、AWS公式のTypeScript版 AWS CDK Workshopをご紹介します。
しかしこの手のWorkshopは「手順に沿ってやってみたけど、結局何やっているか分からない」となりがちなので、一段踏み込んで内容を解説します。
このブログはAWS CDK Workshopの第1回です。続きの内容は下記にあります。
AWS CDKとは?
AWS CDK(Cloud Developer Kit)とは、プログラミング言語を使ってAWS上でIaCを実現できるツールです。
もともとAWSにはAWS CloudFormationというIaCサービスがあります。しかし、CloudFormationはYAMLやJSONのような設定言語を使ってインフラ構成を表現する必要があり、学習コストが高い、プログラム言語によくあるif文やforループなどを使うことが出来ないといった課題がありました。
そこで登場したのがAWS CDKです。TypeScriptやPython、Javaなどエンジニアが使い慣れたプログラミング言語を使ってCloudFormationテンプレート(=AWS構成を表現したJSONファイル)を生成してくれます。 AWS CDK自身がAWSリソースを構築するのではなく、あくまでCloudFormationテンプレートを作ってくれるツールという位置づけであることに注意です。
(出典)AWS Black Belt AWS Cloud Developer Kit (CDK) Basic #1
TypeScriptとは?
AWS CDKで最もよく使われているプログラミング言語はTypeScriptだと思います。AWS CDK自身もTypeScriptで作られており、AWSや第三者が提供している情報も最も多いため、まずCDKを初めてみるならTypeScriptが良いと思います。
TypeScriptは、Microsoftによって開発されているプログラミング言語で、JavaScriptの代替となることを目的にJavaScriptの弱点を補強して作られています。JavaScriptとの違いで最も特徴的なのが、静的型付けが出来るという点です。JavaScriptでは、例えば下記のように変数宣言時にデータ型を指定せず、どんなデータ型の値でも格納できます。
/* JavaScriptの場合 */ let name; // データ型の指定がない name = 'Suzuki'; name = 10; // String型を入れた後に数値型を入れることも可能
これは柔軟性がある反面、エラーが発生しやすいです。例えばname*10
という処理を実装した場合、name変数に文字列が格納されていると構文エラーになります。問題はプログラム実行時にならないとこのエラーに気づけないということです。
一方、TypeScriptでは変数にデータ型を指定するため、String型に掛け算を行うような処理はコンパイルエラーとなり、事前にミスに気付くことが出来ます。
/* TypeScriptの場合 */ let name: string; // String型として変数定義 name = "Suzuki"; name = 10; // コンパイルエラーが発生
またTypeScriptのもう1つの特徴は、コンパイルするとJavaScriptソースコードを生成するということです。つまりTypeScrpitという言語は、静的型付けが可能なJavaScript生成ツールのような位置づけです。これにより、WebブラウザやNode.jsのようなJavaScriptエコシステムをそのまま活用することができます。TypeScriptとJavaScriptの関係は、AWS CDKとCloudFormationの関係性と似ていますね。
AWS CDK Workshop
では、ここからWorkshopに入ります。Workshop自体は下記にあります。
環境の準備
TypeScriptでAWS CDKを使うために最低限必要なものは下記4つです。
- リソースをデプロイするAWSアカウントとIAMユーザ
- コマンドラインでAWSを操作するAWS CLI
- TypeScriptのランタイム(実行環境)であるNode.js
- 開発環境であるVSCodeなどのIDE
TypeScriptコンパイラ(TypeScript→JavaScriptへ変換する機能)自身がTypeScriptで構築されているため、ランタイムとしてのNode.jsが無いと開発が出来ません。これらが用意できたら、以下のコマンドでAWS CDKをインストールします。
npm install -g aws-cdk
Node.js上で稼働するJavaScrpt/TypeScriptのパッケージを管理するnpmには、グローバルインストールとローカルインストールという概念があります。前者はPC全体にインストールする方法で、どのプロジェクトからでもそのパッケージを利用できます。一方でプロジェクトごとにパッケージのバージョンを変えるといったことが出来ません。上のコマンドにおける-gオプションはグローバルインストールを意味します。一方でローカルインストールは特定プロジェクトにだけ適用されます。package.json内のdependenciesやdevdependenciesにプロジェクトに依存するパッケージとバージョンが記述されます。
(参照)npmのローカルインストールとグローバルインストールの違い | GK Front-end Blog
新しいプロジェクト
CDKをインストールしたらプロジェクトディレクトリを作成し、カレントディレクトリを変更します。
mkdir cdk-workshop && cd cdk-workshop
ここでcdk init
を使うことで、CDKプロジェクトを生成します。これによりプロジェクトディレクトリ配下にTypeScriptを含む様々なパッケージがインストールされます。
cdk init sample-app --language typescript
cdk initの後のsample-app
はテンプレートを意味します。といってもテンプレートにはapp
とsample-app
の2種類しかなく、後者はSQSキューとSNSトピックを作るまさにサンプルなので実案件では原則app
を指定することになるはずです。
プロジェクトディレクトリ配下にたくさんのファイルが出来ています。そのうちの1つであるcdk.json
はCDK構成ファイルです。そこで以下の記述がありますが、これが後で山ほど出てくるcdkコマンドの実態であり、bin/cdk-workshop.ts
がcdkコマンドのエントリーポイントです。
"app": "npx ts-node --prefer-ts-exts bin/cdk-workshop.ts",
ではそのエントリーポイントであるbin/cdk-workshop.ts
を見てみます。
#!/usr/bin/env node import * as cdk from 'aws-cdk-lib'; import { CdkWorkshopStack } from '../lib/cdk-workshop-stack'; const app = new cdk.App(); new CdkWorkshopStack(app, 'CdkWorkshopStack');
../lib/cdk-workshop-stack.ts
モジュール(≒ファイル)からCdkWorkshopStack
というクラス定義を取込み、new
でインスタンス化しています。では、さらに../lib/cdk-workshop-stack.ts
ファイルを見てみます。これがCDKアプリケーションの中心となるファイルです。
import * as cdk from 'aws-cdk-lib'; import * as sns from 'aws-cdk-lib/aws-sns'; import * as subs from 'aws-cdk-lib/aws-sns-subscriptions'; import * as sqs from 'aws-cdk-lib/aws-sqs'; export class CdkWorkshopStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); const queue = new sqs.Queue(this, 'CdkWorkshopQueue', { visibilityTimeout: cdk.Duration.seconds(300) }); const topic = new sns.Topic(this, 'CdkWorkshopTopic'); topic.addSubscription(new subs.SqsSubscription(queue)); } }
CdkWorkshopStack
クラス内のnew sqs.Queue
でSQSキューを、new sns.Topic
でSNSトピックを作成しているように、ここで構築するAWSリソースを定義しています。
まずCDKからCloudFormationテンプレートを作ります。次のコマンドでプロジェクトディレクトリ配下のcdk.out
にjsonファイルが生成されます。
cdk synth
CDKアプリケーションを始めてデプロイする時は、事前に次のコマンドを実行、ブートストラップを環境にインストールする必要があります。
cdk bootstrap
これにより、下記AWSリソースが自動生成されます(ブートストラップの実態は事前定義されたテンプレートによるCloudFormationスタックの作成です)。
リソース | 用途 |
---|---|
S3バケット | CDKから生成されたCloudFormationテンプレートであるjsonファイルや Lambda関数のソースコードであるzipファイルなどの格納先 |
IAMロール | S3へのファイルPutやCloudFormationの実行などに必要なロール定義 |
ECRリポジトリ | CDKでDockerイメージを構築する場合のリポジトリ |
SSMパラメータ | ブートストラップのテンプレートバージョン管理 |
これで準備が整ったのでCDKアプリをデプロイしてみます。
cdk deploy
さきほどcdk synth
で作ったCloudFormationテンプレートがアップされ、AWSリソースが構築されます。
まとめ
CDKとは何か?TypeScriptとは何か?を簡単に整理し、CDKの準備を整えたうえで実際にAWSリソースを構築するところまで進めました。しかし、sample-appのテンプレートをそのまま活用しただけなので、cdk-workshop.ts
やcdk-workshop-stack.ts
モジュールで実装している内容は何なのか、自分たちでAWSリソース構築するにはどのように実装するのかがまだ分かりません。
第2回もAWS CDK Workshopを進め、そのあたりの不明点を解消していきます。