AWS Cloud Development Kit(CDK)

# AWS Cloud Development Kit(CDK)

https://d1.awsstatic.com/webinars/jp/pdf/services/20200303_BlackBelt_CDK.pdf

## AWSの環境を構築する方法

  • マネジメントコンソール
  • スクリプト(SDK, CLI)
    • 操作手順の定義が可能
    • 失敗時の対応が必要
  • プロビジョニングツール(CloudFormation など)
    • あるべき状態を定義
    • 抽象化はどうする?
  • Document Object Models(DOMs)
    • あるべき状態の定義がコードで可能
      • CFnテンプレートを生成し、デプロイする
      • 抽象化については組み込まれていない
  • AWS CDK
    • あるべき状態の定義がコードで可能+抽象化もできる
    • CFnテンプレートを生成

 

## AWS CDKとは

  • AWSの環境を一般のプログラミング言語で記述できるツールキット
    • ソースコードからCloudFormation テンプレートを生成
    • AWSのベストプラクティスが定義されたライブラリ(Construct)を利用することができる
  • 特徴
    • プログラミング言語で記述できる
    • テストコードが記述できる
    • 複数スタック間の依存関係が記述できる
    • 生成されるのはCFnテンプレート -> これを利用してデプロイする
    • TypeScript, JavaScript, Python, Java, C#

 

## 利用方法

  1. `nom install -g aws-cdk` する
  2. `cdk init app —language=typescript`

 

## CDK のコアコンセプト

  • App
    • ClounFormation テンプレートの生成とデプロイに利用する最上位要素
    • 複数のStack の依存関係を定義
  • Stack
    • CloudFormation Stack に該当
    • デプロイ可能な最小単位
  • Construct
    • Stack に作成されるAWSリソース
    • 再利用可能なコンポーネント
    • Cloudコンポーネントを表現。単一のリソースを表現したり、複数のAWS CDKリソースをまたがるコンポーネントを表現することも可能
    • 作成したConstruct をパッケージとして配布することが可能
    • AWS Constructs Library
      • AWS CDKが標準で提供するConstruct ライブラリ
      • High-level constructs(L2)
      • Low-level constructs(L1)
        • CFnリソースおよびプロパティと1:1で対応
      • Patterns
        • 複数のリソースを含む一般的な構成パターンを事前に定義したもの
  • Environment
    • デプロイ先のアカウントとリージョン
  • Context
    • CDKを実行する際の各種パラメータをKey - Value 型で定義・参照する仕組み
  • SSM ParameterStore / SecretManager
    • CFnテンプレート生成時(cuk synth) またはデプロイ時に値を取得する

 

## Tips

  • アクセス許可設定
    • Principals
    • grantXxxx でアクセス対象へのアクセス許可を与える
  • 複数スタックの管理
    • スタック間でConstruct を参照できる
    • 依存関係も定義できる
  • CDKのテスト(TypeScript のみ DeveloperPreview段階)
    • Snapshot tests (golden master tests)
    • Fine-grained assertions
      • 作成したテンプレートの一部が特定のプロパティを持っているかをテスト
    • Validation tests

 

## Deep Dive

  • CDK TypeScript で実装されていて、jsii を利用して他の言語からアクセスできるようになっている
  • CDK RFCs
  • FeatureFlags
  • CDK Node.js Lamdda Construct
    • Lambda CDK のコードを全てTypeScript で一括開発&デプロイ
  • Former2 を利用することで既存環境からCFn テンプレートやCDKコードを生成できる

 

## 雑感

最近同僚が「CDKはいいぞ」と行ってきたので概要を知るために読んでみました。

プログラミング言語としてあり、その言語のテストフレームワークにのってテストができるのは嬉しいですね。使うとしたらTypeScriptになるかな(多分会社ではPythonを使うことになりそうだけど)。

また、再利用の話は、今日参加した「Infra Study Meetup #1」でも話題になっていたIaCの抽象化や共通化をしすぎると辛くなってくるという話に対してのアンサーっぽくも見えてきました。実際に使ってみないとなんとも言えないので、休日中に触ってみよう。

 

(追記)

CDKを触ってみました。

https://github.com/athagi/hello-cdk

forkwell.connpass.com

yml をゴリゴリ書いていくのも嫌いではないんですけどね。