AWS CDKを導入してみた記録

## 目次
- [AWS CDK とは](#aws-cdk-とは)
- [AWS CDKを導入してみよう！](#aws-cdkを-導入してみよう)
   - [1. AWS アカウントと管理者ユーザーを作成する](#1-aws-アカウントと管理者ユーザーを作成する)
  - [2.作成したアカウントのアクセス権を設定する](#2作成したアカウントのアクセス権を設定する)
  - [3. AWS CLIをインストールする](#3-aws-cliをインストールする)
  - [4. Node.jsとAWS CDKで使用する言語をインストールする](#4-nodejsとaws-cdkで使用する言語をインストールする)
  - [5. AWS CDK CLIをインストールする](#5-aws-cdk-cliをインストールする)
  - [6. AWS CDK CLIのためのセキュリティクレデンシャルを設定する](#6-aws-cdk-cliのためのセキュリティクレデンシャルを設定する)
  - [7. AWS 環境をブートストラップする](#7-aws-環境をブートストラップする)
  - [8.(オプション)-拡張のAWS-CDK-toolsをインストールする](#8オプション-拡張のaws-cdk-toolsをインストールする)
  - [9. CDK でAWS サービスを作成する](#9-cdk-でaws-サービスを作成する)

## AWS CDK とは
IaCをAWSで実現するためのフレームワークである。
Infrastructure as Code (IaC) とは、手動のプロセスや設定の代わりにコードを使用してコンピューティングインフラストラクチャをプロビジョニングおよびサポートできることをいう。→ コードで管理できるので、Gitに残せる！


- メリット
    - 環境を簡単に複製できる
        - 開発環境、ステージング環境、本番環境など、環境ごとに同じインフラを作成するときに、IaCを使うことで、一つの環境で作成した設定を使いまわして他の環境に作成することが容易にできる。
    - 設定エラーの低減に貢献する
        - 設定内容を更新したときに、手動でAWS環境を作成している場合は、他の環境の設定も手動で変える必要が出てくるので、ヒューマンエラーが起こりうるが、IaCを利用することで複数の環境に同じ設定を反映しやすい。
- デメリット
    - 一つしか環境を作らない場合、逆に手間になるおそれがある
    - 対応していないAWSのサービスもある

余談: AWSでIaCの手法としてAWS CloudFormationもある。AWS CloudFormationの場合はJSONやYAML形式での記述になる。そのためAWS CloudFormationはAWS初心者やデータ記述言語に不慣れな開発者にとっては、敷居が高い可能性がある。

<details>
<summary> 参考ソース元 </summary>

- AWS CDK について
>The AWS Cloud Development Kit (AWS CDK) is an open-source software 
 development framework for defining cloud infrastructure in code and 
 provisioning it through AWS CloudFormation.
 The AWS CDK consists of two primary parts:
 AWS CDK Construct Library – A collection of pre-written modular and reusable pieces of code, called constructs, that you can use, modify, and integrate to develop your infrastructure quickly. The goal of the AWS CDK Construct Library is to reduce the complexity required to define and integrate AWS services together when building applications on AWS.
AWS CDK Toolkit – A command line tool for interacting with CDK apps. Use the AWS CDK Toolkit to create, manage, and deploy your AWS CDK projects.

公式より参考: [What is the AWS CDK?](https://docs.aws.amazon.com/cdk/v2/guide/home.html)

- IaCについて

> Infrastructure as Code (IaC) とは何ですか?
Infrastructure as Code (IaC) とは、手動のプロセスや設定の代わりにコードを使用してコンピューティングインフラストラクチャをプロビジョニングおよびサポートできることをいいます。どのようなアプリケーション環境であっても、オペレーティングシステム、データベース接続、ストレージなどの多くのインフラストラクチャコンポーネントが必要です。デベロッパーは、アプリケーションを開発、テスト、デプロイするためのインフラストラクチャを定期的に設定、更新、メンテナンスする必要があります。 
手動のインフラストラクチャ管理は時間がかかり、エラーも発生しやすくなります。このことは、アプリケーションを大規模に管理する場合に特に当てはまります。Infrastructure as Code (IaC) により、その状態に至るまでのステップをすべて含めなくても、インフラストラクチャの望ましい状態を定義できます。インフラストラクチャ管理が自動化されるため、デベロッパーは環境の管理ではなく、アプリケーションの構築と改善に集中できます。組織は Infrastructure as Code (IaC) として使用して、コストを管理し、リスクを軽減するとともに、新しいビジネスチャンスに迅速に対応します。

公式より参考: [Infrastructure as Code (IaC) とは何ですか?
](https://aws.amazon.com/jp/what-is/iac/)

</details>

## AWS CDKを 導入してみよう！
[公式の手順](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_bootstrap)を参考に以下の手順で実際に導入する。

1. AWS アカウントと管理者ユーザーを作成する
1. 作成したアカウントのアクセス権を設定する
1. AWS CLIをインストールする
1. Node.jsとAWS CDKで使用する言語をインストールする
1. AWS CDK CLIをインストールする
1. AWS CDK CLIのためのセキュリティ認証情報を設定する
1. AWS 環境をブートストラップする
1. (オプション) 拡張のAWS CDK toolsをインストールする
1. CDK でAWS サービスを作成する

## 1. AWS アカウントと管理者ユーザーを作成する
AWSのサービスを使用するために、AWS アカウント(rootユーザ)を作成する。
その後、rootアカウントは乗っ取られると危険なので、操作制限のある管理者ユーザを作成し、以後管理者ユーザーで開発を行う。

参照: [なぜAWSのrootユーザの利用が危険なのか？〜アカウント作成後の運用方法についてまとめてみた〜](https://dev.classmethod.jp/articles/rootuser-risk/)

## 2.作成したアカウントのアクセス権を設定する
作成した管理者IAMにポリシー`AdministratorAccess`を割り振る。
`AdministratorAccess`が設定されることでAWS CDK CLI でアクセス可能になる

## 3. AWS CLIをインストールする
[AWS CLIの最新バージョンのインストールまたは更新](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions)を参考にインストールする。

## 4. Node.jsとAWS CDKで使用する言語をインストールする
AWSを任意の言語(Typescript, Javascript, Python, Java, C#, Go)で使用するとしても、npmでaws cdkをインストールするので、まず**Node.js**必要。

- Node.jsのインストール先は[コチラ](https://nodejs.org/en/download/package-manager)

**その後**、使用したい言語をインストールする。
- Typescript の場合
  ```zsh
  npm -g install typescript
  ```

## 5. AWS CDK CLIをインストールする
ついにAWS CDK を利用するためのパッケージ `aws-cdk`をインストールする
```zsh
npm i -g aws-cdk
```
インストールが成功したかどうかの確認で以下のコマンドを実行する
```zsh
cdk --version
```

もしインストール中(`npm i -g aws-cdk`)にエラーが生じた場合、一度以下のコマンドでアンインストールし、再度インストールする
```zsh
npm uninstall -g aws-cdk
```

## 6. AWS CDK CLIのためのセキュリティクレデンシャルを設定する
セキュリティクレデンシャルをCDK CLIに設定することでCDK CLIからAWSのリソースにアクセスできるようになる。故に、設定しないと何もAWSのリソースに干渉できないので、設定必須。

参考: 
- [AWS security credentials](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html) 
- [How to configure security credentials](https://docs.aws.amazon.com/cdk/v2/guide/configure-access.html#configure-access-how)

<details><summary>IAM Identity Center SSOで認証する場合 (動作確認済み)</summary>

1. IAM Identity CenterでAWS CDKを使用するためのユーザを作成する
1. 1.で作成したユーザを管理者アクセス権(`AdministratorAccess`)を割り当てたグループに入れる
1. プロファイルを作成する
    - `aws configure sso`
    - `aws sso login XXX`でログイン可能になる(XXXには作成したプロファイルのSSO session nameをいれる)
</details>

<details><summary>IAM roleで認証する場合 (← 動作未確認)</summary>

(注意: 各コマンドのset以降は任意で設定してください)
```zsh
aws configure set role_arn arn:aws:iam::123456789012:role/defaultrole
```

```zsh
aws configure set source_profile default
```

```zsh
aws configure set role_session_name session_user1
```

```zsh
aws configure set region ap-northeast-1
```

```zsh
$ aws configure set output json
```

</details>

## 7. AWS 環境をブートストラップする
CDK stack をデプロイする前にデプロイ環境をブートストラップする必要がある。
以下の例のコマンドを参照に、ブートストラップする。
対象のIAM用にアクセスキーを作成していなかったため、AWSのサービスである`Cloud Shell`で以下を実行した。

```zsh
cdk bootstrap aws://ACCOUNT-NUMBER/REGION --profile 設定を追記したアカウントのプロファイル
```

## 8.(オプション) 拡張のAWS CDK toolsをインストールする
Visual Studio CodeでAWS CDKの開発を効率よく行えるようにするための[拡張機能(`AWS Toolkit for Visual Studio Code`)](vscode:extension/amazonwebservices.aws-toolkit-vscode)をインストールする。この拡張機能を使用するための準備として、以下のパッケージも合わせてインストールする。
- 使用する言語のSDK
- AWS SAM CLI
- Docker
- 使用する言語のパッケージマネージャー


参照: [Installing the AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/setup-toolkit.html#setup-prereq-opt)

## 9. CDK でAWS サービスを作成する
[公式のチュートリアル](https://docs.aws.amazon.com/cdk/v2/guide/hello_world.html)を参照に実行する。