神様、僕は気づいてしまった CDKの素晴らしさに...

## :beginner: 1.対象購読者
- cloudformationは使ったことあるけどCDKは使ったことない人
- CDKってなんか敷居高いからちょっと…と思っている方

## :sun_with_face: 2.きっかけ
  とあるセミナーで『**cloudfomationはオワコン!!今からはCDKの時代!!**』という話を聞きました。
  「そんな馬鹿な:interrobang:私はcloudfomationが神だと信じているCDKなんて絶対に認めない:japanese_goblin:」
  と思いつつも…まぁ軽く使ってから批判はすべきかなと思いCDKをちょっとだけやってみることにしました。

## :writing_hand: 3.やったこと
・VPCの作成
・パブリックサブネットの作成

## :wrench: 4.準備編
:::note warn
前提
最新のnodeがインストール/asw configureが設定されている状態
:::

### cdkのインストール
```
　npm install -g aws-cdk
 ```
ムムム...:cold_sweat:cloudformationはエディタさえあれば何も要らんかったのにな...
さてはCDK面倒くさい系じゃないのか？まぁ文句言わずに最後までやってみるか… 
正常にインストールされたか見てみよう:eyes:
 ```
　cdk --version
　2.147.2 (build f4b0897)
 ```
ふむ。よさそうだ。  

## :wrench: 5.プロジェクト作成
ん？プロジェクト…だと!? cloudformationではそんなものはなかったぞ？:kissing:
アプリケーション開発じゃあるまいしそんな大げさな…:worried:
と思いながらも手順通りにやってみる…  


### フォルダを作ってフォルダ移動  
 ```
mkdir cdk_sample
cd cdk_sample
  ```


### プロジェクト作成
 ```
cdk init app --language python
 ```
 
language というオプションで言語を指定するらしい。
cloudformationでいうところの**json形式かyml形式かみたいなもの**と勝手に理解する…
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/c520645a-aaaa-4e0b-5190-766b4f661ecc.png)
ほうほう...たらたら流れ出したぞ...All done と出てるから成功したらしい。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/21666857-5067-4645-3f6c-df99c617cdbf.png)
 お、プロジェクトができてる出来てる！・・・で、どころ触ればいいんだろうか？

 
 ## :muscle: 5.CDK触ってみる！
 **cdk_sample_stack.py**　というファイルができてるのでこれを触っていくらしい。
（ファイル名はフォルダ名＋_stack.pyで作られているようだ...）
 
どこかのqiita記事から参考にしたコードを張り付けてみる。ペタッとな...
```ruby
 from aws_cdk import (
    # Duration,
    Stack,
    aws_ec2 as ec2,
)
from constructs import Construct

class CdkExampleStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # Create VPC
        vpc = ec2.Vpc(
            self,
            id="vpc",
            cidr="10.2.0.0/16",
            nat_gateways=0, # NatGatewayを作成しない指定
            # Create Private Subnet
            subnet_configuration=[
                ec2.SubnetConfiguration(
                    name="subnet",
                    subnet_type=ec2.SubnetType.PUBLIC,
                    cidr_mask=24
                )
            ]
        )
 ```
ん～よくわからん…リファレンスを見てみよう!!!

https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_ec2/Vpc.html
…ムムム:unamused:英語のリファレンスは体が拒否反応を起こしてしまうのだが…
google翻訳機能を駆使しつつ頑張って読み解こう...
 
```
aws_ec2 as ec2,
```
まずはimportで使用するサービスを定義する感じか…
cloudformationでいうところのType的なものか…
```
id="vpc"
```
VPCをcreateする部分vpcnameをidに指定して…
```
cidr="10.2.0.0/16",
```
cidrでipの範囲を指定して...
```
nat_gateways=0,
```
natgatewayの個数を設定して…

**ん？**


**んんっ！？**

**んんんっ！？？**:astonished:

ここに数量入れるだけでnatgateway作ってくれるのか？えぐっ！えぐいぞ！:japanese_ogre:
cloudformationならnatgateway作成するだけで**数十行は書かないといけない**のに1行!?
 ```ruby
           # Create Private Subnet
           subnet_configuration=[
               ec2.SubnetConfiguration(
                   name="subnet",
                   subnet_type=ec2.SubnetType.PUBLIC,
                   cidr_mask=24
               )
           ]
```
次はサブネットを配列で宣言するのか…
nameとcidrブロックと,subnet_typeと…ん？**subnet_type**ってなんだ:eye:？
リファレンスを見たところ…
**ec2.SubnetType.PUBLIC**と**ec2.SubnetType.PRIVATE_WITH_EGRESS**
のいづれかを指定することで、任意のサブネットができるらしい！！:dancer::dancer::dancer:
cloudformationではパブリックサブネットを作るには

1.IGWを作成して
2.VPCにアタッチして
3.ルートテーブルを作って
4.IGWへルーティング

という作業が必要なのだが、
この1行でそこまでしてくれるのか!?!?神掛かっている!!!:angel_tone2:
 
 
 
# :white_check_mark: 6.チェック機能
いざ！実行！…っとその前にチェック機能が備わっているらしいので試してみる
```
 cdk diff
 ```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/da9fc840-f23d-19c6-b0ab-5b5e4d26b6d4.png)

フムフム…便利だな。cfnでいうところの変更セット的なものだな...
 
# :airplane: 7.いざ！実行！！
 ```
cdk deploy

Do you wish to deploy these changes (y/n)?
 ```
 変更していいですかって？OK牧場:cow:の 「y」 を入力して Enter!
うぉ～～！なんかできたっぽい！
マネージメントコンソールで見たら見事に実際の環境できてるーーーー:clap::clap:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/2155359a-9ba5-ce7f-0084-1f61495c0cd1.png)
そして内部ではやはりcloudformationが動いていたようだ...ちなみにテンプレートの行数は700行!!これがCDKだと30行で書けるのか！！くぅ～しびれるぜぃ:confounded::zap:

# :ramen: 8.〆
 cloudformationで数十行～100行超の量を**1行**で済ませてしまうCDK!!!
 悪魔的:imp:な神効率:angel_tone1:今までcloudformationでやっていたことがあほらしく感じる程の効率。
 
ただ、cloudformation知らずにCDKから入ってしまうと、CDKいい感じやってくれすぎるので**内部で何が起きてるか:black_medium_square:ブラックボックス:black_medium_square:になりすぎ**て問題発生時に対処できないというデメリットは発生しそうな気もする…
 
やってみた感想はcloudformationのある程度の知識がある上で、
CDKを扱えるようになると無双状態かなと思いました！CDK王に俺はなる:muscle: