AWS CDK のキホン

# AWS CDK  とは

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

AWS CDK は、2 つの主要な部分で構成されています。

■AWS CDK コンストラクト ライブラリ
コンストラクトと呼ばれる、事前に記述されたモジュール式で再利用可能なコードのコレクション。これを使用して、変更し、統合することで、インフラストラクチャを迅速に開発できます。AWS CDK コンストラクト ライブラリの目的は、AWS でアプリケーションを構築するときに、AWS サービスの定義と統合に必要な複雑さを軽減することです。

■AWS CDK Command Line Interface (AWS CDK CLI)
CDK アプリを操作するためのコマンドライン ツールです。CDK CLI を使用して、AWS CDK プロジェクトを作成、管理、およびデプロイします。

※公式から抜粋（翻訳しました）

なんとなく分かるようで分からない。。

## 個人的な理解
Webでぽちぽち設定するよりも、コードで書いて設定する方が楽で管理もしやすいだろ

ということかと。つまりIaC化の一種です。

※IaC（Infrastructure as Code）：従来手作業でおこなわれていたサーバーやネットワーク機器などの設定、管理をコード化し、自動化する技術のこと

![cdk-iac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3854484/4f09c336-1156-746e-535a-6088bf499db8.png)

## 実際に使ってみる

### 概要
今回は、IAM Roleの作成を対象とします。(緑四角の部分)
AWSのサービスを使う場合は、各サービスへ権限を設定する必要があります。
その権限のグループをロール（赤帽子）、権限単体をポリシー（緑の鍵）と言います。

![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3854484/7f9803cf-2cb7-2c56-da2b-82f078d760c7.png)

- IAMロール(Role)
「AWSのリソースに付与するもの」で、実態はIAMポリシーをグルーピングしたもの
- IAMポリシー(policy)
「AWSリソースにアクセスするための権限設定」で、AWSが最初から用意してくれている

[参考]https://qiita.com/montama/items/90bb8a3973d101be4690

### 手動の場合
1. AWSコンソールからIAMの画面を開き、ロールの作成をクリック
AWSアカウントにロールを作成する
![make-iam-role-00.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3854484/a212c5e4-6cbc-69ee-52e5-3c37120d5563.png)

2. AWSLambdaFullAccessを検索して設定
![make-iam-role-01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3854484/cca64e39-b1f6-b201-28bb-27f7733941ce.png)

3. ロール名「manual-lambda-full-access」を設定してロールを作成
![make-iam-role-02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3854484/5e675c02-0bdb-3018-550b-b1af87a476d3.png)
![make-iam-role-03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3854484/0f56af0e-75f2-b2a1-8986-e9e19754ada3.png)

4. ロールが作成されていることを確認
![make-iam-role-04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3854484/6ee9914d-e59d-5d4a-9683-c01a678a234e.png)

このように画面遷移に合わせて手動で設定することができます。

### CDKを用いた場合
前提として、AWS CLIというツールをインストールして設定済

1. ディレクトリの作成とcdkのインストール
    ```
    mkdir make-iam-role && cd $_
    npx -y cdk@latest init --language typescript --generate-only
    npm install -D @types/source-map-support
    npm install
    ```
    
    以下のコマンドを実行
    ```
    npx cdk list
    # "フォルダ名"Stackと表示されればOK
    ```
    
    cdk用のフォルダが作成されている
    <br>

2. ~/bin/xxxx.tsを編集する

    今回は環境変数でデプロイ先を指定します。（アカウントとリージョンを指定）
    
    ```
    #!/usr/bin/env node
    import 'source-map-support/register';
    import * as cdk from 'aws-cdk-lib';
    import { MakeIamRoleStack } from '../lib/make-iam-role-stack';
    
    const app = new cdk.App();
    new MakeIamRoleStack(app, 'MakeIamRoleStack', {
      /* Uncomment the next line to specialize this stack for the AWS Account
       * and Region that are implied by the current CLI configuration. */
      env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION },
      /*↑をコメントアウト*/
    
      /* Uncomment the next line if you know exactly what Account and Region you
       * want to deploy the stack to. */
      // env: { account: '123456789012', region: 'us-east-1' },
      /*↑こちらは直接指定方式*/
    });
    ```
    <br>
    
3. ~/lib/xxxx.tsを編集する
    以下を記載する。内容についてはまた別の機会に。。

    ```
    import * as cdk from 'aws-cdk-lib';
    import { Construct } from 'constructs';
    import * as iam from 'aws-cdk-lib/aws-iam';
    
    export class MakeIamRoleStack extends cdk.Stack {
      constructor(scope: Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
    
        new iam.Role(this, 'MyCdkProjectStack-cdk-lambda-full-access', {
          assumedBy: new iam.AccountPrincipal(this.account),
          managedPolicies: [
            iam.ManagedPolicy.fromAwsManagedPolicyName('AWSLambda_FullAccess')
          ],
          roleName: 'cdk-lambda-full-access'
        })
      }
    }
    ```
    <br>

4. デプロイ
    AWSに反映させるデプロイは以下のコマンドを実行する。
    ```
    npx cdk deploy
    ```

    エラーがでなければ、変更点の内容確認が表示される。問題なければｙを入力する。
    ![make-iam-role-05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3854484/a690100f-46cc-2f07-2515-46a64ca6586a.png)


## ロール確認
IAMにてロールを確認すると手動と同様のものが作成できている
![make-iam-role-06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3854484/759d5441-5917-de69-c22b-4c98dbf6398f.png)

最後に、cdkはdestoryコマンドにて削除することも可能

```
npx cdk destroy
```

## 参考
この記事は以下の情報を参考にしています。

- [AWS CDK 超入門！―Hello, world 前編―](https://zenn.dev/galapagos/articles/aws-cdk-intro-hello-world-former?redirected=1)
- [AWS CDK 超入門！―Hello, world 後編―](https://zenn.dev/galapagos/articles/aws-cdk-intro-hello-world-latter?redirected=1)