CDKでAWS 環境の作成 VPCとRDS,S3編

## 概要

CDKを使ってAWS環境を作成するときの方法についてまとめていこうと思います。
今回は作成するプロジェクトを分割しての作成例になります。
[前回](https://qiita.com/dmikita/items/1b277bdafdccc9b572b5)ではまとめて作成していたので分割してみました。


## 準備

* 前回の転記部分もあります。詳細は前回を参照
* [AWS Summit](https://resources.awscloud.com/aws-summit-online-japan-2020-on-demand-self-paced-hands-on-85234)のCDKハンズオンを見て準備をしましょう。
* こちらでも簡単に準備手順を
    * AWS CLIのインストール 
    * AWS Configureの設定
        * アカウントはCDKで作成するリソースにアクセスできる権限を付与しましょう。(お試しでやる場合はAdministrator権限の方がいいかもしれません)
    * node.jsのインストール
    * `npm install -g aws-cdk` のコマンドでcdkをインストール

### プロジェクトの準備

* TypeScriptでの例となります。
1. 空のディレクトリを用意する。
1. ディレクトリに移動して以下のコマンドを実行する
    * `cdk init --language typescript`
1. 初期ディレクトリなどが作成されるのを待ちます。


## ライブラリのインストール
* 必要に応じて npm コマンドでライブラリをインストールします。以下のようなコマンドです。
    * `npm install @aws-cdk/aws-ecs`
    * `npm install @aws-cdk/aws-batch`
    * `npm install @aws-cdk/aws-ec2`
    * `npm install @aws-cdk/aws-iam`
    * `npm install @aws-cdk/aws-ecr`
* __注意点__
    * ライブラリのバージョンが一致していないとコンパイルエラーやdeploy時にエラーになるので `package.json` のバージョンを合わせて、  `package-lock.json` と `node_modules` 配下を削除して `npm install` を実施しましょう。

## コンパイルの準備
* ライブラリインストール後にプロジェクトを作成したディレクトリに移動して以下のコマンドを実行します。windowsの場合はライブラリのインストール時には停止する必要があるので注意を
    * `npm run watch`

## 各モジュールの説明
* モジュールは[github](https://github.com/dmikita-sss/cdk-sample)で公開しています。
* /vpc
    * VPCの設定をまとめています。
    * こちらでVPC周りを先に作成して他の部分を作成していく流れになっています。
    * こちらのデプロイを先に実施しないとRDSの方で使用するVPCIDがとれずに失敗します。
* /rds-s3
    * RDS,S3の設定をまとめています。
    * RDS用S3用それぞれソースを分けているため変更があった時も修正するべきソースをわかりやすいかなと思います。
    * `./bin/rds-s3.ts` の方で以下のように設定することで複数のソースの定義を使えるようにしています。対象が増えた場合はさらに追記していきます。

        ```typescript
            import { RdsS3Stack } from '../lib/rds-s3-stack';
            import { CdkRdsStack } from '../lib/cdk-rds-stack';
            import { CdkS3Stack } from '../lib/cdk-s3-stack';
            import { env } from 'process';

            const app = new cdk.App();

            new RdsS3Stack(app,'RdsS3Stack',{
                env: {
                    region: 'ap-northeast-1',
                    account: env.AWS_ACCOUNT,
            }});
            new CdkRdsStack(app,'CdkRdsStack',{
                env: {
                    region: 'ap-northeast-1',
                    account: env.AWS_ACCOUNT,
            }});
            new CdkS3Stack(app,'CdkS3Stack',{
                env: {
                    region: 'ap-northeast-1',
                    account: env.AWS_ACCOUNT,
            }});
        ```
    * デプロイするときはStack名を指定して実施します。ワイルドカードの指定も可能です。
        * `cdk deploy * ` または `cdk deploy CdkRdsStack` の用に指定します。

### CDKの定義

* VPC
    * 今回はpublicとprivateのサブネット２種類、S3用のエンドポイントを作成する形にしています。
    * VPCのIDをパラメータストアに格納して他のモジュールで参照するときに使えるようにしています。
* S3
    * Bucketの作成とライフサイクルで30日でオブジェクトを削除するようにしています。
        * prefix で削除対象を絞っています。

    ```typescript
        const sdfDataBucket = new s3.Bucket(this, 's3-bucket-data-1', {
        bucketName: `s3-bucket-data-1-${this.region}-${this.account}`,
        blockPublicAccess:s3.BlockPublicAccess.BLOCK_ALL,
        lifecycleRules:[
            {
            expiration:cdk.Duration.days(30),
            prefix:'data',
            id:'delete for data'
            }

        ]
        });
    ```
    * 設定した結果はコンソールから確認できます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/06ccb6c6-ebae-0012-5240-9f877f28a39c.png)

* RDS
    * セキュリティグループの設定をこちらで実施しています。
    * master のユーザID,パスワードはパラメータストアに設定しています。