APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

AWS CDK for Typescript

1. 概要

はじめまして、クラウド事業部の丹羽です。 業務内でAWS CDK for Typescriptを使う機会があり、まったく触れたことのない要素(cdk, Typescript)への取り組みだったため、 自分がどういう流れで学習していき業務で使えるよう(落とし込んでいったか)になったか、使う際のポイントみたいなものもを記録として残そうと思います。あくまでメモレベルの内容として見ていただけると。
※AWS CDK for Typescriptのメモなので、以下使用している言語はTypescriptになっています。

2. そもそもCDKってなんだっけ

2-1. ざっくりとした理解

当初CDKについては耳にしたことがある程度のレベルだったため、改めて色々調べて整理してみた。

AWS CDKとは?

上記公式の冒頭には以下のように書かれていた。

AWS Cloud Development Kit (AWS CDK) は、 AWS CloudFormationクラウドインフラストラクチャをコードで定義し、それをプロビジョニングするためのオープンソースのソフトウェア開発フレームワークです。

自分なりに簡潔に表現するなら、「AWS CloudFormation専用のIaCツール」かな。
TypescriptやPythonなどのプログラミング言語でCloudFormationのテンプレート内容を定義し、AWS環境へデプロイしていくというイメージ。
ポイントだと思ったのは、CloudFormationが裏で動いているということかな。
ロールバックなどのCloudFormationの機能がそのまま使えるということが利点になっていると思われる。
以下の記事がまとまっていて見やすかったので参考に載せておく。

5分で理解するAWS CDK・・・記事(1)

2-2. ちょっとだけ深堀

記事(1)の中や公式でも触れらているけど、CDKの構成要素としてApp、Stack、Constructという大きく3つの要素が存在する。中でも一番触れる機会が多いのがConstruct。
それぞれ何なのかを整理しておくと、

  • Construct

各種AWSサービスを定義する単位。以下で説明するStackに紐づけられる。
簡単な例、例えばVPCを定義する場合、CDKライブラリの公式の「For example」に記載されているように、必要なパラメータを渡してVpcクラスをインスタンス化していく。

  • Stack

ここは公式にわかりやすく書いてあるので引用すると、

Stackは、AWS リソースを定義する 1 つ以上のコンストラクトのコレクションで、AWS CloudFormation スタックに相当する。デプロイ時にスタック内のコンストラクトが、 AWS CloudFormation スタックとしてプロビジョニングされます。

ざっくりとした理解であれば「Stack ≒ CloudFormationのスタック」でいいかも。
このStackをTypescriptのクラスとして定義していくのだけど、そのClassのconstructor内で先ほどのConstructを定義していくイメージ。
簡単な例をあげると、

class SampleStack extends cdk.Stack {
  constructor(scope: Construct , id: string, props: <自分で定義したinterfaceとか>) {
    const vpc = new ec2.Vpc(this, 'TheVPC', {
      ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
    })
  }
}

こんな感じで定義していく。
このConstructを以下で説明するAppに紐づけていく。

  • App

複数のStackをグループ化するもので、いわばCloudFormationの複数スタックを1つのグループとして扱うための定義。
例えば、VPC StackとEC2 Stackが別で定義されているとすると、それらを1つのグループとしてまとめておきたいってなると思うけど、そういうことをするための概念かな。
Stackを細かく分けることでメンテナンスはしやすくなる気はする。(この辺はバランスだと思うけど)
あとは単純に「環境ごとに基盤をわけておきたい」というときに、Appをわけることで実現する、という使い方もしそう。

どんな感じで紐づけるかは公式に書いてあるように、以下みたいな感じで紐づけていく。

const app = new App();
new MyFirstStack(app, 'hello-cdk');

このAppの定義を書くファイルと、Stackをクラスとして定義するファイルは分けてもいいし、同一ファイルに書いてもいい。
規模によって使い分ける感じかな。

3. 実際にやってみたときのメモ

3-1. 手っ取り早く

なにはともあれ、触ってみないとわからない、ということでチュートリアルをやるといい。

catalog.workshops.aws

ありがたいことにTypescriptの基本や、環境構築についてもひととおりサポートしてくれるので、初めにさわるならこのチュートリアルで事足りる。
環境についてはCloud9を使うものと、ローカルでセットアップしていく2つの方法が提示されているので好きなほうで取り組めばよし。

3-2. 実際のざっくりとした開発の流れ

チュートリアルを終えれば、CDKがどんなもので、Typescriptでの定義をどうやっていくのか、ということについてはおおよそ掴んだ状態になると思う。
実際の開発でもやることは大体チュートリアルでやった流れと似ている。

どのリソースを定義しようかな、する必要があるかな  
↓  
CDKライブラリページで該当リソースのモジュールを探し、さらにConstructクラスを探す  
たまに意外なところにあったりするから関連してそうなものは一通り探すといい  
Vpcとか、「aws_vpc」にありそうなのに「aws_ec2」にまとめられてたり。
(自分はCtrl + Fでページ内検索して探したりしていた)  
↓  
あとは書かれている説明をみながら必要なパラメーターとかを定義していく  
Typescriptで書いていくときは型がやっぱり肝になってくるから、定義するパラメーターの型は意識して書くといい。  

基本的な流れはこんな感じだった気がする。
次の記事で細かい部分のテクニック?というか「そういう風にも書けるのか」みたいなところをメモで残していこうかな。

ちょっと雑になってしまった部分もあると思いますが、初めての投稿ということで少しずつ改善していこうと思います。
ありがとうございました。