顧客フロントSEのIT勉強ブログ

2022 Japan AWS Top Engineer / 2022-23 Japan AWS Certifications Engineer。AWS認定12冠、情報処理試験全冠。顧客フロントSEがなるべく手を動かしながらIT技術を学んでいくブログです。

【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回です。続きの内容は下記にあります。

frontse.hatenablog.jp

AWS CDKとは?

 AWS CDK(Cloud Developer Kit)とは、プログラミング言語を使ってAWS上でIaCを実現できるツールです。

 もともとAWSにはAWS CloudFormationというIaCサービスがあります。しかし、CloudFormationはYAMLJSONのような設定言語を使ってインフラ構成を表現する必要があり、学習コストが高い、プログラム言語によくあるif文やforループなどを使うことが出来ないといった課題がありました。

 そこで登場したのがAWS CDKです。TypeScriptやPythonJavaなどエンジニアが使い慣れたプログラミング言語を使って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自体は下記にあります。

cdkworkshop.com

環境の準備

 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はテンプレートを意味します。といってもテンプレートにはappsample-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.TopicSNSトピックを作成しているように、ここで構築するAWSリソースを定義しています。

 まずCDKからCloudFormationテンプレートを作ります。次のコマンドでプロジェクトディレクトリ配下のcdk.outjsonファイルが生成されます。

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.tscdk-workshop-stack.tsモジュールで実装している内容は何なのか、自分たちでAWSリソース構築するにはどのように実装するのかがまだ分かりません。

第2回もAWS CDK Workshopを進め、そのあたりの不明点を解消していきます。