AWS CDKで快適なクラウド開発

# はじめに

このスライドはどこかでLT発表するためにつくりました。今回は[AWS CDK](https://aws.amazon.com/jp/cdk/)を使うメリットについて改めてお話します。

---

# 自己紹介

- 名前
  - @ufoo68
- 出身
  - 滋賀県草津市
- 最近やってること
  - OSS活動
  - [スポーツIoTLT](https://www.facebook.com/groups/1180573312126219/)の主催
- 私のAWS経験
  - [SAA](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)の取得
  - AWSを用いる案件
  - [re:invent](http://reinvent.awseventsjapan.com/)の参加

---

# AWS CDKとはなにか？

**AWS CDK**とは、プログラミング言語を使って**AWSのクラウド環境をプロビジョニングする**ためのオープンソースのフレームワークである。
AWS CDKではソースコードから**[CloudFormation](https://aws.amazon.com/jp/cloudformation/)**を作成してリソースのクラウドへのデプロイを行う。

---

# プロビジョニングとは？

AWSの**インフラ環境を構築する**こと。通常のインフラ構築は[マネジメントコンソール](https://aws.amazon.com/jp/console/)を使ってGUI上で行うが、**CloudFormation**と**AWS CDK**を用いる場合は**テンプレートファイル（yaml, json, プロビジョニング言語）上**にリソースを定義して行う。

---

# マネジメントコンソールを使う問題点

例えば一度構築したAWSのインフラ環境の再現手順を記録したい場合、以下の２つの手段が思いつく

1. コンソールで行った操作手順を記録する
2. [AWS CLI](https://aws.amazon.com/jp/cli/)で同様の環境構築をするためのシェルスクリプトを書く

直感的に`1.`も`2.`の方法もやりたくはない。。。

---

# CloudFormationを書くという方法

---

## 記述例

`json`もしくは`yml`の形式で定義ファイルを記述する。以下は`DynamoDB`の例。

```json:dynamodb.template
"myDynamoDBTable" : {
      "Type" : "AWS::DynamoDB::Table",
      "Properties" : {
        "AttributeDefinitions": [ { 
          "AttributeName" : {"Ref" : "HashKeyElementName"},
          "AttributeType" : {"Ref" : "HashKeyElementType"}
        } ],
        "KeySchema": [
          { "AttributeName": {"Ref" : "HashKeyElementName"}, "KeyType": "HASH" }
        ],
        "ProvisionedThroughput" : {
          "ReadCapacityUnits" : {"Ref" : "ReadCapacityUnits"},
          "WriteCapacityUnits" : {"Ref" : "WriteCapacityUnits"}
        }                
     }
}
```

定義したリソースをデプロイすることで、AWSのクラウド上に実際にリソースを構築することができる。

---

## CloudFormationの問題点

- テンプレートファイルの記法を覚える必要がある
  - それなりに独特のルールがあるので一種の言語に近い
- 構文エラーチェックがやりにくい
  - 一応構文チェックしてくれるツールはある
- 冗長な構文が増える
  - 共通化したいなら自分でシェルスクリプト書くしかない

---

# AWS CDKを使うという方法

---

## プログラミング言語

以下の言語が選択できる

- [TypeScript](https://docs.aws.amazon.com/cdk/api/latest/typescript/api/index.html)
- [Python](https://docs.aws.amazon.com/cdk/api/latest/python/index.html)
- [.NET](https://docs.aws.amazon.com/cdk/api/latest/dotnet/api/index.html)
- [Java](https://docs.aws.amazon.com/cdk/api/latest/java/index.html)

---

## 記述例

TypeScriptで`lambda`+`API Gateway`+`DynamoDB`の環境を記述した例

```typescript
import * as cdk from '@aws-cdk/core'
import * as lambda from '@aws-cdk/aws-lambda'
import * as apigateway from '@aws-cdk/aws-apigateway'
import * as dynamodb from '@aws-cdk/aws-dynamodb'

export class CdkStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    const table = new dynamodb.Table(this, 'Table', {
      partitionKey: { name: 'key', type: dynamodb.AttributeType.STRING }
    })

    const handler = new lambda.Function(this, 'Handler', {
      runtime: lambda.Runtime.NODEJS_10_X,
      code: lambda.Code.asset('lambda'),
      handler: 'index.handler',
      environment: {
        TABLE_NAME: table.tableName
      }
    })

    table.grantReadWriteData(handler)

    new apigawteway.LambdaRestApi(this, 'Endpoint', {
      handler
    })

  }
}
```

AWS CDKだとシンプルにわかりやすくテンプレートが作成できる。

---

## AWS CDKのいいところ

- 使い慣れた構文で書ける
- 共通化ができる
- 構文チェックがやりやすい

---

## AWS CDKの問題点

- CloudFormationでできないことは同様にできない
- 出て間もないツールなので仕様のアップデートが頻繁に行われる
- 文献が少ない

---

## 詳しい情報

- 公式
  - [ドキュメント](https://docs.aws.amazon.com/cdk/api/latest/index.html)
  - [ワークショップ](https://cdkworkshop.com/)
- クラスメソッドの記事
  - [CDK標準の3種類のConstructを使って、AWSリソースをデプロイしてみた](https://dev.classmethod.jp/cloud/aws/aws-cdk-construct-explanation/)
  - [S3へローカルファイルをデプロイしてWebサイトを公開する](https://dev.classmethod.jp/cloud/aws-cdk-s3-deploy/)
  - [LINEアプリのサンプルをCDKで書き直して見て、その凄さを実感しました](https://dev.classmethod.jp/server-side/serverless/aws-cdk-line-sample/)

---

# さいごに宣伝

---

## CDKのためにつくったnpmパッケージ

- [cdk-lambda-api](https://www.npmjs.com/package/cdk-lambda-api)
  - `Lmbda`+`API Gateway`のリソースをシンプルに構築できる
- [data-pipeline-d2s-cdk](https://www.npmjs.com/package/data-pipeline-d2s-cdk)
  - `DynamoDB`から`S3`へのバックアップ行う`Data Pipeline`のリソース構築をシンプルにできる

---

## AWS CDK関係で書いた記事

- [CDKでSlack botを作ろう](https://qiita.com/ufoo68/items/884b9767deb35f64b882)
- [AWS CDK+React+TypeScriptでLIFF開発](https://qiita.com/ufoo68/items/5861f31456a128e92b77)
- [自分のためのAlexaテンプレートをAWS CDKとGitHub Actionsを使って公開した](https://qiita.com/ufoo68/items/925043c5ab95b546a188)
- [CDKで「買い物リスト」LINE botをつくる](https://qiita.com/ufoo68/items/4d79c7e97d96338a771c)

---

# みんなも始めようAWS CDK！